我有一个基本的Firebase登录情况,其中包含以下代码:
STOP RUN
但是,在使用Android 7的模拟器上运行此操作会生成以下日志:
Log.d(TAG, "Entering black hole");
try {
FirebaseAuth.getInstance().signInWithEmailAndPassword(email, password)
.addOnCompleteListener(task -> {
Log.d(TAG, "Exiting black hole");
…
}).addOnFailureListener(new OnFailureListener() {
@Override public void onFailure(@NonNull Exception e) {
Log.d(TAG, "Exiting black hole");
…
}
});
} catch (Exception e) {
Log.e(TAG, "try/catch " + e);
}
意思是,FirebaseAuth代码进入,从不存在,让我的应用程序无限循环。我从日志中了解到谷歌播放服务已经过时,但在运行D/FirebaseController: Entering black hole
W/GooglePlayServicesUtil: Google Play services out of date. Requires 11925000 but found 11743470
D/EGL_emulation: eglMakeCurrent: 0x89b5a620: ver 2 0 (tinfo 0x89b5c680)
D/EGL_emulation: eglMakeCurrent: 0x89b5a620: ver 2 0 (tinfo 0x89b5c680)
W/DynamiteModule: Local module descriptor class for com.google.firebase.auth not found.
W/BiChannelGoogleApi: [FirebaseAuth: ] getGoogleApiForMethod() returned Gms: com.google.firebase.auth.api.internal.zzal@415e769
W/DynamiteModule: Local module descriptor class for com.google.firebase.auth not found.
W/GooglePlayServicesUtil: Google Play services out of date. Requires 12451000 but found 11743470
W/DynamiteModule: Local module descriptor class for com.google.firebase.auth not found.
W/GooglePlayServicesUtil: Google Play services out of date. Requires 12451000 but found 11743470
方法之前如何检查? .signInWithEmailAndPassword()
方法不允许传递版本号,似乎也不返回任何版本号。
答案 0 :(得分:1)
int v = getPackageManager().getPackageInfo(GoogleApiAvailability.GOOGLE_PLAY_SERVICES_PACKAGE, 0 ).versionCode;
这将返回播放服务版本,然后只需在.signInWithEmailAndPassword()
之前检查它。当您遇到2个Google Play服务(GPS)问题时,问题是由特定情况引起的。由于GPS也已禁用Google Play商店(GPT),因此无法在设备上运行。
如果您的Google Play服务已过期,请使用错误代码ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED(错误代码2)调用showErrorDialogFragment,该工作正常。
但如果您的GPS已被禁用且已过期,则googleApiAvailability api的工作方式存在问题。如果您调用isGooglePlayServicesAvailable(),它将返回找到的第一个错误,但不一定是错误你想先解决。问题是知道您需要先解决另一个错误。 isGooglePlayServicesAvailable()在这方面没有帮助。
在我的情况下,播放服务已被禁用,并且已过期。因此,方法是首先调用showErrorDialogFragment,然后您将获得SERVICE_VERSION_UPDATE_REQUIRED的响应错误代码。
Android将尝试通过发送pendingIntent来启动Google Play商店(GPT)以更新GPS来解决此问题,但这将失败,因为GPT依赖于ENABLED版本的GPS。因为你正在调用showErrorDialogFragment,所以它会在无法启动GPT后调用onActivityResult。
下一步是编辑onActivityResult。我需要再次测试isGooglePlayServicesAvailable()。如果仍然得到相同的错误代码(SERVICE_VERSION_UPDATE_REQUIRED),则需要在onActivityResult中再次调用showErrorDialogFragment,但这次要传递一个不同的错误代码ConnectionResult.SERVICE_DISABLED(错误代码3)。这将使用户首先启动应用程序管理员以启用Google Play服务。然后,当返回到应用程序时,您需要测试isGooglePlayServicesAvailable,然后它应该检测到谷歌服务仍然过时。如果您成功更新了应用程序,onActivityResult应该允许您确定Google PlayPlayServicesAvailable是否成功,您可以继续。请注意,您可能需要添加一个标记,以便您知道再次测试Google Play服务兼容性,而不是继续执行启动过程。
(所以,googleApiAvailability应该做的是首先返回已禁用的错误(即ConnectionResult.SERVICE_DISABLED又名错误代码3),这样您就可以在尝试更新GPS之前先解决此问题。)