我已经在我的Moto G5 +(作品)和Nexus 6(不起作用)上对此进行了测试,而我的firebase身份验证仅适用于其中一个:
mAuth = FirebaseAuth.getInstance();
if(mAuth.getCurrentUser() == null) { //No existing user
mAuth.signInAnonymously().addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.v("myTag", "Cannot authenticate user" + e);
}
});
}
if(mAuth.getCurrentUser() != null) {
Log.v("myTag", "Boutta take photos");
takePhoto(this, 0);//back camera
}else{
Log.v("myTag", "Cannot take photos, user not authenticated");
}
奇怪的是,我只获取日志Cannot take photos, the user not authenticated
,而不是日志Cannot authenticate user
。这意味着我可以对用户进行身份验证,但由于某种原因,它无法正常工作
为什么这只适用于某些设备?
答案 0 :(得分:2)
假设您的用户启动未经身份验证,一旦调用了第一个if
语句并尝试匿名登录,匿名登录就会在等待回调时异步发生。因此,在该状态下,在回叫完成之前,用户未经过身份验证。然后代码跳转到你检查的第二组if / else语句
mAuth.getCurrentUser() != null
但是仍然可能没有返回用于身份验证的回调,并且您的mAuth.getCurrentUser()
仍然为null,因此跳转到else语句并记录Log.v("myTag", "Cannot take photos, user not authenticated");
您的回调可能会返回对用户进行身份验证,但此时已为时已晚。假设未使用身份验证,您已经运行了逻辑。
答案 1 :(得分:0)
@martinomburajr给我带来了正确的答案!只是详细说明他的解决方案,以防其他人在将来遇到同样的问题,我需要等到认证成功后才能完成:
mAuth = FirebaseAuth.getInstance();
if(mAuth.getCurrentUser() == null) { //No existing user
Log.v("myTag", "Boutta authenticate");
mAuth.signInAnonymously().addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
}
}).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if(mAuth.getCurrentUser() != null) {
//TAKE PHOTO HERE INSTEAD
takePhoto(c, 0);//back camera
}else{
Log.v("myTag", "Cannot take photos, user not authenticated");
}
}
});
}else {
Log.v("myTag", "aalready authenticated!");
takePhoto(c, 0);//back camera
frontOrBack = 0;
}
}
当我放置与身份验证相关的代码(在这种情况下,为了拍照)时,我没有给我的应用足够的时间来从Firebase获得响应。但是,我没有假设用户已通过身份验证,而是通过将身份验证相关的代码放在OnCompleteListener
中来解决此问题。非常感谢@martinomburajr的有益答案!