web-dev-qa-db-ja.com

Android Facebookのログインがインストール済みのFacebookアプリで機能しない

簡単なFacebookログインを設定しました。 Android 2.3.6の場合、すべてが正常に機能し、ユーザーはプロンプトのログインダイアログを取得し、データを入力してアプリを続行します。Androidバージョンのエラーですが電話にFacebookアプリケーションがインストールされていると、ログインが機能しないことがわかります。

これをテストしました:Galaxy Ace 2.3.6 HTC Desire 4.1.2 Galaxy Note 4.1.2 Android emulator 4.1.2

Facebookのサンプルでも機能しません。

アプリが実行されるたび-else { Log.d("SESSION NOT OPENED", "SESSION NOT OPENED"); }

セッションが開かれていないようですが、なぜですか?このガイドに従ってください- https://developers.facebook.com/docs/getting-started/facebook-sdk-for-Android/3.0/

コード:

Session.openActiveSession(this, true, new Session.StatusCallback() {

        @Override
        public void call(final Session session, SessionState state, Exception exception) {

            if (session.isOpened()) {

                Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {

                    @Override
                    public void onCompleted(GraphUser user, Response response) {
                        if (user != null) {
                            Log.d("Access_token", session.getAccessToken());
                        }
                    }
                });
            } else {
                Log.d("SESSION NOT OPENED", "SESSION NOT OPENED");
            }
        }
    });
13
Karlis

手順4の下部を確認してください https://developers.facebook.com/docs/getting-started/facebook-sdk-for-Android/3.0/

アプリのキーハッシュを適切に入力しなかった場合でも、WebViewポップアップを介したFacebookログイン(アプリがインストールされていない場合)は機能しますが、ネイティブFacebookアプリを介したログインは機能しません。

LogCatでこの例外が表示されるはずです。

com.facebook.http.protocol.ApiException: remote_app_id does not match stored id

Facebook SDKはその例外を出力するので、他に問題がある場合はとにかくそこを確認してください。

7
antonyt

私はFacebook SDK 4.Xを使用している人のためにこの答えを書いています

facebookのログインポータルは、次の2つの方法のいずれかで開くことができます。

  1. Android Android 1.9.Xを搭載したデバイスがあり、Facebook AppNative Loginというデバイスにインストールされている場合は、ここでFacebookを使用する必要はありませんWebView

  2. AndroidデバイスにFacebook Appをインストールしていない場合は、WebViewを使用することをお勧めします

したがって、このFacebookには3 Constants

  1. NATIVE_ONLY(Facebookアプリでのみ開きたい場合に使用)
  2. WEB_ONLYWebViewでのみ開く場合に使用)
  3. NATIVE_WITH_FALLBACK(アプリがインストールされていない場合、推奨されるFacebookの検出と動作webView

詳細については、以下のリンクを確認してください https://developers.facebook.com/docs/reference/Android/current/class/LoginButton/https://developers.facebook.com/docs/ facebook-login/Android/v2.2#troubleshooting

     LoginButton.setLoginBehavior(LoginBehavior.NATIVE_WITH_FALLBACK);
     LoginButton.setLoginBehavior(LoginBehavior.NATIVE_ONLY);
     LoginButton.setLoginBehavior(LoginBehavior.WEB_ONLY);
10
ANinJa

この関数を使用して(デバッグとリリースAPKの両方で)ハッシュキーを取得し、それをdeveloper.facebook.com/appsのアプリに配置します。

private void calculateHashKey(String yourPackageName) {
    try {
        PackageInfo info = getPackageManager().getPackageInfo(
                yourPackageName,
                PackageManager.GET_SIGNATURES);
        for (Signature signature : info.signatures) {
            MessageDigest md = MessageDigest.getInstance("SHA");
            md.update(signature.toByteArray());
            Log.d("KeyHash:",
                    Base64.encodeToString(md.digest(), Base64.DEFAULT));
        }
    } catch (NameNotFoundException e) {
        e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
}

これは私に大いに役立ちます。これがあなたにも役立つことを願っています。

6
Jignesh Patel

(Facebookアプリケーションから)アクティブなFacebookセッションがあった場合、データを取得できなかったようです。

そのため、セッションを開く前に、ユーザーがFacebookアプリケーションからFacebookセッションを開いている場合でも、強制ログインを求めています。

openRequest.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO);

これですべてが機能しますが、ユーザーは手動でデータを入力する必要があります。理想的ではありませんが、機能します。

Facebookのサンプルでさえ、Facebookアプリを開いた状態では機能しませんでした。

誰かがより良い解決策を持っている場合は、遠慮なく提案してください。

2
Karlis

ハッシュキーが適切に生成されない場合、次のような問題に直面する可能性があります

ネイティブのログインダイアログが表示されますが、権限を受け入れた後、ポップアップが表示され、log catで何も起こりません

ただし、デバイスのネイティブアプリが無効になっている場合、ログインと共有は正常に機能します(この場合、Webビューでログインダイアログが開き、適切なハッシュキーは必要ありません)。

私は同じ問題に直面していて、このコードを使用してハッシュキーを取得することでこれを解決しました。ハッシュキーは、openSSlおよびkeytoolを使用して生成されたものとは異なりました

そして、Facebookアプリでこのハッシュキーを更新した後、すべてうまくいきます

//================================== To Get Facebook Hash key Programmatically =========================//
    PackageInfo info;

     try {
            info = activity.getPackageManager().getPackageInfo("com.checkmyplanner", PackageManager.GET_SIGNATURES);
            for (Signature signature : info.signatures) {
                MessageDigest md;
                md = MessageDigest.getInstance("SHA");
                md.update(signature.toByteArray());
                String something = new String(Base64.encode(md.digest(), 0));
                //String something = new String(Base64.encodeBytes(md.digest()));
                Log.e("hash key", something);
            }
        } catch (NameNotFoundException e1) {
            Log.e("name not found", e1.toString());
        } catch (NoSuchAlgorithmException e) {
            Log.e("no such an algorithm", e.toString());
        } catch (Exception e) {
            Log.e("exception", e.toString());
        }

パッケージ名を変更して適切なハッシュキーを取得するだけです

1
HemangNirmal