У меня есть этот код для входа с помощью Facebook в Firebase:

mCallbackManager = CallbackManager.Factory.create();
    final LoginButton loginButton = (LoginButton) findViewById(R.id.login_button);
    loginButton.setReadPermissions("email", "public_profile");
    mAuth = FirebaseAuth.getInstance();

    loginButton.registerCallback(mCallbackManager, new FacebookCallback<LoginResult>() {
        @Override
        public void onSuccess(LoginResult loginResult) {
            SignUp.this.startActivity(startMainActivity);
            handleFacebookAccessToken(loginResult.getAccessToken());
        }

        @Override
        public void onCancel() {
            Toast.makeText(SignUp.this, "Login has been cancelled.", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onError(FacebookException error) {
            Log.w("FBSA", "Error logging in: " + error.getMessage());
            createDialogSignUpError();
        }
    });

< Сильный > onActivityResult :

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    mCallbackManager.onActivityResult(requestCode, resultCode, data);
    if (requestCode == RC_SIGN_IN) {
        GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
        Log.d("AD", "Signed in via google successfully:" + result.isSuccess());
        if (result.isSuccess()) {
            // Signed in successfully, show authenticated UI.
            GoogleSignInAccount account = result.getSignInAccount();
            firebaseAuthWithGoogle(account);
        } else {
            // Signed out, show unauthenticated UI.
            Toast.makeText(this, "An error has occurred", Toast.LENGTH_SHORT).show();
        }
    }
}

handleFacebookAccessToken:

private void handleFacebookAccessToken(AccessToken token) {
    Log.d("FBSA", "handleFacebookAccessToken:" + token);

    AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
    mAuth.signInWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    Log.d("FBSA", "signInWithCredential:onComplete:" + task.isSuccessful());

                    // If sign in fails, display a message to the user. If sign in succeeds
                    // the auth state listener will be notified and logic to handle the
                    // signed in user can be handled in the listener.
                    if (!task.isSuccessful()) {
                        Log.w("FBSA", "signInWithCredential", task.getException());
                        Toast.makeText(SignUp.this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show();
                    }
                }
            });
}

Но пользователь не входит в систему. onError не вызывается, а FirebaseAuth.getInstance().getCurrentUser() возвращает null. Почему это происходит и как это исправить?

1
Ali Bdeir 5 Сен 2016 в 11:29

3 ответа

Лучший ответ

Я решил это. Я выключил Facebook в консоли Firebase, а затем снова включил. Работает как шарм.

0
Ali Bdeir 7 Сен 2016 в 04:04

Возможно, вы пытаетесь войти в систему с одним и тем же пользователем двумя разными способами. Я получаю это сообщение об исключении, если пытаюсь войти в систему с учетной записью Facebook, которая имеет адрес электронной почты ранее зарегистрированного пользователя (с адресом электронной почты и паролем) в моем проекте firebase.

"An account already exists with the same email address but different sign-in credentials. Sign in using a provider associated with this email address."
1
chacon.galvez 13 Окт 2016 в 14:40

Это рабочий код, я добавил код, которого не вижу в вашем вопросе:

В onCreate добавьте:

FacebookSdk.sdkInitialize(getApplicationContext());
AppEventsLogger.activateApp(getApplication());

В onSuccess вызовите метод RequestData ():

 login.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {

                if (AccessToken.getCurrentAccessToken() != null) {
                    RequestData();

                    handleFacebookAccessToken(loginResult.getAccessToken());
                }
            }


ProfilePictureView profile;

public void RequestData() {

    Log.v(TAG, "RequestData");

    GraphRequest request = GraphRequest.newMeRequest(AccessToken.getCurrentAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
        @Override
        public void onCompleted(JSONObject object, GraphResponse response) {

            JSONObject json = response.getJSONObject();
            try {
                if (json != null) {
                    String text = "<b>Name :</b> " + json.getString("name") + "<br><br><b>Email :</b> " + json.getString("email") + "<br><br><b>Profile link :</b> " + json.getString("link");

                    Log.d(TAG, "facush:" + text);

                    profile.setProfileId(json.getString("id"));
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    });
    Bundle parameters = new Bundle();
    parameters.putString("fields", "id,name,link,email,picture");
    request.setParameters(parameters);
    request.executeAsync();
}
-2
MorZa 5 Сен 2016 в 10:02