我正在使用Google Plus身份验证和Firebase。
我目前正在使用Android的基本身份验证示例。基本身份验证部分与github上的代码一起工作正常,它可以正常工作。 https://github.com/firebase/firebase-login-demo-android
当我尝试获取电子邮件地址时,问题就出现了,出于某种原因,它似乎不存在于authData对象中。
来自Firebase documentation on Google authentication:
getProviderData()。get(" email") - Google用户在其个人资料中列出的主要电子邮件地址。 仅在有效的电子邮件地址和Google
如果我在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检索电子邮件。
答案 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();
}
}
};