2013-06-05 10 views
5

Androidアプリ経由でストーリーを公開したいと思います。セッション:保留中のリクエストを持つセッションに新しい権限をリクエストしようとしました

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


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

    @Override 
    public void onResume() { 
     super.onResume(); 
     Session session = Session.getActiveSession(); 
     if (session != null && (session.isOpened() || session.isClosed())) { 
      onSessionStateChange(session, session.getState(), null); 
     } 
     uiHelper.onResume(); 
    } 

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

    @Override 
    public void onPause() { 
     super.onPause(); 
     uiHelper.onPause(); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     uiHelper.onDestroy(); 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putBoolean(PENDING_PUBLISH_KEY, pendingPublishReauthorization); 
     uiHelper.onSaveInstanceState(outState); 
    } 



    private void publishAddCardStory() { 
     Session session = initFacebookSession(PopupAddCardSuccessActivity.this); 
     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; 
      } 

      Bundle params = new Bundle(); 
      ... 
      params.putString("message", msg); 
      params.putString("description", desc); 
      params.putString("link", LINK); 
        ... 


      Request.Callback callback= new Request.Callback() { 
       public void onCompleted(Response response) { 
        JSONObject graphResponse = response 
               .getGraphObject() 
               .getInnerJSONObject(); 
        String postId = null; 
        try { 
         postId = graphResponse.getString("id"); 
        } catch (JSONException e) { 
         Log.i("FB-Response", 
          "JSON error "+ e.getMessage()); 
        } 
        FacebookRequestError error = response.getError(); 
        if (error != null) { 
         Toast.makeText(XXActivity.this 
          .getApplicationContext(), 
          getString(R.string.fb_post_fail), 
          Toast.LENGTH_SHORT).show(); 
         } else { 
          Toast.makeText(XXActivity.this 
           .getApplicationContext(), 
           getString(R.string.fb_post_success), 
           Toast.LENGTH_LONG).show(); 
        } 
       } 
      }; 

      Request request = new Request(session, "me/feed", params, 
            HttpMethod.POST, callback); 

      RequestAsyncTask task = new RequestAsyncTask(request); 
      task.execute(); 
     } 

    } 

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

    private void onSessionStateChange(Session session, SessionState state, Exception exception) { 
     if (state.isOpened()) { 
      //shareButton.setVisibility(View.VISIBLE); 
     } else if (state.isClosed()) { 
      //shareButton.setVisibility(View.INVISIBLE); 
     } 
    } 


    private Session.StatusCallback callback = new Session.StatusCallback() { 
     @Override 
     public void call(Session session, SessionState state, 
       Exception exception) { 
      onSessionStateChange(session, state, exception); 
     } 
    }; 

    private static Session initFacebookSession(Context context) { 
     Session session = Session.getActiveSession(); 
     if (session != null) 
      return session; 

     if (session == null) 
      session = new Session(context); 
     return session; 
    } 

はいつか私はこれらの2エラーが発生しました....

java.lang.UnsupportedOperationExceptionが:セッションは:試みが保留中の要求を持っているセッションの新しい権限を要求する としました。

またはいつか...

java.lang.UnsupportedOperationExceptionが:セッション:試みは、現在開かれていないセッションの新しい権限を要求する としました。

任意の提案がありがたいです。

答えて

4

まず、あなたのinitFacebookSessionメソッドは、そのすぐ下のSession.getActiveSession()を呼び出すため、このメソッドを削除できるので、役に立たなくなります。

次に、onSessionStateChangeメソッドでSessionStateの変更を処理する必要があります。

  1. あなたはオーバーrequestNewPermissionsを呼び出す方法を公開中のonCreate
  2. 方法を公開呼び出す:あなたがいないとあなたがpublishAddCardStoryメソッドがのonCreateである呼び出す唯一の場所を行いますが、私はあなたがエラーが、これがあることを取得する理由を想定しますあなたのアクティビティは破棄され、ユーザからの新しい権限を許可する要求が表示され、セッションが保留状態になるダイアログが表示されます。
  3. ダイアログで新しい権限を許可するかどうかを指定します。
  4. あなたのアクティビティが再度作成され、したがって、セッションの間にnewPermissionsRequestをもう一度呼び出すと、Sessio SessionState変更を処理する方法https://developers.facebook.com/docs/android/scrumptious/ :onSessionStateChangeはまだ

呼び出されなかった一方、nがFacebookのDevのチュートリアルに目を向けるようにしてください保留状態のままです。 Facebook SDKはまた、役に立つかもしれないいくつかのサンプルアプリケーションを提供しています。がんばろう! :)

関連する問題