2013-06-05 8 views
5

Chcę opublikować historię za pomocą aplikacji na Androida i używam poniższego kodu.Sesja: podjęto próbę żądania nowych uprawnień dla sesji, która ma oczekujące żądanie.

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

Gdzieś mam te 2 błędzie ....

java.lang.UnsupportedOperationException: Sesja: podjęto próbę do żądania nowe uprawnienia dla sesji, który został zgłoszony wniosek.

lub kiedyś ...

java.lang.UnsupportedOperationException: Sesja: podjęto próbę do żądania nowe uprawnienia dla sesji, które nie są obecnie otwarte.

Wszelkie sugestie będą mile widziane.

Odpowiedz

4

Po pierwsze, twoja metoda initFacebookSession jest bezużyteczna, ponieważ wywołujesz Session.getActiveSession() tuż pod nią, więc możesz usunąć tę metodę.

Następnie należy obsłużyć zmiany SessionState w metodzie onSessionStateChange. Chociaż nie, a nie tylko miejsce, gdzie można wywołać metodę publishAddCardStory jest w onCreate, zakładam, że masz powód, że błędy to:

  1. zadzwonić publikuje metody w onCreate
  2. w publikuje metodę nazywamy requestNewPermissions ponad Sesja, w związku z czym Twoja aktywność zostanie zniszczona, a aktywność na Facebooku będzie prowadzona z prośbą o zezwolenie na nowe uprawnienia i Sesja wejdzie w stan oczekiwania.
  3. użytkownik zezwoli (lub nie) na nowe uprawnienia za pośrednictwem okna dialogowego
  4. Twoje działanie zostanie ponownie utworzone, dlatego ponownie wywołujesz newPermissionsRequest over Session podczas Sessio n jest nadal w stanie oczekiwania podczas onSessionStateChange nie nazywano jeszcze

Spróbuj spojrzeć na Facebooku Dev Ćwiczenia: https://developers.facebook.com/docs/android/scrumptious/ jak radzić sessionState zmian. Facebook SDK dostarcza również kilka przykładowych aplikacji, które mogą być również pomocne. Powodzenia! :)

Powiązane problemy