如果帐户在Firebase Android初次注册期间已与谷歌相关联,请使用Facebook登录

Shu*_*ham 10 android facebook firebase firebase-authentication

我正在尝试使用重新安装Android应用程序登录facebook.最初我使用Google注册并成功将其与firebase链接.

但是,当我尝试使用Facebook时,它会给出一个

FirebaseAuthUserCollisionException
Run Code Online (Sandbox Code Playgroud)

我在Firebase文档中读到了您可以这样做的内容

FirebaseUser prevUser = currentUser;
currentUser = auth.signInWithCredential(credential).await().getUser();
// Merge prevUser and currentUser accounts and data
// ...
Run Code Online (Sandbox Code Playgroud)

但这里await()方法不再存在.在搜索了一下后,我发现了这个解决方案

Tasks.await(mAuth.signInWithCredential(credential)).getUser();
Run Code Online (Sandbox Code Playgroud)

但是当获取已经链接的当前用户时,这也会出错.我该怎么做才能解决这个问题?

dzi*_*kyy 0

不需要.await()方法来获取 firebase 用户。代替
使用。FirebaseAuth.AuthStateListener

因此,您可以使用如下方式实现 firebase 登录:

FirebaseAuth.getInstance()signInWithCredential(credential)
                .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {

                        if (task.isSuccessful()) {
                            Log.d(TAG, "login success");
                        } else {
                            Log.d(TAG, "login error");
                        }

                    }
                });
Run Code Online (Sandbox Code Playgroud)

并实现AuthStateListener每次用户状态更改时触发的:

private FirebaseAuth.AuthStateListener authStateListener;

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        initAuthStateListener();

    }

private void initAuthStateListener() {

         authStateListener = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                FirebaseUser user = firebaseAuth.getCurrentUser();
                if (user == null) {
                    //user is not logged in
                } else {
                    //user is logged in 
                //logic to finish the activity and proceed to the app can be put here   
                }
            }
        };
    }

    @Override
    protected void onStart() {
        super.onStart();
        FirebaseAuth.getInstance().addAuthStateListener(authStateListener);
    }

    @Override
    protected void onStop() {
        super.onStop();
        FirebaseAuth.getInstance().removeAuthStateListener(authStateListener);
    }
Run Code Online (Sandbox Code Playgroud)

注意:添加到 firebase auth 实例 onAuthStateChanged时触发一次。authStateListener

另请确保Prevent creation of multiple accounts with the same email address在 Firebase 控制台上设置参数(身份验证 >> 登录方法 >> 高级 >> 每个电子邮件地址一个帐户(更改))。