11

私はFacebookを自分のアプリケーションに統合しています。私は読み込み権限を得ることができますが、Facebook SDKから公開権限を得る方法はあります。Facebookからの読み取りアクセス権を取得した後にpublish_action権限を取得します

これは私が読み取りの権限のために求めている方法です:

@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); 
    } 
} 
}); 

ユーザーは、私がaccess_tokenを取得することができるよ許可を付与し、onActivityResultに私のことをやっている場合。ここで私はそれをやっているものです:

@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);           
        } 
       } 
      }); 
     } 
    } 
}); 
} 
} 

私は読み取り権限を持つ権限を公開尋ねる傾けることを、ここにPermissions - Facebook Developersを説明したように、私はFacebook Developerドキュメントを読みました。

最初のユーザーは読み取りを要求する必要があり、ユーザーがそれを自動化すると、発行権限を求めることができます。

Facebookからのパブリッシュ権限を取得するには、ユーザーの後に読み取りアクセス権が与えられている必要があります。

何か助けていただければ幸いです。

+0

私はログインfacebookに固執しています。ネイティブアプリが利用可能な場合はログインできますが、ネイティブアプリが利用できない場合はログインしてアプリを許可できません。ここで私の質問はあなたがこれに関する答えを提供することができます。 [http://stackoverflow.com/questions/21336314/facebook-after-login-not-coming-back-but-asking-login-again] –

+0

私はあなたの質問にコメントし、それが動作すれば返信しました。 – Anupam

答えて

18

私は私の質問に答えました。読み取りアクセス権を取得した後にセッションを開き、公開アクセス権を要求する必要があります。ここに私がやっていることです:

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

あなたonActivityResultでこれを追加します。また、この方法は、コードに統合されます

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; 
     } 
    } 

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

これらの事を行うことで、私は」同時にアクセス権を公開することができます。

これは他の人に役立つことを願っています。

+1

しかし、ユーザの視点からは受け入れられない簡単なログインボックスが再び開きます。ユーザーがユーザー名とパスワードを再入力してもいいですか? – jeevs

+0

@jeevs Facebookのログイン用のユーザー名とパスワードを再入力するよりも、ポップアップをもう一度表示する方が良いと思います。私はonActivityResult()でポップアップを表示しないような適切なフローを持っています。 – Anupam

+0

ポップアップはログインですバックグラウンドでポストが公開されている間、Facebook SDKのポップアップなので使用しません。投稿が既に公開されているときにそのログインポップアップが必要な理由 – jeevs

3

facebook sdk 3.0のドキュメントでは、読み込みと公開の両方の権限を同時に与えることはできません。ただし、後で読み取りアクセス権を持つセッションを開くと、UiLifecycleHelperクラスによってこのセッションを公開アクセス権に更新できます。セッション状態がSessionState.OPENED_TOKEN_UPDATEDに変更されると、公開アクセス権で更新されたセッションを意味します。これは、あなたの役に立つサンプルコードです。

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

許可を得るためにコードを更新するにはどうしたらいいですか?それは非常に役に立ちます。 – Anupam

+0

//パブリッシュのアクセス許可を確認する リスト permissions = this.session.getPermissions(); if(!permissions.containsAll(Arrays.asList(PERMISSIONS))){ this.requestPublishPermissions(this.session);これは です。is_return = true; リターン; }このコードの平和は、あなたが権限を持っているかどうかをチェックします。もしpublishStoryが呼び出されれば、else requestPublishPermissionsメソッドはセッションにアクセス許可を追加します。 –

関連する問題