Como verificar a versão do Google Play Services?

95

Em meu aplicativo, preciso verificar a versão do Google Play Services (instalada no dispositivo do usuário). É possível ? E se sim, como posso fazer isso? Procurei no Google mas não encontrei nada!

Arash Khoeini
fonte

Respostas:

94

Encontrei uma solução simples:

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

Mas versionCodeestá obsoleto na API 28, então você pode usar PackageInfoCompat:

long v = PackageInfoCompat.getLongVersionCode(getPackageManager().getPackageInfo(GoogleApiAvailability.GOOGLE_PLAY_SERVICES_PACKAGE, 0 ));
yital9
fonte
6
Como saber o código da versão dos serviços do jogo versão 10.2
Manmohan Soni
Como versionCode está obsoleto com API28, você deve usar PackageInfoCompat.getLongVersionCode
G00fY
51

Se você olhar no link fornecido por Stan0, verá o seguinte :

public static final int GOOGLE_PLAY_SERVICES_VERSION_CODE

Versão mínima do pacote de serviços do Google Play (declarada em AndroidManifest.xml android: versionCode) para ser compatível com esta versão do cliente. Valor constante: 3225000 (0x003135a8)

Então, quando você definir isso em seu manifesto e chamar isGooglePlayServicesAvailable(context):

public static int isGooglePlayServicesAvailable (Context context)

Verifica se o Google Play Services está instalado e ativado neste dispositivo e se a versão instalada neste dispositivo não é mais antiga do que a exigida por este cliente.

Devoluções

  • código de status indicando se houve um erro. Pode ser um dos seguintes na ConnectionResult: SUCCESS, SERVICE_MISSING, SERVICE_VERSION_UPDATE_REQUIRED, SERVICE_DISABLED, SERVICE_INVALID.

Isso garantirá que o dispositivo esteja usando a versão que seu aplicativo requer, caso contrário, você pode tomar medidas de acordo com a documentação

Editar

GooglePlayServicesUtil.isGooglePlayServicesAvailable()está obsoleto e agora GoogleApiAvailability.isGooglePlayServicesAvailable()deve ser usado em seu lugar.

user2346305
fonte
2
GoogleApiAvailability agora é um singleton, então você deve usar: GoogleApiAvailability.getInstance (). IsGooglePlayServicesAvailable (activity)
Nativ
@Nativ existe alguma maneira de verificar se a versão dos serviços do Google Play em execução no dispositivo Android é superior a 10.2 ou não
Manmohan Soni
@ManmohanSoni Tenho certeza que sim. No momento, mudei para o desenvolvimento para iOS, então não posso ser de grande ajuda para você.
Nativ de
15

aqui está minha solução:

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

e você tem duas opções, escrever seu código diretamente no bloco else como comentado ou usar o valor booleano retornado para este método para escrever código personalizado.

Espero que este código ajude alguém.

Eng. Samer T
fonte
6

A partir de atualizações mais recentes, acabei com este código, criei um método útil para gerenciar todas as coisas relacionadas a ele.

Todos os detalhes relacionados à disponibilidade do Serviço e detalhes relacionados estão disponíveis aqui .

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

Eu uso assim,

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

E para a versão GoogleApiAvailability.GOOGLE_PLAY_SERVICES_VERSION_CODE;vai te dar.

E uma das respostas mais úteis que encontrei durante minha pesquisa está aqui.

TapanHP
fonte
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
fonte
4

IMPORTANTE : GoogleApiAvailability.GOOGLE_PLAY_SERVICES_VERSION_CODE retorna a versão mínima exigida pelo SEU aplicativo, não a versão do Play Services que está instalada no dispositivo do usuário.

Steliosf
fonte
1

Eu tive o mesmo problema esta manhã. E conseguiu isso seguindo o conselho de Stan0. Obrigado, stan0.

Apenas uma alteração é necessária com base no código de amostra 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).
        }
    }
}

Além disso, você precisa adicionar um atributo ao seu manifest.xml como:

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

E o valor de "3225130" é obtido do google-play-services_lib que seu projeto está usando. Além disso, esse valor reside no mesmo local de manifest.xml em google-play-services_lib.

Espero que seja de ajuda.

Simon Gong
fonte
1

Se você procurar o Google Play Services no gerenciador de aplicativos, ele mostrará a versão instalada.

dryii
fonte
Não tentei as outras abordagens programáticas listadas em outras respostas, mas pesquisar no gerenciador de aplicativos funcionou para mim, obrigado!
Kent.Green de
1

Atualizado (03.07.2010) Versão 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
fonte
0

use a seguinte função para verificar se os serviços do Google Play podem ser usados ​​ou não

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

obterá o mesmo resultado que:

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

Mas o segundo precisa ser colocado dentro de um try-catch.

Dandan Meng
fonte
-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
fonte
Esta não é uma solução.
Stanley Kou