5

を新しいセッションを作成していません。しかし、ReadPublishに置き換えたとき。すなわち、次のようになります。のFacebookのAndroid SDKセッションopenForPublishは、FacebookのAndroidのSDKで

Session tempSession = new Builder(this).build(); 
Session.setActiveSession(tempSession); 
tempSession.openForPublish(new OpenRequest(this).setPermissions(FB_PERMISSIONS)); 

セッションが空であり、空のセッションへのパブリッシュパーミッションを取得できないというエラーが表示されます。

これはなぜこのようなもので、これを処理する最良の方法は何かを教えてください。

答えて

4

短い答えは、openForPublishを呼び出さないことです。 openForReadを呼び出し、後でパブリッシュアクセス権が必要な場合は、requestNewPublishPermissionsを呼び出します。

長い答えは、すでに基本または既定のアクセス許可を既に持っていない限り、公開アクセス権を要求できないということです(openForReadを呼び出すとどうなりますか?空のアクセス権セット)。だから、openForPublishは実際にはほとんどのアプリにはない、非常に特定のニッチなユースケースを処理します。

+9

うん、かなり悪いFB SDKデザイン。 – rahulg

+0

私は同じ問題を抱えています。私は、Facebookのアプリケーションがユーザーの壁にデータを共有できるようにすることです。公開するセッションを開くたびに、インストールされているアプリケーションからユーザートークンを読み込まず、信用状なので、私を助けることができるものは見つかりましたか? –

7

これを並べ替えるにはしばらく時間がかかり、ユーザーがボタンをクリックして自分の商品をFacebookのフィードで共有できるようになりました。彼らが実際に共有したいと思うまでサインインするように促されたくなかったので、私はただの許可を出したがっていました。次のコードは、最初のログイン/読み取り権限リクエストとパブリッシュ権限リクエストをスタックします。これは、ユーザーには最初に読んでからパブリッシュするためにプロンプ​​トをダブルプロンプトしますが、ソリューションに関係なく、今すぐ必要です。

Session session = Session.getActiveSession(); 

if (session == null) { 
    session = new Session.Builder(this).setApplicationId("<APP ID HERE>").build(); 

    Session.setActiveSession(session); 
    session.addCallback(new StatusCallback() { 
     public void call(Session session, SessionState state, Exception exception) { 
      if (state == SessionState.OPENED) { 
       Session.OpenRequest openRequest = new Session.OpenRequest(FacebookActivity.this); 
       openRequest.setLoginBehavior(SessionLoginBehavior.SSO_WITH_FALLBACK); 
       session.requestNewPublishPermissions(
         new Session.NewPermissionsRequest(FacebookActivity.this, PERMISSIONS)); 
      } 
      else if (state == SessionState.OPENED_TOKEN_UPDATED) { 
       publishSomething(); 
      } 
      else if (state == SessionState.CLOSED_LOGIN_FAILED) { 
       session.closeAndClearTokenInformation(); 
       // Possibly finish the activity 
      } 
      else if (state == SessionState.CLOSED) { 
       session.close(); 
       // Possibly finish the activity 
      } 
     }}); 
} 

if (!session.isOpened()) { 
    Session.OpenRequest openRequest = new Session.OpenRequest(this); 
    openRequest.setLoginBehavior(SessionLoginBehavior.SSO_WITH_FALLBACK); 
    session.openForRead(openRequest); 
} 
else 
    publishSomething(); 
関連する問題