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(); 
相关问题