0

我有一個問題,我不知道爲什麼,我希望你能幫助我!Facebook Graph API OAuthException但訪問令牌有效

我正在開發一個使用facebook圖形API的Android應用程序。 它使用readpermission「user_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我的訪問令牌:

發行:1420803216(1小時前)

過期:1425987216(在約2個月)

有效期限:真

產地:Mobile Web 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); 
     } 
    } 

什麼是我做錯了嗎?我想我的會話或權限請求是錯誤的...我希望有人能幫助我!

親切的問候 克里斯托夫

回答

1

API調用似乎是正確的,它的API瀏覽器的工作原理。對錯誤的唯一合理解釋是訪問令牌無效。

把令牌中的調試器,看看它是否是有效的,如果user_likes可用:https://developers.facebook.com/tools/debug/

+0

已經完成......它在約2個月到期,它是有效的,所有權限都可以! 作用域\t public_profile,user_birthday,user_location,user_likes,user_events – user3490546

+1

然後你在調用中沒有使用訪問令牌,這將是唯一的解釋,因爲它在API瀏覽器中工作正常。 – luschn

+0

我嘗試了圖表explorere中android-app的訪問令牌,它工作正常!但是當我在android應用程序中做同樣的請求時,我總是得到一個錯誤。 [截圖](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(); 
相關問題