11

Uygulamamda Facebook oturumunu entegre ediyorum. Okuma izinlerini ancak Facebook SDK'sından yayınlama izinlerini nasıl alabiliyorum. kullanıcı Ben access_token elde edebilmek olduğum izni varsaFacebook'dan okuma izni aldıktan sonra publish_action iznini alın

@Override 
public void onClick(View v) { 
Session currentSession = Session.getActiveSession(); 
if (currentSession == null 
    || currentSession.getState().isClosed()) { 
    Session session = new Session.Builder(context).build(); 
    Session.setActiveSession(session); 
    currentSession = session; 
} 

if (currentSession.isOpened()) { 
    // Do whatever u want. User has logged in 

} else if (!currentSession.isOpened()) { 
    // Ask for username and password 
    OpenRequest op = new Session.OpenRequest((Activity) context); 

    op.setLoginBehavior(SessionLoginBehavior.SSO_WITH_FALLBACK); 
    op.setCallback(null); 

    List<String> permissions = new ArrayList<String>(); 
    permissions.add("user_likes"); 
    permissions.add("email"); 
    permissions.add("user_birthday"); 
    permissions.add("user_location"); 
    permissions.add("user_interests"); 
    permissions.add("friends_birthday"); 
    op.setPermissions(permissions); 

    Session session = new Builder(MainActivity.this).build(); 
    Session.setActiveSession(session); 
    session.openForRead(op); 
    } 
} 
}); 

ve onActivityResult benim şeyler yapıyor: Ben okuma izinlerini soruyorum nasıl

budur. İşte ben bu konuda yapıyorum ne: Burada Permissions - Facebook Developers açıklandığı üzere

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 

super.onActivityResult(requestCode, resultCode, data); 
if (Session.getActiveSession() != null) 
    Session.getActiveSession().onActivityResult(this, requestCode, 
      resultCode, data); 

Session currentSession = Session.getActiveSession(); 
if (currentSession == null || currentSession.getState().isClosed()) { 
    Session session = new Session.Builder(context).build(); 
    Session.setActiveSession(session); 
    currentSession = session; 
} 

if (currentSession.isOpened()) { 
    Session.openActiveSession(this, true, new Session.StatusCallback() { 

    @Override 
    public void call(final Session session, SessionState state, 
     Exception exception) { 

     if (session.isOpened()) { 

     Request.executeMeRequestAsync(session, 
      new Request.GraphUserCallback() { 

       @Override 
       public void onCompleted(GraphUser user, 
        Response response) { 
       if (user != null) { 

        TextView welcome = (TextView) findViewById(R.id.welcome); 
        TextView access_token_txt = (TextView) findViewById(R.id.access_token); 
        TextView email_txt = (TextView) findViewById(R.id.email);           

        access_token = session.getAccessToken(); 
        firstName = user.getFirstName(); 
        fb_user_id = user.getId();           

        access_token_txt.setText(access_token); 

        JSONObject graphResponse = response 
         .getGraphObject().getInnerJSONObject(); 

        fbEmail = null; 
        try { 
         fbEmail = graphResponse.getString("email"); 

         } catch (JSONException e) { 
          e.printStackTrace(); 
         } 

        email_txt.setText(fbEmail);           
        } 
       } 
      }); 
     } 
    } 
}); 
} 
} 

Ben okuma izinlerine sahip izinleri yayımlamak sorun olamaz ki Facebook Developer doc okudum.

İlk kullanıcı okumak isteyip istemediğini ve kullanıcı otomatik olarak yayınladıktan sonra yayınlama izinlerini isteyebilir.

Facebook'ta yayınlama izinlerini, kullanıcı tarafından izin verilen okuma izni olarak nasıl girebilirim?

Her türlü yardım memnuniyetle karşılanacaktır.

+0

Giriş Facebook'a takılıyorum. Yerel uygulama mevcut olduğunda giriş yapabilir, ancak yerel uygulama mevcut değilse uygulamayı oturum açamaz ve yetkilendiremez. İşte benim sorum bu konuda cevap verebilir misiniz. [http://stackoverflow.com/questions/21336314/facebook-after-login-not-coming-back-but-asking-login-again] –

+0

Sorunuza yorum yaptım ve işe yararsa cevap ver. – Anupam

cevap

18

Sorumun cevabını var. Okuma izinlerini aldıktan sonra oturumu açmanız ve yayınlama izinlerini sormanız yeterlidir. İşte benim yaptığım budur:

private static final List<String> PERMISSIONS = Arrays.asList("publish_actions"); 
private boolean pendingPublishReauthorization = false; 

bu ekleyin senin onActivityResult:

Ayrıca bu yöntem kodunda entegre olsun
Session session = Session.getActiveSession(); 

    if (session != null) { 

     // Check for publish permissions 
     List<String> permissions = session.getPermissions(); 
     if (!isSubsetOf(PERMISSIONS, permissions)) { 
      pendingPublishReauthorization = true; 
      Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(
        this, PERMISSIONS); 
      session.requestNewPublishPermissions(newPermissionsRequest); 
      return; 
     } 
    } 

