spa*_*ron 43 android facebook facebook-graph-api
我正在将我的Facebook SDK升级到最新版本.下面的代码从Facebook自己的例子中逐行提升,可以在这里找到:https://developers.facebook.com/docs/facebook-login/android/v2.3
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.FacebookSdk;
import com.facebook.login.LoginManager;
import com.facebook.login.LoginResult;
import java.util.Arrays;
public class TestFb extends FragmentActivity{
CallbackManager callbackManager;
FacebookController fbController;
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
fbController = FacebookController.getInstance(this);
FacebookSdk.sdkInitialize(getApplicationContext());
final LoginManager loginManager = LoginManager.getInstance();
callbackManager = CallbackManager.Factory.create();
loginManager.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
String userId = loginResult.getAccessToken().getUserId();
String token = loginResult.getAccessToken().getToken();
Log.d("fb", "ID: " + userId + " Token: "+ token);
}
@Override
public void onCancel() {
finish();
}
@Override
public void onError(FacebookException e) {
Log.d("fb", "Exception: " + e.getMessage());
}
});
loginManager.logInWithReadPermissions(this, Arrays.asList(new String[]{"email", "user_likes"}));
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
callbackManager.onActivityResult(requestCode, resultCode, data);
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,当用户已经登录到手机上的Facebook应用程序时,这不起作用.在这种情况下,这会给出"用户以不同的Facebook用户身份登录"错误.
我认为,鉴于设备上已经有一个活跃的Facebook帐户,无法创建新帐户.但如果是这种情况,我应该从现有帐户获取用户的ID和令牌吗?我似乎无法在Facebook的文档页面上找到任何关于这个问题的提及.
sor*_*niv 71
如果您想要使用现在登录Facebook应用程序的用户登录,并且您仍然拥有对前一个用户有效的令牌,您可以检测到错误并在FacebookCallback中注销,如下所示:
@Override
public void onError(FacebookException e) {
if (e instanceof FacebookAuthorizationException) {
if (AccessToken.getCurrentAccessToken() != null) {
LoginManager.getInstance().logOut();
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用LoginManager再次登录.
lob*_*zik 30
非常感谢@sorianiv和@ ming-li的回答!我想用更多细节来描述我的案例,因为它对某些人有用.
Facebook SDK创建一个名为"com.facebook.AccessTokenManager.SharedPreferences"的共享首选项文件.当用户使用facebook SDK登录时,存储访问令牌,用户名和其他令牌信息.我的问题是我没有打电话
LoginManager.getInstance().logOut()
Run Code Online (Sandbox Code Playgroud)
当用户在我的应用程序中签名时.并且未清除共享首选项中的缓存.因此,当用户尝试使用不同的Facebook用户登录时,Facebook SDK从缓存中获取用户数据并返回错误:
"用户以不同的Facebook用户身份登录."
在我的情况下,解决方案只是在用户从我的应用程序注销时调用logOut().
if(LoginManager.getInstance()!=null){
LoginManager.getInstance().logOut();
}
Run Code Online (Sandbox Code Playgroud)
写在“registerCallback();”之前 方法
如果您已经有一个有效的访问令牌,但正在请求额外的权限(通过 LoginManager.logInWithReadPermissions 调用),并且登录到 FB 应用程序的用户与您已经拥有访问令牌的用户不同,则会出现此错误。你可以做几件事:
| 归档时间: |
|
| 查看次数: |
15391 次 |
| 最近记录: |