在Android上使用facebook SDK可以让用户以不同的Facebook用户身份登录。"错误

时间:2015-04-22 08:20:07

标签: 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);
    }
}

问题是,当用户已经登录到手机上的Facebook应用程序时,这不起作用。在这种情况下,这会给用户以不同的Facebook用户身份登录&#34;错误。

我认为,鉴于设备上已经有一个活跃的Facebook帐户,无法创建新帐户。但如果是这种情况,我应该从现有帐户中获取用户的ID和令牌吗?我似乎无法在Facebook的文档页面上找到任何关于此问题的提及。

5 个答案:

答案 0 :(得分:68)

如果您想要使用现在登录Facebook应用程序的用户登录,并且您仍然拥有对前一个用户有效的令牌,您可以检测到错误并在FacebookCallback中注销,如下所示:

    @Override
    public void onError(FacebookException e) {
        if (e instanceof FacebookAuthorizationException) {
            if (AccessToken.getCurrentAccessToken() != null) {
                LoginManager.getInstance().logOut();
            }
        }
    }

然后您可以使用LoginManager重新登录。

答案 1 :(得分:29)

非常感谢@sorianiv和@ ming-li的回答!我想用更多细节来描述我的案例,因为它对某些人有用。

Facebook SDK创建一个名为“com.facebook.AccessTokenManager.SharedPreferences”的共享首选项文件。当用户使用facebook SDK登录时,存储访问令牌,用户名和其他令牌信息。我的问题是我没有打电话

LoginManager.getInstance().logOut() 

当用户在我的应用中输入时。并且未清除共享首选项中的缓存。因此,当用户尝试使用不同的Facebook用户登录时,Facebook SDK从缓存中获取用户数据并返回错误:

  

“用户以不同的Facebook用户身份登录。”

在我的情况下,解决方案就是在用户从我的应用中退出时调用 logOut()

答案 2 :(得分:4)

如果您已经拥有有效的访问令牌但是正在请求其他权限(通过LoginManager.logInWithReadPermissions调用),您将收到此错误,并且登录到FB应用程序的用户与您已拥有访问令牌的用户不同对于。你可以做几件事:

  1. 检查您是否已拥有有效的访问令牌(AccessToken.getCurrentAccessToken()!= null),并且不要求更多权限。
  2. 如果您确实需要请求更多权限,并且出现此错误,请要求用户注销FB应用程序,并以自己身份登录。

答案 3 :(得分:2)

if(LoginManager.getInstance()!=null){
        LoginManager.getInstance().logOut();
    }

写在“ registerCallback();”之前方法

答案 4 :(得分:0)

我今天也遇到了同样的问题。当用户点击FbLoginButton

时,我使用下面的代码行超越了问题

LoginManager.getInstance().logOut();

相关问题