Firebase、Android、Google Plus 登录 - 无法检索用户的电子邮件地址

3

我正在尝试使用Google Plus身份验证和Firebase。

目前,我正在通过Android进行基本的身份验证示例。基本身份验证部分可以使用github上的代码正常工作,它按预期工作。https://github.com/firebase/firebase-login-demo-android

问题出现在我试图获取电子邮件地址时,由于某种原因它似乎不存在于authData对象中。

来自Firebase有关Google身份验证的文档:

getProviderData().get("email") - Google用户在其个人资料上列出的主要电子邮件地址。仅在有效的电子邮件地址可用且用户授予了Google“email”权限时返回。

如果我在activity_main.xml中添加一个textview ..... .....

然后在MainActivity.java中的代码中:

private void setAuthenticatedUser(AuthData authData) {
    if (authData != null) {
    /* Hide all the login buttons */
    ......
    mLoggedInStatusTextView.setVisibility(View.VISIBLE);
    mEmailTextView = (TextView) findViewById(R.id.email_textView);
    mEmailTextView.setText(authData.getProviderData().get("email").toString());
    mEmailTextView.setVisibility(View.VISIBLE);
    ......
}

我遇到了一个错误: 尝试在空对象引用上调用虚拟方法'java.lang.String java.lang.Object.toString()'
此外,在开启Debug的Android Studio中,当我查看authData对象时,email未设置,但其他值都已设置——auth、provider、providerData、token、uid、expires等。
除了获取电子邮件地址之外,一切似乎都运行良好。我不确定是否需要任何其他权限。在我的AndroidManifest.xml文件中,我有以下内容:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />

根据我所阅读的,GET_ACCOUNTS权限应该足够了。Firebase为什么似乎无法获取它?

补充说明:此外,我能够将我的用户数据保存到Firebase https://www.firebase.com/docs/android/guide/user-auth.html#section-storing

if(authData.getProviderData().containsKey("email")) {
    map.put("displayName", authData.getProviderData().get("email").toString());
}

那么这个电子邮件值始终为空,因此根本没有从Google Plus检索电子邮件。

5个回答

1
似乎您需要请求一个包含电子邮件的附加范围。如果添加了该范围,您将能够使用getProviderData()访问电子邮件。
为什么? Google+ Android登录请求默认一组范围。默认情况下,此集合不包括电子邮件。
如何做?
这些范围在初始化GoogleApiClient时定义,如此处所述。指定电子邮件范围。
mGoogleApiClient = new GoogleApiClient.Builder(this)
    .addConnectionCallbacks(this)
    .addOnConnectionFailedListener(this)
    .addApi(Plus.API)
    .addScope(Plus.SCOPE_PLUS_LOGIN)
    .addScope("email") // <-- This requests the email address
    .build();

文档还包含常用的Google+登录范围列表。


1
我这周遇到了这个问题。即使添加了所需的范围,我仍然无法访问用户的电子邮件。无论我添加了什么范围,authData回调始终具有相同的字段。
我尝试过 .addScope(new Scope("email")).addScope(new Scope("https://www.googleapis.com/auth/plus.profile.emails.read")) 但是没有任何成果。
我唯一成功检索到用户电子邮件的方法是使用Google的onConnected方法并在那里请求用户的电子邮件。
if (Plus.PeopleApi.getCurrentPerson(mGoogleApiClient) != null) {
        String email = Plus.AccountApi.getAccountName(mGoogleApiClient);
        Log.i("email", email);
    }

谢谢你。这基本上就是我最终做的事情。虽然我不确定再进行一次调用对性能有什么影响,但至少现在它可以工作了。 - Chris

0

您可以使用除了getProviderData().get("email")之外的其他方法来获取用户电子邮件。

String email = Plus.AccountApi.getAccountName(mGoogleApiClient);

这将获取用户的电子邮件地址。

<uses-permission android:name="android.permission.GET_ACCOUNTS" />足以获得权限,因此您不需要添加任何权限或范围。


0
您可以通过以下方式从 Plus 对象获取用户的电子邮件:
if (mGoogleApiClient.isConnected()) {
    String email = Plus.AccountApi.getAccountName(mGoogleApiClient);
}

0

您可以通过Firebase Auth服务获取Firebase用户的电子邮件。

 FirebaseAuth.AuthStateListener mAuthListener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
            FirebaseUser user = firebaseAuth.getCurrentUser();
            if (user != null) {
              String email = user.getEmail();
            }
        }
    };

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接