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

时间:2015-01-03 00:24:41

标签: android firebase google-plus google-play-services firebase-authentication

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

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

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

来自Firebase documentation on Google authentication

  

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()'在空对象引用上

此外,在Android Studion with Debug on中,当我查看authData对象时,未设置电子邮件,但其他值为 - 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 个答案:

答案 0 :(得分:1)

听起来您需要申请包含电子邮件的其他范围。如果您添加该范围,则可以使用getProviderData()访问电子邮件。

<强>为什么

Google+ Sign-in for Android请求一组默认范围。默认情况下,此集不包含电子邮件。

如何

根据文档here初始化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+ Sign-In scopes的列表。

答案 1 :(得分: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);
    }

答案 2 :(得分:0)

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

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

这应该获取用户电子邮件地址。 <uses-permission android:name="android.permission.GET_ACCOUNTS" />足以获得许可,因此您无需添加任何权限或范围。

答案 3 :(得分:0)

您可以从Plus对象获取用户的电子邮件,如下所示:

n

答案 4 :(得分:0)

您可以通过Firebase身份验证服务获取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();
            }
        }
    };