web-dev-qa-db-ja.com

Facebook AccessToken.getAccessTokenは、最初のログイン後でもアプリを開くとnullになります

最新のFacebook Android sdk(Sdk 4.0)を統合しました。これは、onCreateメソッドに追加したコードです。

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に既にログインしているかどうかを確認していますが、常にnullとして表示されます。とにかく、バックグラウンドでログインするための新しいSDKはありません。そのため、セッションクラスの以前のバージョンのように、常にユーザーにログインを要求する必要はありません。

12
Rohit Goyal

LoginManagerによって返されたアクセストークンは共有設定に保存されるため、次にアプリを開いたときに、AccessToken.getCurrentAccessToken()は同じアクセストークンを持つ必要があります。これは、Sessionクラスの場合と同じです。 SDKに付属のサンプルをチェックして、それらが機能することを確認できます。

セッション間でアプリを再インストールしたり、現在のアクセストークンを明示的にnullに設定したりしていないことを確認してください。

6
Gokhan Caglar

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");
            }
        }
    });
12
Frank

Android FacebookSDKの初期化には時間がかかります。したがって、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);

私はこれを自分でテストしていませんが、あなたができると思うのは、コールバックのonSuccessメソッドのLoginResultオブジェクトからAccessTokenを取得することです。

したがって、AccessToken accessToken = loginResult.getAccessToken();

次に、次のように言って、このaccessTokenを保存します。

AccessToken.setAccessToken(accessToken);

次に、AccessToken.getAccessTokenを呼び出すと、保存したaccessTokenが返されます。

1
Simon

次のコードを追加してください。

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

1.関数をこの関数に変更します

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

ステップ

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

2)CallbackManager mCallbackManager = CallbackManager.Factory.create();

    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)//後でAccessTokenを使用してアクセストークンを取得しますmAccessToken = AccessToken.getCurrentAccessToken();

確認してください、フラグメントからのFacebookログインを使用する場合は、

1)Facebookコールバックマネージャーを使用して、super.onActivityResult()をフラグメントで呼び出すようにしてください。

2)関連するアクティビティでonActivityResultをオーバーライドした場合、関連する「フラグメントアクティビティ」でsuper.onActivityResult()が呼び出されることを確認します。

0
Axay Patel

理由はFacebookSDKプロファイルのキャッシュです。

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

アクティビティを破棄する前に試してください。多分それはあなたの問題を解決することができます。初めて作業するときはクリーンキャッシュで、2回目は別のアカウントにログインできます。

0