2013-06-05 1 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; 
    } 

는 언젠가 나는이 두 오류 ....

java.lang.UnsupportedOperationException가있어 시도가 보류중인 요청이있는 세션에 대한 새 권한을 요청 을 하였다.

또는 언젠가 ...

java.lang.UnsupportedOperationException가 : 세션 : 시도가 현재 열려 있지 않은 세션에 대한 새 권한을 요청 을 하였다.

의견을 보내 주시면 감사하겠습니다.

답변

4

우선, initFacebookSession 메소드는 바로 아래에 Session.getActiveSession()을 호출하므로 쓸모가 없으므로이 메소드를 삭제할 수 있습니다.

다음으로 onSessionStateChange 메서드에서 SessionState 변경 내용을 처리해야합니다.

  1. 당신이 이상 requestNewPermissions를 호출하는 방법을 게시에에서 onCreate
  2. 의 방법을 게시 호출하면되지 당신이 publishAddCardStory 방법에서 onCreate에 전화 유일한 장소를 수행하는 동안, 나는 당신이 오류가이 것을 얻을 이유를 가정 따라서 사용자의 새로운 활동을 허용하는 요청이 나타나고 세션이 보류 중 상태가됩니다.
  3. 사용자가 대화를 통해 새 권한을 허용하거나 허용하지 않음
  4. 활동이 다시 생성되고, 따라서 Sessio가 세션 동안 newPermissionsRequest를 다시 호출합니다. https://developers.facebook.com/docs/android/scrumptious/ 방법 sessionState의 변경을 처리하기 위해 : onSessionStateChange 아직

시도 페이스 북 데브 자습서를 보는 호출되지 않은 상태 N 보류 상태에 아직도있다. Facebook SDK는 또한 도움이 될 수있는 몇 가지 샘플 애플리케이션을 제공합니다. 행운을 빕니다! :)