webentwicklung-frage-antwort-db.com.de

Facebook Login CallbackManager FacebookCallback nicht angerufen?

  • Ich versuche, mich mit LoginButton anzumelden, aber die Login-Rückrufe werden nicht aufgerufen (LoginButton ist in einem Fragment). 
  • FacebookSdk.sdkInitialize wird in der Anwendung onCreate aufgerufen
  • Es werden keine Rückrufe aufgerufen, nachdem die Anmeldung abgeschlossen ist ..__ Hier ist der Code:

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;
}
28

Versuche dies:

  1. Init FacebookSdk.sdkInitialize() in der onCreateView() des Fragments.

  2. Nächste Zeile init callbackManager = CallbackManager.Factory.create();

  3. Implementieren Sie on onActivityResult() in der Fragmentklasse.

  4. 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.

49

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.

10
user4670319
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.

10
Prakash

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.

2
Eli Kohen

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);
    }
1
Rohit Mandiwal

wenn dies in Fragment wichtig ist loginButton.setFragment(this); 

0
Ashish Chaugule

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.

0
林果皞