web-dev-qa-db-ja.com

Facebook sdkを使用してログインしようとすると、FacebookCallback.onCancelが呼び出されます

Androidアプリがあり、FacebookのSDK(バージョン4.1.0)を使用してトークンを取得してログインしようとしています。コードは次のとおりです。

_public class LoginActivity extends Activity {
    private CallbackManager callbackManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        FacebookSdk.sdkInitialize(getApplicationContext());

        callbackManager = CallbackManager.Factory.create();
        LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {
                AccessToken accessToken = loginResult.getAccessToken();
                Log.v(TAG, "Facebook login was successful");
                String authToken = accessToken.getToken();
                // User authToken here:
            }

            @Override
            public void onCancel() {
                Log.v(TAG, "Facebook login was canceled");
            }

            @Override
            public void onError(FacebookException e) {
                Log.e(TAG, "Facebook login failed: " + e.getMessage());
            }
        });

        Button facebook_button = (Button) findViewById(R.id.fbButton);

        facebook_button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                LoginManager.getInstance().logInWithReadPermissions(getActivity(), Arrays.asList("public_profile"));
            }
        });

    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        callbackManager.onActivityResult(requestCode, resultCode, data);
    }
}
_

コードがFacebookアプリに切り替わり、元に戻ってOnActivityResult()が呼び出されます。ただし、呼び出されるコールバックメソッドは常にonCancel()です。 Facebookが提供するLoginButtonを使用しておらず、独自のボタンがあることに注意してください(ただし、そのアプローチを試したところ、結果は同じでした)。 アプリIDとアプリによって生成されたキーハッシュをダブルチェックとトリプルチェックしましたが、それらも正しく見えます。だから、私は他に何が間違っているのかわかりません。この時点での助けは大歓迎です。

19
shahins

はい私は同じ問題に直面していました、ログイン直前に以下のコードを使用してそれを解決しました

 LoginManager.getInstance().logOut();
23
Mehroz Munir

この動作の背後にある理由は、すでにログインしているためです。したがって、これを取り消すと、onsubmit()ではなくoncancel()が呼び出されます。したがって、このようにアプリケーションのログアウトボタンでログアウトを実行するだけです

インポート->

import com.facebook.login.LoginManager;

実装->

LoginManager.getInstance().logOut();
9
raisahab

私も同じ問題を抱えていましたが、最終的に問題を見つけました。 Facebookのログインフラグメントを呼び出すアクティビティにはAndroid:launchMode="singleInstance"マニフェストファイル内。

4
DoruChidean

@Doruのコメントは私を解決策に導きます。フラグメントではなくFacebookアクティビティを使用しました。

の代わりに

    <activity Android:name="com.facebook.FacebookActivity"
        Android:screenOrientation="portrait"
        Android:launchMode="singleTask" />

私は書く必要がありました

    <activity Android:name="com.facebook.FacebookActivity"
        Android:screenOrientation="portrait" />

このバグの厄介な点は、古いAndroidバージョン(5.0ではなく4.4.2など)でのみ発生することです。

2
Peter
        @Override
        public void onCancel() {

            accessToken = AccessToken.getCurrentAccessToken();
            if (accessToken == null) {
                Toast.makeText(LoginActivity.this, "Login unSuccessful..Please contact developer... ", Toast.LENGTH_LONG).show();
            } else {

                Toast.makeText(LoginActivity.this, "Login Successful. ", Toast.LENGTH_LONG).show();

            }
        }

        @Override
        public void onError(FacebookException error) {
            Toast.makeText(getApplicationContext(), "Login attempt failed.", Toast.LENGTH_SHORT).show();
        }
  • リストアイテム
1
priti

将来誰かがこれに遭遇した場合、これは、理由XのためにログインをブロックしているデバイスにインストールされたFacebookネイティブアプリが原因である可能性もあります。

私の場合、これはログインを試みるたびにスローされていました。ついにネイティブのFacebookアプリに切り替えましたが、開いたときに認証が必要で、「不審なアクティビティ」が原因で再度ログインしました(最近番号を変更したと思います)。

上記のすべてを実行していて、ユーザーがまだそれについて不満を言っている場合(そして、ユーザーがアプリをインストールしている場合は、下部のコードを使用して、Facebookアプリがインストールされているかどうかを確認できます:)次のダイアログを含めることができます。 Facebookアプリをチェックして、まだログインしていることを確認するように求めます。これにより、アプリケーションにタブで戻る前に、エラーを修正するように求められます。

//Code to check if Facebook app is installed:
public static boolean doesUserHaveFacebookAppInstalled(Context context){
    try{
        context.getPackageManager().getApplicationInfo("com.facebook.katana", 0 );
        return true;
    } catch( PackageManager.NameNotFoundException e ){
        return false;
    }
}
1
Silmarilos

問題は、APPIDを二重引用符で囲む必要があるためです。

0
shahins