2017-05-08 71 views
10

我正在尝试重新安装一个Android应用程序登录Facebook。最初我使用Google注册并成功将其与Firebase链接。使用Facebook登录如果帐户已经在谷歌首次注册时与谷歌链接Android版

但是当我尝试与Facebook做它给出了一个

FirebaseAuthUserCollisionException 

我在Firebase Documentation阅读,您可以通过

FirebaseUser prevUser = currentUser; 
currentUser = auth.signInWithCredential(credential).await().getUser(); 
// Merge prevUser and currentUser accounts and data 
// ... 

但这里await()方法已不存在这样做的。还搜索了一下后,我发现了这个解决方案

Tasks.await(mAuth.signInWithCredential(credential)).getUser(); 

但是,让这已经是链接的当前用户时,这也提供了一个错误。我能做些什么来解决这个问题?

+3

我不确定,所以我不会将其作为答案发布,但我确实知道在Firebase控制台的“身份验证”>“登录方法”下的高级底部,有一个地方可供配置允许多个帐户到相同的地址。由于您链接的文档说您必须先使用身份验证流程进行登录,您必须有能力使用同一电子邮件创建多个帐户,然后才能合并它们。 https://support.google.com/firebase/answer/6400716?hl=zh-CN –

+0

Jen Person正确 – faruk

+0

如何合并帐户@faruk – Shubham

回答

0

.await()方法无需获取Firebase用户。
改为使用FirebaseAuth.AuthStateListener

所以要实现火力点登录的东西是这样的:

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"); 
         } 

        } 
       }); 

并实行AuthStateListener这是trigerred每个用户状态发生变化时:

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

注:onAuthStateChanged是trigerred一次当authStateListener被添加到firebase身份验证实例。

同时确保Prevent creation of multiple accounts with the same email address参数设置火力控制台(认证>>登录方法>>高级>>每个电子邮件地址(更改)一个账户)上。

+0

当用户使用Google plus注册后,这无济于事id..it给出了FirebaseAuthUserCollisionException。然后,我们需要合并两个帐户,这些帐户要求使用awaits()。但我无法成功地使用它 – Shubham

+0

当你登录谷歌,然后使用相同的电子邮件登录facebook,firebase将这些帐户默认链接到一个(也检查是否在我的答案底部提到的设置设置为您的项目的Firebase控制台) – dzikovskyy

+0

默认情况下链接不会发生 – Shubham