如何避免Firebase因糟糕的Play服务版本而进入无限循环?

时间:2018-05-28 15:00:52

标签: android firebase firebase-authentication

我有一个基本的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()方法不允许传递版本号,似乎也不返回任何版本号。

1 个答案:

答案 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之前先解决此问题。)