: Bunları yaparak

private boolean isSubsetOf(Collection<String> subset, 
     Collection<String> superset) { 
    for (String string : subset) { 
     if (!superset.contains(string)) { 
      return false; 
     } 
    } 
    return true; 
} 

, ben" Aynı zamanda okuma izinlerini aynı anda yayınlayabiliyorum

Bu, başkalarına yardım edeceğini umarız.

+1

Ancak oturum açma kutusunu bir kez daha açar, bu kullanıcı bakış açısından kabul edilemez. Kullanıcı adı ve şifreyi tekrar girerek kullanıcı yapabilir miyim? – jeevs

+0

@jeevs Bir kez daha popu göstermenin Facebook giriş için kullanıcı adı ve şifreyi yeniden girmekten daha iyi olduğunu düşünüyorum. OnActivityResult() 'ı açıp göstermemek gibi uygun bir akışa sahip olmak için üzerinde çalışıyorum. – Anupam

+0

Bu pop-up, facebook SDK'sı açılırken, arka planda post yayınlanır, bu yüzden kullanımı yoktur. Bu yazı zaten yayınlandığında neden giriş penceresine ihtiyacımız olacak. – jeevs

3

facebook sdk 3.0 belgelerinden, okuma ve yayınlama iznini kolay bir şekilde veremezsiniz. Ancak, oturumu okuma izni ile açtıktan sonra, UiLifecycleHelper sınıfının iznini yayınlamak için bu oturumu güncelleyebilirsiniz. Oturum durumu SessionState olarak değiştirildikten sonra .OPENED_TOKEN_UPDATED, yayınlama izni ile güncellenen oturum anlamına gelir. İşte size örnek kod bu size yardımcı umuyoruz.

public class Example { 
    private static final int REAUTH_ACTIVITY_CODE = 100; 
    private static final List<String> PERMISSIONS = Arrays.asList("publish_actions", "publish_stream"); 
    private static final String PENDING_PUBLISH_KEY = "pendingPublishReauthorization"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_submit_post); 
    uiHelper = new UiLifecycleHelper(this, callback); 
    uiHelper.onCreate(savedInstanceState); 
    publishStory(); 
} 

private Session.StatusCallback callback = new Session.StatusCallback() { 

    @Override 
    public void call(Session session, SessionState state, Exception exception) { 
     if (exception != null) { 
      new AlertDialog.Builder(SubmitPost.this) 
        .setMessage(exception.getMessage()) 
        .setPositiveButton("OK", null).show(); 
     } else { 
      SubmitPost.this.onSessionStateChange(session, state, exception); 
     } 
    } 
}; 

private void onSessionStateChange(Session session, SessionState state, Exception exception) { 

if (state.isOpened()) { 
      if (pendingAnnounce && state.equals(SessionState.OPENED_TOKEN_UPDATED)) { 
       // Session updated with new permissions so try publishing once more. 
       pendingAnnounce = false; 
       //call your method here to publish something on facebook 
       publishStory(); 
      } 
     } 
    } 

private void requestPublishPermissions(Session session) { 
    if (session != null) { 
     pendingAnnounce = true; 
     Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(this, PERMISSIONS); 

     newPermissionsRequest.setRequestCode(REAUTH_ACTIVITY_CODE); 
     Session mSession = Session.openActiveSessionFromCache(this); 
     mSession.addCallback(callback); 
     mSession.requestNewPublishPermissions(newPermissionsRequest); 
    } 
} 

private void publishStory() { 

    // Check for publish permissions 
    List<String> permissions = this.session.getPermissions(); 
    if (!permissions.containsAll(Arrays.asList(PERMISSIONS))) { 
     this.requestPublishPermissions(this.session); 
     this.is_return = true; 
     return; 
    } 

    Session session = Session.getActiveSession(); 
    if (session != null) { 
     CreateFBPost(); 
    } 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    uiHelper.onActivityResult(requestCode, resultCode, data); 

    switch (requestCode) { 
    case REAUTH_ACTIVITY_CODE: 
     Session session = Session.getActiveSession(); 
     if (session != null) { 
      session.onActivityResult(this, requestCode, resultCode, data); 
     } 
     break; 
    } 
} 
+0

Bu izni almak için kodumu nasıl güncelleyebilirim? Bu çok yardımcı olacak. – Anupam

+0

// Yayım izinlerini denetle Liste izin = this.session.getPermissions(); if (! Permissions.containsAll (Arrays.asList (PERMISSIONS))) { this.requestPublishPermissions (this.session); Bu, .is_return = true; dönüş; } bu barışın size gönderilip gönderilmeyeceğini kontrol ederseniz, evet yayınlamanız istenirse requestPublishPermissions yöntemi oturumunuzu izleyecektir. –

İlgili konular