Jak sprawdzić wersję usług Google Play?

95

W mojej aplikacji muszę sprawdzić wersję usług Google Play (która jest zainstalowana na urządzeniu użytkownika). Czy to możliwe ? A jeśli tak, jak mogę to zrobić? Szukałem w Google, ale nie mogłem nic znaleźć!

Arash Khoeini
źródło

Odpowiedzi:

95

Znalazłem proste rozwiązanie:

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

Ale versionCodejest przestarzały w API 28, więc możesz użyć PackageInfoCompat:

long v = PackageInfoCompat.getLongVersionCode(getPackageManager().getPackageInfo(GoogleApiAvailability.GOOGLE_PLAY_SERVICES_PACKAGE, 0 ));
yital9
źródło
6
Jak poznać kod wersji usług Play w wersji 10.2
Manmohan Soni
Od versionCode jest przestarzała z API28 należy użyć PackageInfoCompat.getLongVersionCode
G00fY
52

Jeśli spojrzysz na link udostępniony przez Stan0, zobaczysz to :

public static final int GOOGLE_PLAY_SERVICES_VERSION_CODE

Minimalna wersja pakietu usług Google Play (zadeklarowana w AndroidManifest.xml android: versionCode) w celu zapewnienia zgodności z tą wersją klienta. Wartość stała: 3225000 (0x003135a8)

Tak więc, kiedy ustawisz to w swoim manifeście, a następnie zadzwonisz isGooglePlayServicesAvailable(context):

public static int isGooglePlayServicesAvailable (Context context)

Sprawdza, czy usługi Google Play są zainstalowane i włączone na tym urządzeniu oraz czy wersja zainstalowana na tym urządzeniu nie jest starsza niż wymagana przez tego klienta.

Zwroty

  • kod stanu wskazujący, czy wystąpił błąd. Może być jedną z następujących czynności w ConnectionResult: SUCCESS, SERVICE_MISSING, SERVICE_VERSION_UPDATE_REQUIRED, SERVICE_DISABLED, SERVICE_INVALID.

Zapewni to, że urządzenie korzysta z wersji wymaganej przez Twoją aplikację, jeśli nie, możesz podjąć działania zgodnie z dokumentacją

Edytować

GooglePlayServicesUtil.isGooglePlayServicesAvailable()jest przestarzały i teraz GoogleApiAvailability.isGooglePlayServicesAvailable()powinien być używany zamiast niego.

user2346305
źródło
2
GoogleApiAvailability jest teraz singletonem, więc należy użyć: GoogleApiAvailability.getInstance (). IsGooglePlayServicesAvailable (aktywność)
Nativ
@Nativ czy istnieje sposób, aby sprawdzić, czy wersja usług Google Play działających na urządzeniu z Androidem jest większa niż 10,2, czy nie
Manmohan Soni
@ManmohanSoni Jestem pewien, że tak. Obecnie jestem przeniesiony do programowania na iOS, więc nie mogę być dla ciebie zbyt pomocny.
Nativ
15

oto moje rozwiązanie:

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

i masz dwie opcje, albo napisz swój kod bezpośrednio w bloku else jako skomentowany, albo użyj zwróconej wartości logicznej dla tej metody, aby napisać własny kod.

Mam nadzieję, że ten kod komuś pomoże.

Inż. Samer T.
źródło
6

Z nowszych aktualizacji, które otrzymałem z tym kodem, stworzyłem poręczną metodę zarządzania wszystkimi związanymi z nim rzeczami.

Wszystkie szczegóły związane z dostępnością Usługi i powiązane szczegóły są dostępne tutaj .

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

Używam tego w ten sposób,

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

A za wersję GoogleApiAvailability.GOOGLE_PLAY_SERVICES_VERSION_CODE;da ci.

Oto jedna z najbardziej przydatnych odpowiedzi, jakie znalazłem podczas moich badań .

TapanHP
źródło
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
źródło
4

WAŻNE : GoogleApiAvailability.GOOGLE_PLAY_SERVICES_VERSION_CODE zwraca minimalną wersję wymaganą przez TWOJĄ aplikację, a nie wersję usług Play zainstalowaną na urządzeniu użytkownika.

steliosf
źródło
1

Dziś rano napotkałem ten sam problem. I udało się to dzięki poradom ze strony stan0. Dzięki stan0.

Potrzebna jest tylko jedna zmiana na podstawie przykładowego kodu z 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).
        }
    }
}

Poza tym musisz dodać atrybut do swojego manifest.xml jako:

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

Wartość „3225130” jest pobierana z google-play-services_lib, z którego korzysta Twój projekt. Ponadto ta wartość znajduje się w tej samej lokalizacji manifest.xml w google-play-services_lib.

Mam nadzieję, że to pomoże.

Simon Gong
źródło
1

Jeśli wyszukasz Usługi Google Play w menedżerze aplikacji, pokaże się zainstalowana wersja.

dryii
źródło
Nie próbowałem innych podejść programistycznych wymienionych w innych odpowiedziach, ale wyszukiwanie w menedżerze aplikacji zadziałało, dzięki!
Kent.Green
1

Zaktualizowana (2019.07.03) wersja 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
źródło
0

Użyj poniższej funkcji, aby sprawdzić, czy można korzystać z usług Google Play

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

otrzyma taki sam wynik, jak:

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

Ale drugą trzeba umieścić w zaczepie.

Dandan Meng
źródło
-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
źródło
To nie jest rozwiązanie.
Stanley Kou