0

У меня проблема, и я не знаю, почему, надеюсь, вы могли бы мне помочь!Facebook Graph Api OAuthException, но токен доступа действителен

Я разрабатываю приложение для Android, которое использует графику facebook api. В нем используется считывание «user_likes». Когда я делаю этот запрос: «me/likes» все работает нормально. Но когда я это сделать: меня/любит поля = события {обложка}, имя

Я получаю OAuthException. ErrorMessage: активный маркер доступа должен быть использован для запроса информации о текущем пользователе

В заключении:

  1. я получаю действительный маркер доступа со всеми необходимыми разрешениями.
  2. Я администратор моего приложения, так что политика конфиденциальности facebook не должна играть никакой роли!
  3. Запрос

me/likes

работает, но

me/likes?fields=events

не работает!

Ответ я получаю:

{Response: responseCode: 400, graphObject: null, error: {HttpStatus: 400, errorCode: 2500, errorType: OAuthException, errorMessage: An active access token must be used to query information about the current user.}, isFromCache:false}

Так я debuged мой Access-Токен:

Выпущено: 1420803216 (4 часа назад)

Истекает: 1425987216 (примерно 2 месяца)

Действительно: True

Происхождение: Мобильный веб-сайт Faceweb

Области применения: public_profile, basic_info, электронная почта, user_birthday, USER_LOCATION, user_likes, user_friends


Я реально не понимаю, почему мой маркер доступа имеет так много областей? Я просто установил «user_likes»!

loginBtn.setReadPermissions(Arrays.asList("user_likes")); 

Это мой код:

private LoginButton loginBtn; 
    private TextView username; 
    private UiLifecycleHelper uiHelper; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     uiHelper = new UiLifecycleHelper(this, statusCallback); 
     uiHelper.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_main); 

     username = (TextView) findViewById(R.id.username); 
     loginBtn = (LoginButton) findViewById(R.id.fb_login_button); 
     loginBtn.setReadPermissions(Arrays.asList("user_likes")); 
     loginBtn.setUserInfoChangedCallback(new UserInfoChangedCallback() { 
      public void onUserInfoFetched(GraphUser user) { 
       if (user != null) { 
        username.setText("You are currently logged in as " 
          + user.getName()); 
       } else { 
        username.setText("You are not logged in."); 
       } 
      } 
     }); 
    } 

    private Session.StatusCallback statusCallback = new Session.StatusCallback() { 
     public void call(Session session, SessionState state, 
       Exception exception) { 
      if (state.isOpened()) { 
       Log.d("MainActivity", "Facebook session opened."); 
      } else if (state.isClosed()) { 
       Log.d("MainActivity", "Facebook session closed."); 
      } 
     } 
    }; 

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

    private void onSessionStateChange(final Session session, 
      SessionState state, Exception exception) { 

     if (state.isOpened()) { 
      // userInfoTextView.setVisibility(View.VISIBLE); 
      String token = session.getAccessToken(); 
      Log.d("SESSION_TOKEN", token); 
      new Request(session, "me/likes?fields=events", null, HttpMethod.GET, 
        new Request.Callback() { 
         public void onCompleted(Response response) { 
          Log.i("INFO", response.toString()); 
          // new 
          // GetResponses(userInfoTextView).execute(response); 
         } 
        }).executeAsync(); 

     } else if (state.isClosed()) { 
      // userInfoTextView.setVisibility(View.INVISIBLE); 
     } 
    } 

Что я делаю неправильно? Я думаю, что что-то с моей сессией или запросом на разрешение неверно ... я надеюсь, что кто-то может мне помочь!

вид касается Christoph

ответ

1

вызов API кажется правильным, и он работает в API Explorer. Единственным логическим объяснением ошибки является то, что токен доступа недопустим.

Поместите жетон в отладчике и посмотреть, если он действителен, и если user_likes доступен: https://developers.facebook.com/tools/debug/

+0

Уже сделано ... он истекает примерно через 2 месяца, он действителен и все разрешения доступны! public_profile, user_birthday, user_location, user_likes, user_events – user3490546

+1

, тогда вы не используете токен доступа в вызове, это будет единственным объяснением, так как оно отлично работает в api explorer. – luschn

+0

Я попробовал токен доступа от android-app в графике explorere, и он сработал! Но когда я делаю тот же запрос в приложении Android, я всегда получаю сообщение об ошибке. [screenshot] (http://c50i.imgup.net/GraphApiCa8655.JPG?l=de) – user3490546

2

Это потому, что в Facebook SDK для Android, вы должны передать дополнительные параметры как Bundle.

Таким образом, для случая, вы должны ссылаться на графике объекта таким образом:

Bundle bundle = new Bundle(); 
bundle.putString("fields", "events"); 

new GraphRequest(AccessToken.getCurrentAccessToken(), "me/likes", bundle, HttpMethod.GET, new GraphRequest.Callback() { 
    public void onCompleted(GraphResponse response) { 
     // Your stuff here 
    } 
}).executeAsync();