簡単な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");
}
}
});
手順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はその例外を出力するので、他に問題がある場合はとにかくそこを確認してください。
私はFacebook SDK 4.X
を使用している人のためにこの答えを書いています
facebookのログインポータルは、次の2つの方法のいずれかで開くことができます。
Android Android 1.9.X
を搭載したデバイスがあり、Facebook App
がNative Login
というデバイスにインストールされている場合は、ここでFacebookを使用する必要はありませんWebView
AndroidデバイスにFacebook App
をインストールしていない場合は、WebView
を使用することをお勧めします
したがって、このFacebookには3 Constants
NATIVE_ONLY
(Facebookアプリでのみ開きたい場合に使用)WEB_ONLY
(WebView
でのみ開く場合に使用)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);
この関数を使用して(デバッグとリリース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();
}
}
これは私に大いに役立ちます。これがあなたにも役立つことを願っています。
(Facebookアプリケーションから)アクティブなFacebookセッションがあった場合、データを取得できなかったようです。
そのため、セッションを開く前に、ユーザーがFacebookアプリケーションからFacebookセッションを開いている場合でも、強制ログインを求めています。
openRequest.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO);
これですべてが機能しますが、ユーザーは手動でデータを入力する必要があります。理想的ではありませんが、機能します。
Facebookのサンプルでさえ、Facebookアプリを開いた状態では機能しませんでした。
誰かがより良い解決策を持っている場合は、遠慮なく提案してください。
ハッシュキーが適切に生成されない場合、次のような問題に直面する可能性があります
ネイティブのログインダイアログが表示されますが、権限を受け入れた後、ポップアップが表示され、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());
}
パッケージ名を変更して適切なハッシュキーを取得するだけです