- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
正如标题所说,我无法获取已登录用户的电子邮件地址。我使用多帐户系统,但无论用户是仅使用一个还是所有可用的身份验证提供程序(Facebook、Twitter、Google、电子邮件;除电子邮件外,一切正常)。我没有从任何提供商那里得到电子邮件地址。
我发现唯一与我的问题有点相关的帖子是 this .但它指的是旧版本的 Firebase。
到目前为止我做了什么:
我没有收到任何错误,电子邮件对象只是“空”。
让我们专注于一个供应商,我想他们的问题都是一样的,如果不是,我会一一解决。
因为它最容易调试,所以我想我会选择 Google+:
登录是通过扩展 AppCompatActivity 的 SignInActivity 发生的,我的 MainActivity 通过 startActivityForResult() 调用它。
这是我的 Google 按钮设置:
// Configure Google Sign In
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestEmail()
.requestProfile()
.build();
// Build a GoogleApiClient with access to the Google Sign-In API and the
// options specified by gso.
mGoogleApiClient = new GoogleApiClient.Builder(this)
.enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
在 onClickListener 中,我为 Google+-SignIn-Button 传递了这两行:
Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
startActivityForResult(signInIntent, config.GOOGLE_SIGN_IN_REQUEST_CODE);
Google+ 部分的我的 onActivityResult:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == config.GOOGLE_SIGN_IN_REQUEST_CODE && resultCode == Activity.RESULT_OK){
Log.d(TAG,"onActivityResult: "+data.toString());
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
handleGoogleSignInResult(result);
return;
}
}
handleGoogleSignInResult() 函数:
private void handleGoogleSignInResult(GoogleSignInResult result) {
Log.d(TAG, "handleSignInResult: " + result.isSuccess());
if (result.isSuccess()) {
// Signed in successfully, show authenticated UI.
GoogleSignInAccount acct = result.getSignInAccount();
Log.d(TAG,getString(R.string.signed_in_with_google));
AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(),null);
linkAccounts(credential);
}
}
和 linkAccounts() 函数:
public void linkAccounts(final AuthCredential credential){
if (config.mFirebaseAuth == null || config.mFirebaseUser == null ){
config.mFirebaseAuth = FirebaseAuth.getInstance();
config.mFirebaseUser = config.mFirebaseAuth.getCurrentUser();
}
if (config.mFirebaseUser != null){
config.mFirebaseUser.linkWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
// If sign in fails, display a message to the user. If sign in succeeds
// the auth state listener will be notified and logic to handle the
// signed in user can be handled in the listener.
if (!task.isSuccessful()) {
Log.d(TAG,"Authentication failed.");
try {
throw task.getException();
} catch(FirebaseAuthInvalidCredentialsException e) {
//Es ist ein Problem mit den Credentials aufgetreten
Log.d(TAG,"Die Credentials haben ein Problem verursacht.");
e.printStackTrace();
setResult(Activity.RESULT_CANCELED);
supportFinishAfterTransition();
} catch(FirebaseAuthUserCollisionException e) {
//User existiert bereits in der Datenbank -> kombiniere diesen mit dem neuen Account manuell
//Hierfür müssen die Daten des aktuellen Users beim alten, bereits vorhandenen User eingetragen und der aktuelle User abgemeldet werden.
Log.d(TAG,"User bereits vorhanden! Daten müssen manuell zusammengeführt werden.");
e.printStackTrace();
mergeExistingAccounts(credential);
setResult(Activity.RESULT_OK);
supportFinishAfterTransition();
} catch(Exception e) {
Log.e(TAG, e.getMessage());
mergeExistingAccounts(credential);
setResult(Activity.RESULT_CANCELED);
supportFinishAfterTransition();
}
}else{
setResult(Activity.RESULT_OK);
supportFinishAfterTransition();
}
}
});
}else{
//der User ist "null" -> es ist ein unerwarteter Fehler aufgetreten
//TODO: Lösung finden!
Log.e(TAG, "SignInDialog:linkAccounts(): Der User ist 'null', Accounts können nicht verlinkt werden!");
setResult(Activity.RESULT_CANCELED);
supportFinishAfterTransition();
}
}
我无法在第一次登录时收到电子邮件,所以 mergeExistingAccounts()
并没有真正发挥作用,这就是为什么我暂时不考虑它的原因,它还没有完成,只需要负责将一些帐户信息从匿名帐户传递到“重新登录”的 Google+ 帐户(在退出或在另一台设备上登录之前已经登录)。
onConnectionFailed
目前只是一个带有“Log.e()”语句的调试工具,它不会被触发。
对于德国人的评论,我深表歉意,它加快了我的开发速度,但对于在这里发布问题不太有用。我想对于 future 的项目,出于这个原因我会再次坚持使用英文评论。
请告诉我您可能需要哪些其他信息来帮助我。
先谢谢大家!!!
编辑:我刚刚发现...
acct.getEmail()
...在 handleGoogleSignInResult()
函数中,我可以访问电子邮件地址。看起来它只是没有传递给 GoogleAuthCredential。 :-/
最佳答案
如果 firebase 用户没有显示,您可以通过这种方式获取所有可用的提供者数据:
FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
List<? extends UserInfo> providerData = firebaseUser.getProviderData();
String email = providerData.get(1).getEmail();
providerData
是一个包含更多数据的列表,您会在索引 1 处找到电子邮件。
其他数据是:
providerData.get(1).getDisplayName();
providerData.get(1).getPhoneNumber();
providerData.get(1).getPhotoUrl();
providerData.get(1).getProviderId();
providerData.get(1).getUid();
关于android - 无法从 FirebaseUser.getProviderData() 检索电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41050862/
我正在使用 Firebase 开发 Android 应用程序,并启用了电话号码身份验证作为用户登录方法。这一切都很好。 在我的应用程序中,我有一个帐户详细信息页面,允许用户编辑他们的信息并更新他们在
我是Flutter的新手。我的 Firebase Auth / Google Auth 有问题 未定义FirebaseUser的 码: FirebaseAuth _auth = FirebaseAut
我是Flutter的新手。我的 Firebase Auth/Google Auth 有问题 未定义FirebaseUser的 代码: FirebaseAuth _auth = FirebaseAuth
我在 Android 上使用 Firebase Auth。 我的登录流程工作正常,但我无法立即更新 username 和 profileUrl。 public void test() { St
每当我在onPressed函数中调用此函数(_sendToServer)时,都会出现此错误。 错误:无法将参数类型“类型”分配给参数类型“FirebaseUser”。 (在[robic] lib \
我有一个集中了所有身份验证的静态 AuthProvider 类。 我有以下注册码。 AuthResult newUser = await auth.createUserWithEmailAndPa
我有一个集中了所有身份验证的静态 AuthProvider 类。 我有以下注册码。 AuthResult newUser = await auth.createUserWithEmailAndPa
在加载 FirebaseUser 信息的 showdata 方法中,我为 uInfo 设置了空值,我运行应用程序并使用 User_02 登录,调试显示:ds.getChild(userId) 到达正确
我有一个链接到 Firebase 的 Android 项目,我正在尝试关注 Firebase tutorial使用 firebase.auth 包设置 Firebase 身份验证。 问题 我需要一个
我在 Android Studio 上工作,试图将我通过 Google 登录获得的来自 FirebaseUser 的图像显示到 ImageView 中。 private void setUserDat
如何验证 FirebaseAuth.instance.currentUser() 仍然存在于 Firebase 身份验证(服务器端)中? 我在我的 Firebase 控制台中删除了用户,但 Fireb
我的 Firebase 身份验证是基于电子邮件的(登录和注册仅需要电子邮件和密码),由 Firebase 随后进行管理。 我的 RegistrationActivity 也要求提供电子邮件、密码和姓名
我的应用中有 2 个 Activity 。我还有一个登录按钮,单击该按钮时将调用此方法: private void signIn() { firebaseAuth.signInAnonymou
正如标题所说,我无法获取已登录用户的电子邮件地址。我使用多帐户系统,但无论用户是仅使用一个还是所有可用的身份验证提供程序(Facebook、Twitter、Google、电子邮件;除电子邮件外,一切正
我正在尝试获取当前在我的应用程序中登录的当前 firebase 用户的创建日期。所以我使用下面的代码: FirebaseAuth.getInstance().getCurrentUser().getM
我已经使用电话身份验证对我的用户进行了身份验证,并且在我调用 user.getUid() 时返回的用户对象具有这个长字符串: dn27dhJK.....(一些长字符串)。 如果我在其他设备上验证此用户
我试图从他/她存储在 FirebaseDatabase 中的 UID 中获取 FirebaseUser,但似乎没有允许这样做的方法。 我正在尝试这样做,因为我的应用程序中有一个选项允许用户更新他们的个
我想做什么 我正在尝试删除用户图像(通过设置 photoUrl = null)。这是我的代码: final UserUpdateInfo updatedInfo = UserUpdateInf
我有以下使用一台物理设备的情况: 用户使用 (123)-456-7890 电话号码进行身份验证并登录应用。用户在 Firebase 身份验证中创建了“用户 UID”。 现在我进入应用程序信息-->清除
我应该如何将现有用户帐户与不同提供商但同一电子邮件地址关联起来?例如 Google 和 Facebook。 public void handleFacebookAccessToken(final Ac
我是一名优秀的程序员,十分优秀!