2013-06-05 32 views
5

Tôi muốn xuất bản câu chuyện qua ứng dụng Android và tôi sử dụng mã bên dưới.Phiên: một nỗ lực đã được thực hiện để yêu cầu quyền mới cho phiên có yêu cầu đang chờ xử lý

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

Đôi khi tôi có những 2 lỗi ....

java.lang.UnsupportedOperationException: Session: một nỗ lực đã được thực hiện để yêu cầu quyền mới cho một phiên mà có một yêu cầu đang chờ giải quyết.

hoặc đôi khi ...

java.lang.UnsupportedOperationException: Session: một nỗ lực đã được thực hiện để yêu cầu quyền mới cho một phiên đó không phải là hiện đang mở.

Mọi đề xuất sẽ được đánh giá cao.

Trả lời

4

Trước hết, phương pháp initFacebookSession của bạn là vô dụng vì bạn gọi Session.getActiveSession() ngay bên dưới nó, để bạn có thể xóa phương thức này.

Tiếp theo, bạn nên xử lý các thay đổi SessionState trong phương thức onSessionStateChange. Trong khi bạn không và chỉ nơi mà bạn gọi phương thức publishAddCardStory là trong onCreate, tôi giả lý do bạn nhận được rằng lỗi là thế này:

  1. bạn gọi công bố phương pháp trong onCreate
  2. trong công bố phương pháp bạn gọi requestNewPermissions trên Phiên, do đó hoạt động của bạn sẽ bị hủy và hoạt động trên facebook với hộp thoại yêu cầu cho phép quyền mới từ người dùng xuất hiện và phiên được chuyển vào trạng thái chờ
  3. người dùng sẽ cho phép (hoặc không) quyền mới qua hộp thoại
  4. hoạt động của bạn được tạo lại, do đó bạn gọi newPermissionsRequest qua Session một lần nữa trong khi Sessio n vẫn đang trong trạng thái chờ trong khi onSessionStateChange không được gọi chưa

Cố gắng nhìn vào Facebook Dev Hướng dẫn: https://developers.facebook.com/docs/android/scrumptious/ làm thế nào để xử lý những thay đổi sessionState. Facebook SDK cũng cung cấp một số ứng dụng mẫu có thể hữu ích. Chúc may mắn! :)

Các vấn đề liên quan