我正在开发一款使用Firebase`作为BaaS的应用。
我已整合Google登录,但我想获取用户名,电子邮件地址和个人资料照片。
我已成功获取名称和个人资料照片,但我无法获取电子邮件地址。
以下是Google API客户端设置:
/* Setup the Google API object to allow Google+ logins */
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(Plus.API)
.addScope(Plus.SCOPE_PLUS_LOGIN)
.build();
以下是我为获取用户数据所做的工作:
public void fetchDataFromGoogle() {
if (authData != null) {
if (authData.getProvider().equals("google")) {
googleName = (String) authData.getProviderData().get("displayName");
googleEmail = (String) authData.getProviderData().get("email");
googleImage = (String) authData.getProviderData().get("profileImageURL");
}
} else {
Toast.makeText(getBaseContext(), "error", Toast.LENGTH_LONG).show();
}
}
此代码已成功提取名称和个人资料照片,但它正在返回null
作为电子邮件地址。
请告诉我这里出了什么问题。
答案 0 :(得分:3)
不确定是否是你的情况,但是你可以获得其他字段但getEmail返回null的一种情况是在Firebase控制台>身份验证>登录方法您允许"使用相同的电子邮件地址创建多个帐户"
已经向谷歌提交了closed bug report:
当您转到验证> Firebase控制台中项目的登录方法页面。你有每个电子邮件地址一个帐户打开还是关闭?如果您允许每个电子邮件地址使用多个帐户,则对于FirebaseUser,您将为空。 getEmail()
您必须使用以下选项:"使用相同的电子邮件地址防止创建多个帐户"否则 FirebaseUser.getEmail()将返回null
Ps:只有在关闭选项后首次登录的用户才能成功使用此方法
答案 1 :(得分:0)
您还需要申请email
范围。来自Firebase documentation for Google authentication:
以下是Google登录的示例,其中会话将在浏览器关闭时到期,我们还会请求扩展电子邮件权限:
var ref = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com");
ref.authWithOAuthPopup("google", function(error, authData) { /* Your Code */ }, {
remember: "sessionOnly",
scope: "email"
});