Как узнать версию сервисов Google Play?

95

В моем приложении мне нужно проверить версию сервисов Google Play (которая установлена ​​на устройстве пользователя). Является ли это возможным ? И если да, то как я могу это сделать? Я искал в Google, но ничего не нашел!

Араш Хоейни
источник

Ответы:

95

Я нашел простое решение:

int v = getPackageManager().getPackageInfo(GoogleApiAvailability.GOOGLE_PLAY_SERVICES_PACKAGE, 0 ).versionCode;

Но versionCodeне рекомендуется в API 28, поэтому вы можете использовать PackageInfoCompat:

long v = PackageInfoCompat.getLongVersionCode(getPackageManager().getPackageInfo(GoogleApiAvailability.GOOGLE_PLAY_SERVICES_PACKAGE, 0 ));
yital9
источник
6
Как узнать код версии игровых сервисов версии 10.2
Манмохан Сони
Поскольку версия versionCode устарела с API28, вы должны использовать PackageInfoCompat.getLongVersionCode
G00fY
52

Если вы посмотрите ссылку, предоставленную Stan0, вы увидите следующее :

public static final int GOOGLE_PLAY_SERVICES_VERSION_CODE

Минимальная версия пакета сервисов Google Play (объявленная в AndroidManifest.xml android: versionCode) для совместимости с этой версией клиента. Постоянное значение: 3225000 (0x003135a8)

Итак, когда вы устанавливаете это в своем манифесте, а затем вызываете isGooglePlayServicesAvailable(context):

public static int isGooglePlayServicesAvailable (Context context)

Проверяет, что сервисы Google Play установлены и включены на этом устройстве, и что версия, установленная на этом устройстве, не старше той, которая требуется для этого клиента.

Возврат

  • код состояния, указывающий, произошла ли ошибка. Может быть один из следующих в ConnectionResult: SUCCESS, SERVICE_MISSING, SERVICE_VERSION_UPDATE_REQUIRED, SERVICE_DISABLED, SERVICE_INVALID.

Это гарантирует, что устройство использует версию, которая требуется вашему приложению, в противном случае вы можете принять меры в соответствии с документацией.

редактировать

GooglePlayServicesUtil.isGooglePlayServicesAvailable()устарел, и теперь его GoogleApiAvailability.isGooglePlayServicesAvailable()следует использовать.

user2346305
источник
2
. GoogleApiAvailability теперь синглтон , так что вы должны использовать: GoogleApiAvailability.getInstance () isGooglePlayServicesAvailable (активность)
Натив
@Nativ есть ли способ проверить, действительно ли версия сервисов Google Play, запущенная на устройстве Android, больше 10.2 или нет
Манмохан Сони
@ManmohanSoni Я уверен, что есть. В настоящее время я перехожу на разработку для iOS, поэтому я не могу вам сильно помочь.
Натив
15

вот мое решение:

private boolean checkGooglePlayServices() {
        final int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
        if (status != ConnectionResult.SUCCESS) {
            Log.e(TAG, GooglePlayServicesUtil.getErrorString(status));

            // ask user to update google play services.
            Dialog dialog = GooglePlayServicesUtil.getErrorDialog(status, this, 1);
            dialog.show();
            return false;
        } else {
            Log.i(TAG, GooglePlayServicesUtil.getErrorString(status));
            // google play services is updated. 
            //your code goes here...
            return true;
        }
    }

и у вас есть два варианта: либо написать свой код непосредственно в блоке else в соответствии с комментариями, либо использовать возвращенное логическое значение для этого метода, чтобы написать собственный код.

Надеюсь, этот код кому-то поможет.

Англ. Самер Т
источник
6

Из последних обновлений я получил этот код, я сделал удобный метод для управления всем, что с ним связано.

Все подробности, касающиеся доступности Сервиса, и сопутствующие данные доступны здесь .

 private void checkPlayService(int PLAY_SERVICE_STATUS)
    {
        switch (PLAY_SERVICE_STATUS)
        {
            case ConnectionResult.API_UNAVAILABLE:
                //API is not available
                break;
            case ConnectionResult.NETWORK_ERROR:
                //Network error while connection 
                break;
            case ConnectionResult.RESTRICTED_PROFILE:
                //Profile is restricted by google so can not be used for play services
                break;
            case ConnectionResult.SERVICE_MISSING:
                //service is missing
                break;
            case ConnectionResult.SIGN_IN_REQUIRED:
                //service available but user not signed in
                break;
            case ConnectionResult.SUCCESS:
                break;
        }
    }

