В моем приложении мне нужно проверить версию сервисов Google Play (которая установлена на пользовательском устройстве). Является ли это возможным? И если да, как я могу это сделать? Я искал Google, но ничего не нашел!
Как проверить версию Google Play?
Ответ 1
Я нашел простое решение:
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 ));
Ответ 2
Если вы посмотрите на ссылку, предоставленную Stan0, вы увидите this:
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()
.
Ответ 3
вот мое решение:
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, либо прокомментируйте его, либо используйте возвращаемое логическое значение для этого метода для написания собственного кода.
Я надеюсь, что этот код поможет кому-то.
Ответ 4
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();
}
}
Ответ 5
Из более новых обновлений я закончил с этим кодом, я сделал удобный метод для управления всем связанным с ним материалом.
Все подробности, связанные с наличием Сервиса и связанной с ним информацией, доступны здесь.
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;
вы получите.
И один из самых полезных ответов, которые я нашел во время моего исследования здесь.
Ответ 6
ВАЖНО: GoogleApiAvailability.GOOGLE_PLAY_SERVICES_VERSION_CODE возвращает минимальную версию, необходимую для ВАШЕГО приложения, а не версию Play Services, установленную на пользовательском устройстве.
Ответ 7
Сегодня утром я сталкиваюсь с той же проблемой. И сделал это по совету 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.
Надеюсь, что это поможет.
Ответ 8
Если вы посмотрите на Службы Google Play в Диспетчере приложений, он покажет версию.
Ответ 9
final int gpsVersion = getResources()
.getInteger(com.google.android.gms.R.integer.google_play_services_version);
Ответ 10
используйте следующую функцию, чтобы проверить, можно ли использовать сервисы Google Play или нет.
private boolean checkGooglePlayServicesAvailable() {
final int connectionStatusCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
if (GooglePlayServicesUtil.isUserRecoverableError(connectionStatusCode)) {
showGooglePlayServicesAvailabilityErrorDialog(connectionStatusCode);
return false;
}
return true;
}
Ответ 11
int apkVersion = GoogleApiAvailability.getInstance().getApkVersion(getContext());
получит тот же результат, что и:
int v = getPackageManager().getPackageInfo(GoogleApiAvailability.GOOGLE_PLAY_SERVICES_PACKAGE, 0 ).versionCode;
Но второй должен быть помещен в попытку.
Ответ 12
Обновлена (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
}
}
}
}
Ответ 13
int registeredVersion = prefs.getInt(PROPERTY_APP_VERSION, Integer.MIN_VALUE);
int currentVersion = getAppVersion(context);
if (registeredVersion != currentVersion) {
Log.i(TAG, "App version changed.");
return "";
}