代码之家  ›  专栏  ›  技术社区  ›  Grzegorz Adam Hankiewicz

我怎样才能避免FireBase由于糟糕的Play Services版本而进入无限循环?

  •  0
  • Grzegorz Adam Hankiewicz  · 技术社区  · 8 年前

    我有一个基本的firebase登录情况,代码如下:

        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);
        }
    

    但是,在安卓7的仿真器上运行它会生成以下日志:

    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
    

    也就是说,firebaseauth代码输入和 从未 存在,将我的应用程序留在一个无休止的循环中。我从日志中了解到Google Play服务已经过时,但是在运行 .signInWithEmailAndPassword() 方法?这个 isGooglePlayServicesAvailable() 方法不允许传递版本号,似乎也不返回任何版本号。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Jinson Paul    8 年前
    int v = getPackageManager().getPackageInfo(GoogleApiAvailability.GOOGLE_PLAY_SERVICES_PACKAGE, 0 ).versionCode; 
    

    这将返回播放服务版本,然后只需检查之前的程序即可。使用电子邮件和密码()登录

    这个问题是由一个特定的条件造成的,当你有2个问题与谷歌播放服务(GPS)。因为GPS也被禁用了谷歌播放商店(GPT),所以不会在设备上运行。

    如果您的Google Play服务已过期,则使用connectionResult.service_version_update_required(错误代码2)的错误代码调用ShowErrorDialogFragment,这很好。

    但是,如果您的GPS同时被禁用和过期,那么googleapiavilability API的工作方式存在问题。如果您调用isgoogleplayservicesavailable(),它将返回找到的第一个错误,但这不一定是您希望首先解决的错误。问题是知道您还有另一个错误需要首先解决。isGooglePlayServicesAvailable()在这方面没有帮助。

    在我的例子中,游戏服务既被禁用,又过时。因此,方法是首先调用ShowErrorDialogFragment,然后您将获得服务\版本\所需更新\的响应错误代码。

    Android将试图通过发送一个挂起的内容来启动Google Play Store(GPT)来更新GPS来解决这个问题,但这将失败,因为GPT依赖于启用的GPS版本。因为您正在调用ShowErrorDialogFragment,所以在它无法启动GPT之后,它将调用OnActivityResult。

    下一步是对OnActivityResult进行编码。我需要再次测试isGooglePlayServicesAvailable()。如果您仍然获得相同的错误代码(需要服务\u version_update_),那么您需要在OnActivityResult中再次调用ShowErrorDialogFragment,但这次传递一个不同的错误代码,connectionResult.service_disabled(错误代码3)。这将带用户到应用程序管理器,首先启用Google Play服务。然后,当返回应用程序时,您需要测试isgoogleplayservicesavailable,然后它应该检测到google服务仍然是过时的。如果您成功地更新了应用程序,那么onActivityResult应该允许您确定isGooglePlayServicesAvailable是成功的,您可以继续。请注意,您可能需要添加一个标志,以便您知道要再次测试Google Play服务的兼容性,而不是继续执行启动过程。

    (因此,googleapiavilability真正应该做的是首先返回禁用的错误(即connectionresult.service_disabled aka error code 3),这样您可以在尝试更新GPS之前先解决这个问题。)