¿Cómo comprobar la versión de los servicios de Google Play?

95

En mi aplicación, necesito verificar la versión de los servicios de Google Play (que está instalada en el dispositivo del usuario). Es posible ? Y si es así, ¿cómo puedo hacer eso? ¡Busqué en Google pero no pude encontrar nada!

Arash Khoeini
fuente

Respuestas:

94

Encontré una solución simple:

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

Pero versionCodeestá en desuso en API 28, por lo que puede usar PackageInfoCompat:

long v = PackageInfoCompat.getLongVersionCode(getPackageManager().getPackageInfo(GoogleApiAvailability.GOOGLE_PLAY_SERVICES_PACKAGE, 0 ));
yital9
fuente
6
Cómo saber el código de versión de los servicios de juego versión 10.2
Manmohan Soni
Dado que versionCode está en desuso con API28, debe usar PackageInfoCompat.getLongVersionCode
G00fY
51

Si miras en el enlace proporcionado por Stan0, verás esto :

public static final int GOOGLE_PLAY_SERVICES_VERSION_CODE

Versión mínima del paquete de servicios de Google Play (declarada en AndroidManifest.xml android: versionCode) para que sea compatible con esta versión de cliente. Valor constante: 3225000 (0x003135a8)

Entonces, cuando configura eso en su manifiesto y luego llama isGooglePlayServicesAvailable(context):

public static int isGooglePlayServicesAvailable (Context context)

Verifica que los servicios de Google Play estén instalados y habilitados en este dispositivo, y que la versión instalada en este dispositivo no sea anterior a la requerida por este cliente.

Devoluciones

  • código de estado que indica si hubo un error. Puede ser uno de siguiente en ConnectionResult: SUCCESS, SERVICE_MISSING, SERVICE_VERSION_UPDATE_REQUIRED, SERVICE_DISABLED, SERVICE_INVALID.

Se asegurará de que el dispositivo esté usando la versión que su aplicación requiere, de lo contrario, puede tomar medidas de acuerdo con la documentación.

Editar

GooglePlayServicesUtil.isGooglePlayServicesAvailable()está obsoleto y ahora GoogleApiAvailability.isGooglePlayServicesAvailable()debería utilizarse en su lugar.

usuario2346305
fuente
2
GoogleApiAvailability es ahora un singleton, por lo que debe usar: GoogleApiAvailability.getInstance (). IsGooglePlayServicesAvailable (actividad)
Nativ
@Nativ, ¿hay alguna forma de verificar si la versión de los servicios de Google Play que se ejecuta en el dispositivo Android es mayor que 10.2 o no?
Manmohan Soni
@ManmohanSoni Estoy seguro de que lo hay. Actualmente me han trasladado al desarrollo de iOS, por lo que no puedo ser de mucha ayuda para ti.
Nativ
15

aquí está mi solución:

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

y tiene dos opciones, escribir su código directamente en el bloque else como se comentó, o usar el valor booleano devuelto para este método para escribir código personalizado.

Espero que este código ayude a alguien.

Ing. Samer T
fuente
6

De las actualizaciones más recientes he terminado con este código, he creado un método útil para administrar todo lo relacionado con él.

Todos los detalles relacionados con la disponibilidad del Servicio y los detalles relacionados están disponibles aquí .

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

Lo uso así

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

Y para la versión GoogleApiAvailability.GOOGLE_PLAY_SERVICES_VERSION_CODE;te lo daré.

Y una de las respuestas más útiles que encontré durante mi investigación está aquí.

TapanHP
fuente
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();
     }
}
Shayan Shafiee
fuente
4

IMPORTANTE : GoogleApiAvailability.GOOGLE_PLAY_SERVICES_VERSION_CODE devuelve la versión mínima requerida por SU aplicación, no la versión de servicios de juego que está instalada en el dispositivo del usuario.

Steliosf
fuente
1

Me encontré con el mismo problema esta mañana. Y lo hice con el consejo de stan0. Gracias stan0.

Solo se necesita un cambio basado en el código de muestra de 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).
        }
    }
}

Además, debe agregar un atributo a su manifest.xml como:

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

Y el valor de "3225130" se toma de google-play-services_lib que usa tu proyecto. Además, ese valor reside en la misma ubicación de manifest.xml en google-play-services_lib.

Espero que te sea de ayuda.

Simon Gong
fuente
1

Si busca Google Play Services en el Administrador de aplicaciones, mostrará la versión instalada.

dryii
fuente
No probé los otros enfoques programáticos enumerados en otras respuestas, pero la búsqueda en el administrador de aplicaciones funcionó para mí, ¡gracias!
Kent.Green
1

Actualizado (2019.07.03) Versión de 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
fuente
0

use la siguiente función para verificar si los servicios de Google Play se pueden usar o no

 private boolean checkGooglePlayServicesAvailable() {
    final int connectionStatusCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
    if (GooglePlayServicesUtil.isUserRecoverableError(connectionStatusCode)) {
        showGooglePlayServicesAvailabilityErrorDialog(connectionStatusCode);
        return false;
    }
    return true;
}
MohammadReza
fuente
0
int apkVersion = GoogleApiAvailability.getInstance().getApkVersion(getContext());

obtendrá el mismo resultado que:

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

Pero el segundo debe colocarse dentro de un try-catch.

Dandan Meng
fuente
-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 "";
    }
alican akyol
fuente
Esta no es una solución.
Stanley Kou