如何检查 android 设备在 10.2 或更高版本上是否有 google 播放服务 运行

How to check the whether the android device has google play services running on 10.2 or greater

根据 google 官方页面上的文档,SMSRetriever api 需要 google 在设备上播放服务至少 10.2。

Prerequisites

The SMS Retriever API is available only on Android devices with Play services version 10.2 and newer. https://developers.google.com/identity/sms-retriever/request#2_start_the_sms_retriever

如何实施检查?我也检查了方法

public int isGooglePlayServicesAvailable (Context context, int minApkVersion)

GoogleApiAvailability class。但是现在又一次,在 google 播放服务 10.2 的情况下,minApkVersion 的值是多少。任何人都请让我知道如何以最好的方式实现这一点。

SmsRetrieverClient 遵循较新的 GoogleApi 连接模式,因此您不必担心版本兼容性问题,因为底层框架会为您处理所有问题。

通过向这些返回任务的 API 调用 (https://developers.google.com/android/reference/com/google/android/gms/tasks/Task) 添加侦听器而不是事先检查可用性,专门处理失败案例实际上可能是更好的用户体验。

我知道这是一个老问题,已经回答了。但我需要写这个以备记录。


情况:

在我的例子中,galaxy S2(google 播放服务版本 3.1.59),我无法从 addOnSuccessListeneraddOnFailureListener 得到响应。此外,未调用 addOnCompleteListeneraddOnCanceledListener


我尝试了什么:

我想将isGooglePlayServicesAvailableminApkVersion一起使用,但是没有google播放服务的版本历史列表!


我的解决办法是

使用 isGooglePlayServicesAvailable 而不使用 minApkVersion。我的意思是已弃用的方法。在该方法中,它正在检查 google 播放版本与 GOOGLE_PLAY_SERVICES_VERSION_CODE,这是已安装的 google 播放服务。

@HideFirstParty
@KeepForSdk
public int isGooglePlayServicesAvailable(Context var1) {
    return this.isGooglePlayServicesAvailable(var1, GOOGLE_PLAY_SERVICES_VERSION_CODE);
}

只是解决版本比较的问题。

 public boolean onCreate(Bundle savedInstanceState){
            super.onCreate(savedInstanceState);
            if (googlePlayServiceEnabled() && isWithSMSRetrieverSupportedPlayServiceVersion()){
                //Good to go
                return true;
            }
            else{
                return false;
            }
    }

检查 GooglePlay 服务是否已启用并显示正确的错误对话框。

private boolean googlePlayServiceEnabled() {
        try {
            GoogleApiAvailability instance = GoogleApiAvailability.getInstance();
            int responseCode = instance.isGooglePlayServicesAvailable(context);
            switch (responseCode) {
                case ConnectionResult.SUCCESS:
                    return true;
                default:
                    Dialog errorDialog = instance.getErrorDialog(this, responseCode, 123);
                    errorDialog.setCancelable(false);
                    errorDialog.show();
                    break;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
}

隐式获取已安装的播放服务版本并将其与10.2

进行比较
private boolean isWithSMSRetrieverSupportedPlayServiceVersion() {
        try {
            PackageInfo pi = getPackageManager().getPackageInfo(GoogleApiAvailability.GOOGLE_PLAY_SERVICES_PACKAGE, 0);
            if (pi == null)
                return false;
            if (pi.versionName == null || pi.versionName.isEmpty())
                return false;

            String playServicesVersion = pi.versionName;
            return isPlayServicesVersionValidForSMSRetriever(playServicesVersion);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

public static boolean isPlayServicesVersionValidForSMSRetriever(String v) {
        try {
            String index1 = v.substring(0, v.indexOf('.', 0));

            int versionInt1 = Integer.parseInt(index1);
            if (versionInt1 < 10)
                return false;
            else if (versionInt1 == 10) {
                String index2 = v.substring(3, 4);
                int versionInt2 = Integer.parseInt(index2);
                if (versionInt2 < 2) {
                    return false;
                } else {
                    return true;
                }
            } else
                return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }