11

我已经集成了最新的Facebook android sdk(Sdk 4.0)。 这是我在onCreate方法中添加的代码。Facebook AccessToken.getAccessToken在第一次登录后打开应用程序时为空

FacebookSdk.sdkInitialize(this.getApplicationContext()); 
      callbackManager = CallbackManager.Factory.create(); 
      if(AccessToken.getCurrentAccessToken()!=null){ 
       Log.d(FBTAG,"facebook already logged in"); 
       isFBLogin = true; 
      } 
      LoginManager.getInstance().registerCallback(callbackManager, 
        new FacebookCallback<LoginResult>() { 
         @Override 
         public void onSuccess(LoginResult loginResult) { 
          // App code 
          Log.d(FBTAG,"facebook log in"); 
          isFBLogin = true; 
         } 

         @Override 
         public void onCancel() { 
          // App code 
          isFBLogin = false; 
         } 

         @Override 
         public void onError(FacebookException error) { 
          isFBLogin = false; 
          Log.d(FBTAG,"facebook login error: "+error); 
          // App code 

         } 
      }); 

这是我用来onClickLogin

public void onClickLogin() { 
     LoginManager.getInstance().logInWithPublishPermissions(this, PERMISSIONS); 
    } 

代码我可以通过点击登录按钮和处理onClickLogin功能登录。现在,下次我打开应用程序时,我正在检查AccessToken.getAccessToken以检查用户是否已登录Facebook,但始终为空。 反正在新的sdk中没有登录的背景,所以我不必要求用户永远像以前的版本一样在会话类中登录。

+0

当再次登录时,您应该刷新令牌,因为用户可能已经撤消了您的应用的权限或会话已过期(我认为这是30或90天)。我希望你会发现[我的回答](http://stackoverflow.com/a/33151438/1276636)这个问题有用.. – Sufian 2016-05-16 10:46:20

回答

6

由LoginManager返回的访问令牌将保存在共享首选项中,因此下次打开该应用程序时,AccessToken.getCurrentAccessToken()应具有相同的访问令牌,这与使用该令牌的方式相同会话类。您可以查看SDK提供的示例以查看它们的工作方式。

确保您没有在会话之间重新安装应用程序,或将当前访问标记明确设置为空。

+0

但是,如果我卸载应用程序并重新安装一遍,并尝试点击登录按钮,那么它将不允许我登录。相反,它调用public void onError(FacebookException error)方法,并显示此异常“无效的密钥散列。密钥散列NDMi5aisFkTeU6BlER3L8JZ + wHw =不匹配任何存储的密钥散列” – AndroidDev 2015-08-02 18:56:11

+1

@AndroidDev,这是另一个问题。您必须将该确切的散列键放在有效的散列键部分@您的应用程序的页面@设置中。 – Dante 2015-09-02 19:38:59

0

我自己没有测试过,但我认为你可以做的是从回调的onSuccess方法的LoginResult对象中获取AccessToken。

所以:AccessToken accessToken = loginResult.getAccessToken();

那么你会保存下来此的accessToken说:

AccessToken.setAccessToken(的accessToken);

然后当你调用AccessToken.getAccessToken时,它应该返回你保存的accessToken。

+2

这是由facebook SDK自动完成的 – vedant1811 2015-07-28 17:37:40

0

原因是Facebook SDK配置文件缓存。

AccessToken.setCurrentAccessToken(null); 
    Profile.setCurrentProfile(null); 

在破坏活动之前试试吧。也许它可以解决你的问题。第一次工作它是干净的缓存第二次你可以登录不同的帐户。

10

您还可以添加一个InitializeCallback到sdkInitialize和检查的accessToken回调中:

FacebookSdk.sdkInitialize(getApplicationContext(), new FacebookSdk.InitializeCallback() { 
     @Override 
     public void onInitialized() { 
      if(AccessToken.getCurrentAccessToken() == null){ 
       System.out.println("not logged in yet"); 
      } else { 
       System.out.println("Logged in"); 
      } 
     } 
    }); 
+0

如果您在Application#onCreate()中初始化Facebook SDK并检查MainActivity的onCreate()中当前的访问令牌不为null,则存在竞争条件。在极少数情况下,用户会出现注销,因为我在Facebook SDK初始化之前检查当前访问令牌的时间少于100毫秒。 作为参考,访问令牌将始终为空,直到该未来任务完成执行:https://github.com/facebook/facebook-android-sdk/blob/6d960562a8b4a62c59c72898b07af67701a1ab2c/facebook/src/main/java/com/facebook /FacebookSdk.java#L225 – deRonbrown 2016-06-23 04:43:32

+0

您在哪里找到这些信息?我没有找到它https://developers.facebook.com/docs/facebook-login/android/v2.2 – 2016-09-02 03:31:27

1

的Android SDK的Facebook初始化是需要一段时间初始化。 所以你需要调用AccessToken.getCurrentAccessToken之前等待的只有100毫秒()

一次尝试这种解决方案是为我工作::

 FacebookSdk.sdkInitialize(this.getApplicationContext()); 
    callbackManager = CallbackManager.Factory.create(); 

    new Handler().postDelayed(new Runnable() { 
     @Override 
     public void run() { 


      if (AccessToken.getCurrentAccessToken() != null) { 
       Log.d(FBTAG, "facebook already logged in"); 
       isFBLogin = true; 
      } 
      LoginManager.getInstance().registerCallback(callbackManager, 
        new FacebookCallback<LoginResult>() { 
         @Override 
         public void onSuccess(LoginResult loginResult) { 
          // App code 
          Log.d(FBTAG, "facebook log in"); 
          isFBLogin = true; 
         } 

         @Override 
         public void onCancel() { 
          // App code 
          isFBLogin = false; 
         } 

         @Override 
         public void onError(FacebookException error) { 
          isFBLogin = false; 
          Log.d(FBTAG, "facebook login error: " + error); 
          // App code 

         } 
        }); 


     } 
    }, 100); 
0

1。你的函数更改为这个功能

public void onClickLogin() { 
    LoginManager.getInstance().logInWithReadPermissions(activity_name.this, PERMISSIONS); 
} 
1

请添加以下代码:

protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    //super.onActivityResult(requestCode, resultCode, data); 
    callbackManager.onActivityResult(requestCode,resultCode,data); 
} 
0

步骤

1)FacebookSdk.sdkInitialize(getActivity()getApplicationContext());

2)CallbackManager mCallbackManager = CallbackManager.Factory.create();通过使用 的accessToken mAccessToken = AccessToken.getCurrentAccessToken()

LoginManager.getInstance().registerCallback(mCallbackManager, 
      new FacebookCallback<LoginResult>() { 

       @Override 
       public void onSuccess(LoginResult loginResult) { 
        //you will get access token here 
        mAccessToken = loginResult.getAccessToken(); 



       } 

       @Override 
       public void onCancel() { 

       } 

       @Override 
       public void onError(FacebookException error) { 

       } 
      }); 

3) //获取接入令牌之后;

确保,如果您使用Facebook登录的片段,

1)确保你在与Facebook回调经理片段调用super.onActivityResult()。如果在相关活动中重写onActivityResult,则检查super.onActivityResult()在相关“片段活动”中被调用。

相关问题