4

這是我的第一篇文章,請讓我知道如果我不遵守社區規則。Facebook登錄未返回用戶access_token

現在來解決問題!我一直在嘗試爲應用程序設置Facebook登錄過程,並且已經添加了一個GUI元素(內置的Facebook登錄按鈕),並讓該按鈕繼續前進並請求用戶/密碼,授予應用程序訪問該用戶的帳戶。我面臨的問題是,當使用下面的代碼從應用程序獲取回調值時,我什麼都收不到(沒有值被打印)。現在我打印到LogCat的任意值,但是一旦打印成功,我就會訪問用戶access_token和其他信息(最初沒有工作)。任何幫助感謝!

protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_connect_accounts); 

      Log.i("fromMe", "test1"); 
      FacebookSdk.sdkInitialize(this.getApplicationContext()); 
      callbackManager = CallbackManager.Factory.create(); 
      LoginButton loginButton = (LoginButton)findViewById(R.id.login_button); 
      loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>(){ 

       public void onSuccess(LoginResult loginResult) { 
        Log.i("fromMe", "1"); 
       } 

       public void onCancel() { 
        Log.i("fromMe", "2"); 
       } 

       public void onError(FacebookException exception) { 
        Log.i("fromMe", "3"); 
       } 
      }); 
     } 

回答

1

如果Log.i("fromMe", "1");工作,這樣你就可以打電話。

而且在onActivityResult(int requestCode, int resultCode, Intent data) 加:

super.onActivityResult(requestCode, resultCode, data); 
callbackManager.onActivityResult(requestCode, resultCode, data); 
+0

accessToken.getToken();獲取令牌應用程序 – YenMinh

+0

是的,這是正確的。 – theapache64

+0

問題是'Log.i(「fromMe」,「1」)'從來沒有工作過。 – Novice

1

我從來沒有使用內置的facebook按鈕,而是我用普通的按鈕,點擊一個監聽器。我在onClick()中稱這種方法。

myButton.setOnClickListener(new View.OnClickListener(){ 
    @Override 
    public void onClick(View v){ 
     //Starting facebook signIN 
     startFbSignIn(); 
    } 
}); 

startFbSignIn();在onSuccess()

AccessToken accessToken = loginResult.getAccessToken(); 

private void startFbSignIn() { 

     List<String> permissions = new ArrayList<>(); 
     permissions.add("email"); 

     Session.openActiveSession(this, true, permissions, new Session.StatusCallback() { 
      @Override 
      public void call(final Session session, SessionState sessionState, Exception e) { 

       Log.d("X", "Call Called"); 

       if (session.isOpened()) { 

        Log.d("X", "SessionOpened" + session.getAccessToken()); 

        //Showing some loading 


        Request.newMeRequest(session, new Request.GraphUserCallback() { 
         @Override 
         public void onCompleted(GraphUser graphUser, Response response) { 

          //FACEBOOOK SIGNIN SUCCESS 
          Log.i("X", "Facebook Login Success"); 
          //Log 
          Log.d("X", "GRAPH USER:" + graphUser.toString()); 


          String name = graphUser.getName(); 
          //..... 

         } 
        }).executeAsync(); 

       } else { 
        Log.d("X", "SessioNOTopened"); 
       } 

      } 
     }); 

    } 

上述方法成功地爲我工作,你的onActivityResult()必須是這個樣子

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    //Facebook Session Manager 
    Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data); 
} 
+0

我給這個方法了一槍,並且我有唯一的問題是,會話和請求「解決不了」,並試圖導入使用Android Studio中的自動完成什麼的類時,後顯示出來com.facebook.Ses ...和com.facebook.Req ... – Novice

+0

我認爲你編譯了最新的Facebook SDK的項目。用這個'compile'c​​om.facebook.android:facebook-android-sdk:3.23.0''來編譯項目,而不是最新的。 – theapache64

1

可能導致Facebook的SDK你不能直接獲得的accessToken中的錯誤。我們需要創建一個的accessToken跟蹤器,然後得到的accessToken

private AccessTokenTracker accessTokenTracker; 
    accessTokenTracker = new AccessTokenTracker() { 


     @Override 
     protected void onCurrentAccessTokenChanged(AccessToken oldAccessToken, AccessToken newAccessToken) { 
      try { 

       if (newAccessToken.getToken() != null) { 
        facebookAccessToken = newAccessToken.getToken(); 
        //this is your accessToken here 

       } 
       else if (oldAccessToken.getToken() != null) { 
        facebookAccessToken = oldAccessToken.getToken(); 
        //this is your accessToken here 
       }else { 
        Toast.makeText(getBaseContext(), "Facebook Login Failed", Toast.LENGTH_LONG).show(); 
       } 

       if(oldAccessToken.getToken()!=null) 
       Log.e("old", oldAccessToken.getToken()); 
      }catch (Exception e){ 
       e.printStackTrace(); 
      } 

     } 
    }; 

一旦這樣做成功,在此改變活動的onStop方法,並確保你stoptracking的的accessToken那裏。

accessTokenTracker.stopTracking(); 
相關問題