web-dev-qa-db-ja.com

Androidでfacebook SDKを使用すると、「ユーザーは別のFacebookユーザーとしてログインしました。」エラーが発生します。

Facebook SDKの使用を最新バージョンにアップグレードしています。次のコードは、Facebookの例から1行ずつかなり改善されています。ここで見つけることができます: 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ユーザーとしてログインしたユーザー」エラーが発生します。

デバイス上にアクティブなFacebookアカウントが既に存在する場合、新しいアカウントを作成することはできないと思います。しかし、その場合は、既存のアカウントからユーザーのIDとトークンを取得する必要がありますか? Facebookのドキュメントページでこの問題に関する言及を見つけることができなかったようです。

41
spacitron

Facebookアプリに現在ログインしているユーザーでログインし、以前のユーザーに対して有効なトークンがまだある場合は、次のようにエラーを検出し、FacebookCallbackからログアウトできます。

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

その後、LoginManagerを使用して再度ログインできます。

70
sorianiv

@sorianivと@ ming-liの回答に感謝します!誰かに役立つことがあるので、私のケースをより詳細に説明したい。

Facebook SDKは、「com.facebook.AccessTokenManager.SharedPreferences」という共有設定ファイルを作成します。また、ユーザーがfacebook SDKでサインインすると、アクセストークン、ユーザー名、その他のトークン情報が保存されます。私の問題は、私が電話しなかったことです

LoginManager.getInstance().logOut() 

ユーザーがアプリでサインアウトしたとき。また、共有設定のキャッシュはクリアされませんでした。そのため、ユーザーが別のFacebookユーザーでサインインしようとすると、Facebook SDKはキャッシュからユーザーデータを取得し、エラーを返しました。

「ユーザーは別のFacebookユーザーとしてログインしました。」

私の場合の解決策は、ユーザーがアプリからサインアウトするときにlogOut()を呼び出すだけでした。

29
lobzik

有効なアクセストークンを既に持っているが(LoginManager.logInWithReadPermissions呼び出しを介して)追加のアクセス許可を要求しており、FBアプリにログインしているユーザーが既にアクセストークンを持っているユーザーと異なる場合、このエラーが発生します。いくつかのことができます:

  1. 有効なアクセストークン(AccessToken.getCurrentAccessToken()!= null)が既にあることを確認し、それ以上のアクセス許可を要求しないでください。
  2. さらに権限を要求する必要があり、このエラーが発生した場合は、FBアプリからログアウトし、自分でログインするようにユーザーに依頼してください。
4
Ming Li
if(LoginManager.getInstance()!=null){
        LoginManager.getInstance().logOut();
    }

「registerCallback();」の前に書き込みます方法

3
Parth Desai

今日も同じ問題に直面しました。ユーザーがFbLoginButtonをクリックしたときに以下のコード行を使用することで、問題を乗り越えました

LoginManager.getInstance().logOut();

0
Ramesh 586