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!
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!
Respostas:
Encontrei uma solução simples:
int v = getPackageManager().getPackageInfo(GoogleApiAvailability.GOOGLE_PLAY_SERVICES_PACKAGE, 0 ).versionCode;
Mas versionCode
está obsoleto na API 28, então você pode usar PackageInfoCompat
:
long v = PackageInfoCompat.getLongVersionCode(getPackageManager().getPackageInfo(GoogleApiAvailability.GOOGLE_PLAY_SERVICES_PACKAGE, 0 ));
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
GooglePlayServicesUtil.isGooglePlayServicesAvailable()
está obsoleto e agora GoogleApiAvailability.isGooglePlayServicesAvailable()
deve ser usado em seu lugar.
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.
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.
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();
}
}
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.
Se você procurar o Google Play Services no gerenciador de aplicativos, ele mostrará a versão instalada.
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
}
}
}
}
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;
}
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.
int registeredVersion = prefs.getInt(PROPERTY_APP_VERSION, Integer.MIN_VALUE);
int currentVersion = getAppVersion(context);
if (registeredVersion != currentVersion) {
Log.i(TAG, "App version changed.");
return "";
}