【问题标题】:Signout using firebase in Android Studio: getProviderData() returns null在 Android Studio 中使用 firebase 注销:getProviderData() 返回 null
【发布时间】:2018-12-17 17:34:24
【问题描述】:

我是 android 的新手,我使用 Firebase 创建了一个简单的登录方法,其中包括使用电子邮件、Facebook 和 google 登录。我创建了波纹管退出功能。但是当我单击注销方法时,第二次它不要求对 facebook 和 google 进行身份验证。有谁能够帮助我!如果有任何问题请不要惊慌,我对此很陌生。

private void OnClickSignOut(){
    sign_out_btn =(Button)findViewById(R.id.logout_btn);
    finish();
    //startActivity(new Intent(ProfileActivity.this,MainActivity.class));
    sign_out_btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            FirebaseAuth.getInstance().signOut();

            for (UserInfo user: FirebaseAuth.getInstance().getCurrentUser().getProviderData()) {
                if (user.getProviderId().equals("facebook.com")) {
                    System.out.println("User is signed in with Facebook");
                    LoginManager.getInstance().logOut();
                    startActivity(new Intent(ProfileActivity.this,MainActivity.class));
                }
                else if(user.getProviderId().equals("google.com")){
                    mGoogleSignInClient.signOut().addOnCompleteListener(ProfileActivity.this,
                            new OnCompleteListener<Void>() {
                                @Override
                                public void onComplete(@NonNull Task<Void> task) {
                                    startActivity(new Intent(ProfileActivity.this,MainActivity.class));
                                }
                            });
                }
                else{
                    startActivity(new Intent(ProfileActivity.this,MainActivity.class));
                }
            }
        }
    });
}

【问题讨论】:

  • 在设置 onClick 监听器之前有一个finish() 语句。侦听器中的代码是否正在执行?
  • @TheGamer007 感谢您的指出。我在每个 startActivity 命令之后移动了完成。但是 getProviderData() 返回 null 并且应用程序正在崩溃。我该如何处理?
  • 您能发布确切的错误日志吗? getProviderData 通常返回一个空列表而不是 null AFAIK。也许getCurrentUser 是返回null 的那个?
  • @TheGamer007 谢谢!你怀疑它是正确的。 getCurrentUser 返回 null。这是因为在第一条语句本身中我退出了用户,然后我正在检查当前用户。我现在有另一个问题,我可以正确地检查用户是否使用 facebook 登录,但是如果用户使用 google 帐户登录,我无法检查相同的问题。你能帮我解决这个问题吗?
  • 根据文档,Google 的提供商 ID 确实是“google.com”。请检查是否正在输入该代码块(通过放置断点或日志语句)。还要检查if-else块之前getProviderId的输出,以便我们手动验证。

标签: android firebase firebase-authentication google-authentication


【解决方案1】:

虽然最初的问题是通过改变finish语句的位置来解决的。 但是在修改代码后,我遇到了其他问题。标识符返回 google.com 但不进入循环。在第二次单击注销按钮时,应用程序崩溃。下面是代码和LogcatLogcat

                for (UserInfo user: FirebaseAuth.getInstance().getCurrentUser().getProviderData()) {
                   Log.d("***************1.Check provider "+user.getProviderId(),"check");
                    if (user.getProviderId().equals("facebook.com")) {
                        FirebaseAuth.getInstance().signOut();
                        System.out.println("User is signed in with Facebook");
                        LoginManager.getInstance().logOut();
                        startActivity(new Intent(ProfileActivity.this,MainActivity.class));
                        Log.d("Signout","Facebook Clicked");
                        finish();
                    }
                    Log.d("***************2.Check provider "+user.getProviderId(),"check");
                    if(user.getProviderId().equals("google.com")){
                        FirebaseAuth.getInstance().signOut();
                        mGoogleSignInClient.signOut().addOnCompleteListener(ProfileActivity.this,
                                new OnCompleteListener<Void>() {
                                    @Override
                                    public void onComplete(@NonNull Task<Void> task) {
                                        System.out.println("User is signed in with Google");
                                        startActivity(new Intent(ProfileActivity.this,MainActivity.class));
                                        Log.d("****Signout","Google Clicked");
                                        finish();
                                    }
                                });
                    }
                    else{
                        FirebaseAuth.getInstance().signOut();
                        startActivity(new Intent(ProfileActivity.this,MainActivity.class));
                        System.out.println("User is signed in with email");
                        Log.d("****Signout","email signedout");
                        finish();
                    }
                }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-13
    • 2023-03-25
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    • 2014-12-23
    相关资源
    最近更新 更多