Ich habe ein einfaches Facebook-Login eingerichtet. Für Android 2.3.6 funktioniert alles wie gewünscht, der Benutzer erhält einen Eingabeaufforderungsdialog, gibt Daten ein und die App läuft weiter. Ich dachte, es sei ein Fehler der Android-Versionen, aber es zeigt, dass der Login nicht funktioniert, wenn eine Facebook-Anwendung auf dem Telefon installiert ist!
Getestet am: Galaxy Ace 2.3.6 HTC Desire 4.1.2 Galaxy Note 4.1.2 Android-Emulator 4.1.2
Sogar die Facebook-Beispiele funktionieren nicht!
Jedes Mal, wenn die App ausgeführt wird - else {
Log.d("SESSION NOT OPENED", "SESSION NOT OPENED");
}
Es scheint, als würde die Sitzung nicht eröffnet, aber warum ist das so? Befolgen Sie diese Anleitung - https://developers.facebook.com/docs/getting-started/facebook-sdk-for-Android/3.0/
Code:
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");
}
}
});
Sehen Sie sich das Ende von Schritt 4 an: https://developers.facebook.com/docs/getting-started/facebook-sdk-for-Android/3.0/
Wenn Sie Ihren App-Schlüssel-Hash nicht ordnungsgemäß eingegeben haben, funktioniert die Facebook-Anmeldung über das WebView-Popup (wenn die App nicht installiert ist) weiterhin, die Anmeldung über die native Facebook-App jedoch nicht.
Sie sollten diese Ausnahme in LogCat sehen:
com.facebook.http.protocol.ApiException: remote_app_id does not match stored id
Das Facebook-SDK druckt seine Ausnahmen, also überprüfen Sie dort trotzdem, ob andere Probleme vorliegen.
ich schreibe diese Antwort für diejenigen, die Facebook SDK 4.X
verwenden.
sie können das Login-Portal von Facebook auf zwei Arten öffnen:
wenn Sie ein Android-Gerät mit Android 1.9.X
und Facebook App
auf dem Gerät mit der Bezeichnung Native Login
-Methode installiert haben, müssen Sie nicht facebook WebView
verwenden.
wenn Sie Facebook App
nicht auf Ihrem Android-Gerät installiert haben, sollten Sie WebView
verwenden.
also für diese Facebook 3 Constants
NATIVE_ONLY
(wird verwendet, wenn Sie nur in der Facebook-App öffnen möchten)WEB_ONLY
(wird verwendet, wenn Sie nur in WebView
öffnen möchten)NATIVE_WITH_FALLBACK
(Empfohlene Facebook-Erkennung und Option webView
, falls die App nicht installiert ist)Überprüfen Sie den Link unter https://developers.facebook.com/docs/reference/Android/current/class/LoginButton/https: //developers.facebook .com/docs/facebook-login/Android/v2.2 # - Fehlerbehebung
LoginButton.setLoginBehavior(LoginBehavior.NATIVE_WITH_FALLBACK);
LoginButton.setLoginBehavior(LoginBehavior.NATIVE_ONLY);
LoginButton.setLoginBehavior(LoginBehavior.WEB_ONLY);
Holen Sie sich Ihren Hash-Schlüssel mit dieser Funktion für beide (debug und release apk) und fügen Sie ihn in developer.facebook.com/apps in Ihre App ein
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();
}
}
das hilft mir sehr .. hoffe das hilft dir auch ..
Anscheinend konnte ich die Daten nicht abrufen, wenn ich eine aktive Facebook-Sitzung (von Facebook-Anwendung) hatte.
Also bevor ich die Sitzung öffne, bitte ich um ein Force-Login, selbst wenn der Benutzer eine offene Facebook-Sitzung über die Facebook-Anwendung hat.
openRequest.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO);
Jetzt funktioniert alles, aber der Benutzer muss die Daten manuell eingeben. Es ist nicht ideal, aber es funktioniert.
Selbst die Facebook-Beispiele funktionierten nicht für mich, und die Facebook-App wurde geöffnet.
Wenn jemand eine bessere Lösung hat, können Sie das gerne vorschlagen.
Wenn der Hash-Schlüssel nicht ordnungsgemäß generiert wird, können Probleme auftreten
Ein systemeigenes Anmeldedialogfeld wird angezeigt, aber nach dem Akzeptieren des Popup-Berechtigungsfensters wird nichts angezeigt, und in der Protokollkategorie passiert nichts
Login und Freigabe funktionieren jedoch einwandfrei, wenn die native App auf dem Gerät deaktiviert ist (in diesem Fall wird der Anmeldedialog in der Webansicht geöffnet und es ist kein entsprechender Hash-Schlüssel erforderlich.)
Ich stand vor demselben Problem und löste dieses Problem, indem ich mit diesem Code einen Hash-Schlüssel erhielt. Der Hash-Schlüssel unterschied sich von einem mit openSSl und keytool erzeugten Schlüssel
nach dem Aktualisieren dieses Hash-Schlüssels in der Facebook-App funktioniert alles einwandfrei
//================================== 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());
}
Ändern Sie einfach Ihren Paketnamen und erhalten Sie den richtigen Hash-Schlüssel