Wie überprüfe ich die Version der Google Play-Dienste?

95

In meiner Anwendung muss ich die Version der Google Play-Dienste überprüfen (die auf dem Gerät des Benutzers installiert ist). Ist es möglich ? Und wenn ja, wie kann ich das machen? Ich habe Google durchsucht, aber nichts gefunden!

Arash Khoeini
quelle

Antworten:

94

Ich habe eine einfache Lösung gefunden:

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

Aber versionCodein API 28 als veraltet, so dass Sie verwenden können PackageInfoCompat:

long v = PackageInfoCompat.getLongVersionCode(getPackageManager().getPackageInfo(GoogleApiAvailability.GOOGLE_PLAY_SERVICES_PACKAGE, 0 ));
yital9
quelle
6
Wie man den Versionscode von Play Services Version 10.2 kennt
Manmohan Soni
Da versionCode mit API28 veraltet ist, sollten Sie PackageInfoCompat.getLongVersionCode
G00fY
51

Wenn Sie in der Verbindung von Stan0 vorgesehen schauen sehen Sie dies :

public static final int GOOGLE_PLAY_SERVICES_VERSION_CODE

Mindestversion des Google Play-Dienstpakets (deklariert in AndroidManifest.xml android: versionCode), um mit dieser Client-Version kompatibel zu sein. Konstanter Wert: 3225000 (0x003135a8)

Wenn Sie dies in Ihrem Manifest festlegen und dann aufrufen isGooglePlayServicesAvailable(context):

public static int isGooglePlayServicesAvailable (Context context)

Überprüft, ob die Google Play-Dienste auf diesem Gerät installiert und aktiviert sind und ob die auf diesem Gerät installierte Version nicht älter als die von diesem Client benötigte ist.

Kehrt zurück

  • Statuscode, der angibt, ob ein Fehler aufgetreten ist. Kann man von in Connection folgenden sein: SUCCESS, SERVICE_MISSING, SERVICE_VERSION_UPDATE_REQUIRED, SERVICE_DISABLED, SERVICE_INVALID.

Dadurch wird sichergestellt, dass das Gerät die Version verwendet, die Ihre App benötigt. Wenn nicht, können Sie gemäß der Dokumentation Maßnahmen ergreifen

Bearbeiten

GooglePlayServicesUtil.isGooglePlayServicesAvailable()ist veraltet und GoogleApiAvailability.isGooglePlayServicesAvailable()sollte jetzt stattdessen verwendet werden.

user2346305
quelle
2
GoogleApiAvailability ist jetzt ein Singleton, daher sollten Sie Folgendes verwenden: GoogleApiAvailability.getInstance (). IsGooglePlayServicesAvailable (Aktivität)
Nativ
@Nativ gibt es eine Möglichkeit zu überprüfen, ob die Google Play Services-Version auf Android-Gerät größer als 10.2 ist oder nicht
Manmohan Soni
@ ManmohanSoni Ich bin sicher, dass es gibt. Ich bin derzeit auf iOS-Entwicklung umgestellt, daher kann ich Ihnen nicht viel helfen.
Nativ
15

Hier ist meine Lösung:

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

und Sie haben zwei Möglichkeiten: Schreiben Sie Ihren Code entweder direkt in den else-Block, wie kommentiert, oder verwenden Sie den zurückgegebenen booleschen Wert für diese Methode, um benutzerdefinierten Code zu schreiben.

Ich hoffe dieser Code hilft jemandem.

Eng. Samer T.
quelle
6

Von neueren Updates, die ich mit diesem Code erhalten habe, habe ich eine praktische Methode entwickelt, um alle damit verbundenen Dinge zu verwalten.

Alle Details zur Verfügbarkeit des Service und zugehörige Details finden Sie hier .

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

Ich benutze es so,

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

Und für die Version GoogleApiAvailability.GOOGLE_PLAY_SERVICES_VERSION_CODE;geben Sie.

Und eine der nützlichsten Antworten, die ich während meiner Recherche gefunden habe, ist hier.

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

WICHTIG : GoogleApiAvailability.GOOGLE_PLAY_SERVICES_VERSION_CODE gibt die für IHRE App erforderliche Mindestversion zurück, nicht die auf dem Gerät des Benutzers installierte Version der Wiedergabedienste.

steliosf
quelle
1

Ich bin heute Morgen auf dasselbe Problem gestoßen. Und habe es durch den Rat von stan0 erledigt. Danke stan0.

Basierend auf dem Beispielcode von https://developers.google.com/maps/documentation/android/map ist nur eine Änderung erforderlich .

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).
        }
    }
}

Außerdem müssen Sie Ihrer manifest.xml ein Attribut hinzufügen als:

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

Der Wert von "3225130" wird aus der von Ihrem Projekt verwendeten google-play-services_lib übernommen. Außerdem befindet sich dieser Wert am selben Speicherort von manifest.xml in google-play-services_lib.

Hoffe, es wird hilfreich sein.

Simon Gong
quelle
1

Wenn Sie im Anwendungsmanager nach Google Play Services suchen, wird die installierte Version angezeigt.

dryii
quelle
Ich habe die anderen programmatischen Ansätze, die in anderen Antworten aufgeführt sind, nicht ausprobiert, aber die Suche im Anwendungsmanager hat für mich funktioniert, danke!
Kent.Green
1

Aktualisiert (2019.07.03) Kotlin-Version:

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
quelle
0

Verwenden Sie die folgende Funktion, um zu überprüfen, ob Google Play-Dienste verwendet werden können oder nicht

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

erhalten das gleiche Ergebnis wie:

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

Aber der zweite muss in einen Try-Catch gesteckt werden.

Dandan Meng
quelle
-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
quelle
Dies ist keine Lösung.
Stanley Kou