如何提示用户更新Google Play服务?

10

我可以轻松地检测到我的设备需要更新Google Play服务应用,并使用getErrorDialogFragment()呈现提示用户更新它:

     GoogleApiAvailability googleApi = GoogleApiAvailability.getInstance();
     mServiceAvailabilityCode = googleApi.isGooglePlayServicesAvailable(this);
     if (mServiceAvailabilityCode == ConnectionResult.SUCCESS) {
          ...
     else {
        if (googleApi.isUserResolvableError(mServiceAvailabilityCode)) {
            switch (mServiceAvailabilityCode) {
                    ....
            case SERVICE_VERSION_UPDATE_REQUIRED:
                googleApi.showErrorDialogFragment(SplashActivity.this, mServiceAvailabilityCode, PLAY_SERVICES_RESOLUTION_REQUEST);
                break;
                    ....
                }

然而,如果Google Play服务被禁用并已过时,则用户会看到一个带有“更新”按钮的对话框,一旦用户按下该按钮,应用程序立即返回到OnActivityResult中,我可以像这样捕获响应和请求代码:

       @Override
       protected void onActivityResult(int requestCode, int mServiceAvailabilityCode, Intent data) {
          super.onActivityResult(requestCode, mServiceAvailabilityCode, data);
          switch (requestCode) {
          case PLAY_SERVICES_RESOLUTION_REQUEST:
                finish();
                // do i need to launch app manager-> app info for google play services ?
因此,用户在对话框上按“更新”按钮并未启动Android的Playstore并加载“Playstor服务”应用程序供用户更新,这正是我所期望的。按下“更新”后只会直接返回到onActivityResult。这就是我感到困惑的地方。Android难道不应该替我启动它吗?还是我必须在OnActivityResult中自己完成?
5个回答

15

这个问题是由特定情况引起的,当您的Google Play Services (GPS)出现2个问题时会发生。因为GPS也禁用了Google Play 商店 (GPT),所以设备上无法运行 GPT。

如果您的 Google Play Services 已过期,则调用 ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED(错误代码 2)的 showErrorDialogFragment 就可以解决问题。

但是,如果您的 GPS 不仅被禁用而且已过期,则使用 googleApiAvailability API 的方式会有问题。如果您调用 isGooglePlayServicesAvailable(),它会返回它找到的第一个错误,但这不一定是您想要首先解决的错误。问题在于知道您需要先解决另一个错误。 isGooglePlayServicesAvailable() 在这方面无法提供帮助。

在我的情况下,play services 被禁用并且已过期。因此,解决方法是首先调用 showErrorDialogFragment,然后您将获得 SERVICE_VERSION_UPDATE_REQUIRED 的响应错误代码。

Android 将尝试通过发送 pendingIntent 来启动 Google Play 商店 (GPT) 更新 GPS,但这将失败,因为 GPT 依赖于已启用的 GPS 版本。因为您正在调用 showErrorDialogFragment,所以在无法启动 GPT 后它将调用 onActivityResult。

下一步是编写onActivityResult。我需要再次测试isGooglePlayServicesAvailable()。如果你仍然得到相同的错误码(SERVICE_VERSION_UPDATE_REQUIRED),则需要在onActivityResult中再次调用showErrorDialogFragment,并传递一个不同的错误码ConnectionResult.SERVICE_DISABLED(错误码3)。这将带用户进入应用程序管理器,先启用google play服务。然后当返回到应用程序时,您需要测试isGooglePlayServicesAvailable,它应该检测到google服务仍然过时。如果您成功更新了应用程序,则onActivityResult应该允许您确定isGooglePlayServicesAvailable是否成功,并且您可以继续执行。请注意,您可能需要添加一个标志,以便您知道要再次测试google play服务的兼容性,而不是继续执行启动过程。
(所以,GoogleApiAvailability真正应该做的是首先返回禁用的错误(即ConnectionResult.SERVICE_DISABLED,也就是错误码3),以便您可以先解决它,然后再尝试更新GPS。)

@MSD 我已经成功地实现了这种方法。诀窍在于使用onActivityResult来测试是否存在多个错误,以确定GooglePlayServices是否已启用和更新。 - angryITguy

7
这对我有用。
GoogleApiAvailability googleAPI = GoogleApiAvailability.getInstance();
int result = googleAPI.isGooglePlayServicesAvailable(this);

if(result != ConnectionResult.SUCCESS) {
    if(googleAPI.isUserResolvableError(result)) {
       //prompt the dialog to update google play
  googleAPI.getErrorDialog(this,result,PLAY_SERVICES_RESOLUTION_REQUEST).show();

    }
}
else{
  //google play up to date
}

1
这并未回答问题。问题的前提是常规解决 Google Play 错误的方法已过时且失效,而您的回答并未解决此问题。在发布问题后,我提供了一个答案,并进行了大量测试,以验证 Google Play 同时过时和禁用的情况。请查看我的答案 -1。 - angryITguy

0

不确定谷歌在哪个版本中修复了此问题,但使用最新的11.6.0版本,您可以获取正确的statusCode和导致设置启用Google Play服务的对话框。

日志记录:

11-24 05:48:07.266 V/FA: Activity resumed, time: 2070779368
11-24 05:48:07.320 W/FA: Service connection failed: ConnectionResult{statusCode=SERVICE_DISABLED, resolution=null, message=null}

对话框: 在此输入图像描述


问题出在9.6+版本上,是GPS解决方式的问题。请阅读我的解决方案以了解详情。 - angryITguy

-1

请仔细阅读我的问题和答案,以了解GPS处理版本和状态多个问题的方式是有问题的。您提供的答案并没有解决这个问题。 - angryITguy
在这种情况下,您能否更改您的问题标题?@angryITguy - Saba
我会这样做,如果stackoverflow假设每个人都只会根据标题回答问题,但我们并不是这样的,这就是为什么你应该像其他人一样阅读详细信息。 - angryITguy
@angryITguy 如果标题误导了搜索或打开此链接的人,他们可能会感到困惑。至于答案,是我的错。 - Saba
哈。两年来,数千次的浏览中,你是第一个认为它具有误导性的人。请离开。 - angryITguy

-1

Google Play Services 可以在 Play 商店 上下载和更新。您可以简单地打开 Play 商店

这里 是服务的链接。

您可以启动带有 ACTION_VIEW 意图的活动,如下所示:

String LINK_TO_GOOGLE_PLAY_SERVICES = "play.google.com/store/apps/details?id=com.google.android.gms&hl=en";
try {
    startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://" + LINK_TO_GOOGLE_PLAY_SERVICES)));
} catch (android.content.ActivityNotFoundException anfe) {
    startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://" + LINK_TO_GOOGLE_PLAY_SERVICES)));
}

如何前往Google Play商店更新Google Play服务并不是问题。 - angryITguy
那么问题是什么?如果打开应用程序管理器是问题,最终也会导致 Play 商店。 - Waqas Ahmed Ansari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接