Я использую это так,

GoogleApiAvailability avail;
 int PLAY_SERVICE_STATUS = avail.isGooglePlayServicesAvailable(this);
 checkPlayService(PLAY_SERVICE_STATUS);

А за версию GoogleApiAvailability.GOOGLE_PLAY_SERVICES_VERSION_CODE;дам.

И один из самых полезных ответов, которые я нашел во время своего исследования , здесь.

TapanHP
источник
6
int status = GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(this);
if(status != ConnectionResult.SUCCESS) {
     if(status == ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED){
        Toast.makeText(this,"please update your google play service",Toast.LENGTH_SHORT).show();
     }
     else {
        Toast.makeText(this, "please download the google play service", Toast.LENGTH_SHORT).show();
     }
}
Шаян Шафи
источник
4

ВАЖНО : GoogleApiAvailability.GOOGLE_PLAY_SERVICES_VERSION_CODE возвращает минимальную версию, необходимую ВАШЕМУ приложению, а не версию сервисов воспроизведения, установленную на устройстве пользователя.

стелиос
источник
1

Сегодня утром я столкнулся с той же проблемой. И сделал это по совету stan0. Спасибо, stan0.

Требуется только одно изменение на основе примера кода с https://developers.google.com/maps/documentation/android/map .

private void setUpMapIfNeeded() {
    // Do a null check to confirm that we have not already instantiated the
    // map.
    if (mMap == null) {
        FragmentManager mgr = getFragmentManager();
        MapFragment mapFragment = (MapFragment)mgr.findFragmentById(R.id.map);
        mMap = mapFragment.getMap();
        // Check if we were successful in obtaining the map.
        if (mMap != null) {
            // The Map is verified. It is now safe to manipulate the map.
            setUpMap();
        }else{
            // check if google play service in the device is not available or out-dated.
            GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);

            // nothing anymore, cuz android will take care of the rest (to remind user to update google play service).
        }
    }
}

Кроме того, вам нужно добавить атрибут в свой manifest.xml как:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="your.package.name"
android:versionCode="3225130"
android:versionName="your.version" >

И значение «3225130» берется из библиотеки google-play-services_lib, которую использует ваш проект. Кроме того, это значение находится в том же месте, что и manifest.xml в google-play-services_lib.

Надеюсь, это поможет.

Саймон Гонг
источник
1

Если вы посмотрите Сервисы Google Play в диспетчере приложений, он покажет установленную версию.

Dryii
источник
Я не пробовал другие программные подходы, перечисленные в других ответах, но поиск в диспетчере приложений работал у меня, спасибо!
Kent.Green
1

Обновлено (2019.07.03) Версия Kotlin:

class GooglePlayServicesUtil {

    companion object {

        private const val GOOGLE_PLAY_SERVICES_AVAILABLE_REQUEST = 9000

        fun isGooglePlayServicesWithError(activity: Activity, showDialog: Boolean): Boolean {
            val status = GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(activity)
            return if (status != ConnectionResult.SUCCESS) {
                if (showDialog) {
                    GoogleApiAvailability.getInstance().getErrorDialog(activity, status, GOOGLE_PLAY_SERVICES_AVAILABLE_REQUEST).show()
                }
                true
            } else {
                false
            }
        }

    }

}
Michalsx
источник
0

используйте следующую функцию, чтобы проверить, можно ли использовать сервисы Google Play или нет

 private boolean checkGooglePlayServicesAvailable() {
    final int connectionStatusCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
    if (GooglePlayServicesUtil.isUserRecoverableError(connectionStatusCode)) {
        showGooglePlayServicesAvailabilityErrorDialog(connectionStatusCode);
        return false;
    }
    return true;
}
Мохаммад Реза
источник
0
int apkVersion = GoogleApiAvailability.getInstance().getApkVersion(getContext());

получит тот же результат, что и:

int v = getPackageManager().getPackageInfo(GoogleApiAvailability.GOOGLE_PLAY_SERVICES_PACKAGE, 0 ).versionCode;

Но вторую нужно положить в ловушку.

Дандан Мэн
источник
-4
int registeredVersion = prefs.getInt(PROPERTY_APP_VERSION, Integer.MIN_VALUE);
    int currentVersion = getAppVersion(context);
    if (registeredVersion != currentVersion) {
        Log.i(TAG, "App version changed.");
        return "";
    }
Аликан Акьол
источник
Это не выход.
Стэнли Коу