Aktivität:
public class FrameActivity extends BaseActivity {
public static CallbackManager callbackManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
// FacebookSdk.sdkInitialize is called in the Application onCreate
callbackManager = CallbackManager.Factory.create();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
callbackManager.onActivityResult(requestCode, resultCode, data);
}
}
Fragment:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_login, container, false);
LoginButton loginButton = (LoginButton) view.findViewById(R.id.login_button);
loginButton.setReadPermissions("user_friends");
loginButton.setReadPermissions("public_profile");
loginButton.setReadPermissions("email");
loginButton.setReadPermissions("user_birthday");
// If using in a fragment
loginButton.setFragment(this);
// Other app specific specialization
// Callback registration
loginButton.registerCallback(FrameActivity.callbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
}
@Override
public void onCancel() {
// App code
}
@Override
public void onError(FacebookException exception) {
// App code
}
});
return view;
}
Versuche dies:
Init FacebookSdk.sdkInitialize()
in der onCreateView()
des Fragments.
Nächste Zeile init callbackManager = CallbackManager.Factory.create()
;
Implementieren Sie on onActivityResult()
in der Fragmentklasse.
Fügen Sie Ihr callbackManager.onActivityResult(requestCode, resultCode, data);
in Fragment onActivityResult()
hinzu.
Stellen Sie sicher, dass Sie FacebookInit()
und callbackManager
aus der Aktivität entfernen.
für ältere Versionen:
Ändern Sie die Methode wie folgt:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK)
{
com.facebook.Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
}
else
{
com.facebook.Session.getActiveSession().closeAndClearTokenInformation();
}
}
UPDATE: für v2.3 von hier :
Sie fügen den Callback der onCreate () - Methode Ihrer Aktivität oder Fragment hinzu:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FacebookSdk.sdkInitialize(this.getApplicationContext());
callbackManager = CallbackManager.Factory.create();
LoginManager.getInstance().registerCallback(callbackManager,
new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
// App code
}
@Override
public void onCancel() {
// App code
}
@Override
public void onError(FacebookException exception) {
// App code
}
});
}
Wenn die Anmeldung erfolgreich ist, hat der Parameter LoginResult
die neue AccessToken
und die zuletzt erteilten oder abgelehnten Berechtigungen.
Sie benötigen kein registerCallback, um sich erfolgreich anmelden zu können. Sie können die aktuellen Änderungen des Zugriffstokens mit der unten beschriebenen AccessTokenTracker
-Klasse verfolgen.
Dann leiten Sie in onActivityResult()
die Login-Ergebnisse an die in onCreate()
erstellte callbackManager
weiter:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
callbackManager.onActivityResult(requestCode, resultCode, data);
}
Jede Aktivität und jedes Fragment, die Sie mit dem FacebookSDK-Login oder -Freigabe integrieren, sollten onActivityResult
an den CallbackManager weiterleiten.
loginButton.setFragment(this);
Diese Zeile steht schon in der Frage. Wollte das aber einfach für alle anderen Entwickler schreiben, die sich umsehen.
Wenn Sie die FB-Anmeldeschaltfläche in einem Fragment verwenden, müssen Sie dies Ihrer onCreateView-Methode hinzufügen. Dies stellt sicher, dass der Rückruf zu Fragment geleitet wird, anstatt zu Ihrer Aktivität zu gehen.
Berücksichtigen Sie auch, dass bei zwei Callback-Managern für zwei verschiedene Vorgänge (wie Anmelden und Freigeben) der erste, der onActivityResult empfängt, den zweiten Rückruf erhalten kann und umgekehrt. Dieses Verhalten kann auch dazu führen, dass Ihr Rückruf nicht aufgerufen wird.
Das hat bei mir funktioniert
Callback-Manager initialisieren
CallbackManager sCallbackManager = CallbackManager.Factory.create();
Methode zum Registrieren des Rückrufs erstellen
private void configureFacebookAppInviteCallBack(){
AppInviteDialog appInviteDialog = new AppInviteDialog(InviteHomeFragment.this);
appInviteDialog.registerCallback(sCallbackManager,
new FacebookCallback<AppInviteDialog.Result>() {
@Override
public void onSuccess(AppInviteDialog.Result result) {
Log.d("rht", "Invitation Sent Successfully");
CommonUtils.getInstance().showToast("50");
}
@Override
public void onCancel() {
Log.d("rht", "Error Occured in facebook invite ");
}
@Override
public void onError(FacebookException e) {
if(e!=null) {
Log.d("rht", "Error Occured in facebook invite ");
}else{
Log.d("rht", "Error Occured in facebook invite");
}
}
});
}
Implementieren Sie onActivityResult.
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.v("rht", "onActivityResult called requestCode "+requestCode+" resultCode "+resultCode);
sCallbackManager.onActivityResult(requestCode, resultCode, data);
}
wenn dies in Fragment wichtig ist loginButton.setFragment(this);
Ich habe ca. 3 Stunden gebraucht, um herauszufinden, dass ich die API von Facebook falsch verstanden habe.
void someInitCode() {
callbackManager = CallbackManager.Factory.create();
LoginManager.getInstance().registerCallback(callbackManager,
new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
callAPI();
}
@Override
public void onCancel() {
}
@Override
public void onError(FacebookException exception) {
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
if (AccessToken.getCurrentAccessToken() != null) callAPI();
else callbackManager.onActivityResult(requestCode, resultCode, data);
} else {
Log.d("hole", "not ok");
}
super.onActivityResult(requestCode, resultCode, data);
}
Der ursprüngliche Aufruf hat onSuccess()
-Code nicht in die separate Funktion callAPI()
gestellt, so dass er niemals die API aufruft, obwohl der Login bereits erfolgreich war. Der Grund ist, dass eingeloggt und erneutes Login nicht in onSuccess()
eingeht!
Die gefundene Problemumgehung besteht darin, das Zugriffstoken zu überprüfen und den Aufruf von callAPI()
in onSuccess()
und onActivityResult()
zu trennen.