GooglePlayServicesUtil vs GoogleApiAvailability

102

Ich versuche, Google Play Service in meiner Android-App zu verwenden. Wie im Google-Dokument angegeben, müssen wir überprüfen, ob die Google-API verfügbar ist, bevor wir sie verwenden. Ich habe nach einer Möglichkeit gesucht, dies zu überprüfen. Folgendes habe ich bekommen:

private boolean checkPlayServices() {
int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
if (resultCode != ConnectionResult.SUCCESS) {
    if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) {
        GooglePlayServicesUtil.getErrorDialog(resultCode, this,
                PLAY_SERVICES_RESOLUTION_REQUEST).show();
    } else {
        Log.i(TAG, "This device is not supported.");
        finish();
    }
    return false;
}
return true;
}

Wenn ich jedoch zur Google Api GooglePlayServicesUtil-Seite gehe, https://developers.google.com/android/reference/com/google/android/gms/common/GooglePlayServicesUtil

Ich finde alle Funktionen veraltet . Zum Beispiel die Methode

GooglePlayServicesUtil.isGooglePlayServicesAvailable (veraltet)

Und Google empfiehlt Folgendes:

GoogleApiAvailability.isGooglePlayServicesAvailable .

Wenn ich jedoch versuche, GoogleApiAvailability.isGooglePlayServicesAvailable zu verwenden, wird folgende Fehlermeldung angezeigt:

Geben Sie hier die Bildbeschreibung ein

James
quelle
Wo finde ich GoogleApiAvailability? Ich kann es nicht finden.
Mcmillab
@mcmillab +1. Ich habe ein Upgrade von 8.1.0 auf 8.4.0 durchgeführt und bin GooglePlayServicesUtilweg (was für ein "kleines" Update als schlechte Praxis erscheint), aber ich sehe keine GoogleApiAvailabilityVerwendung als Ersatz.
spaaarky21
Beim Update auf Firebase checkout dies: etivy.com/…
Dawid Drozd

Antworten:

203

Ich habe die Lösung gefunden. In der GoogleApiAvailabilitysind alle Methoden öffentliche Methoden, während in GooglePlayServicesUtilallen Methoden statische öffentliche Funktionen sind.

Um GoogleApiAvailability zu verwenden, ist der richtige Weg:

private boolean checkPlayServices() {
    GoogleApiAvailability googleAPI = GoogleApiAvailability.getInstance();
    int result = googleAPI.isGooglePlayServicesAvailable(this);
    if(result != ConnectionResult.SUCCESS) {
        if(googleAPI.isUserResolvableError(result)) {
            googleAPI.getErrorDialog(this, result,
                    PLAY_SERVICES_RESOLUTION_REQUEST).show();
        }

        return false;
    }

    return true;
}
James
quelle
9
Was ist: PLAY_SERVICES_RESOLUTION_REQUEST
Saman Sattari
12
private final static int PLAY_SERVICES_RESOLUTION_REQUEST = 9000;
Ferrrmolina
7
Es ist eine beliebige ganze Zahl. Sie können den Wert bilden.
Timmmm
4
Einige ziehen es vor, den Wert auf etwas über 9000 zu setzen.
matthias_b_nz
12
Das gesamte Design der Google Play Services-Bibliothek ist ein Chaos. Es ist alles fehlerhaft und es ist schwer zu folgen, außerdem mangelt es an Dokumentation.
Mr5
63

Die Klasse GooglePlayServicesUtil sollte nicht mehr verwendet werden!

So kann stattdessen die Klasse GoogleApiAvailability verwendet werden - wenn beispielsweise GCM (oder ein anderer Google-Dienst) benötigt wird:

public static final int REQUEST_GOOGLE_PLAY_SERVICES = 1972;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (savedInstanceState == null) {
        startRegistrationService();
    }
}

private void startRegistrationService() {
    GoogleApiAvailability api = GoogleApiAvailability.getInstance();
    int code = api.isGooglePlayServicesAvailable(this);
    if (code == ConnectionResult.SUCCESS) {
        onActivityResult(REQUEST_GOOGLE_PLAY_SERVICES, Activity.RESULT_OK, null);
    } else if (api.isUserResolvableError(code) &&
        api.showErrorDialogFragment(this, code, REQUEST_GOOGLE_PLAY_SERVICES)) {
        // wait for onActivityResult call (see below)
    } else {
        Toast.makeText(this, api.getErrorString(code), Toast.LENGTH_LONG).show();
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch(requestCode) {
        case REQUEST_GOOGLE_PLAY_SERVICES:
            if (resultCode == Activity.RESULT_OK) {
                Intent i = new Intent(this, RegistrationService.class); 
                startService(i); // OK, init GCM
            }
            break;

        default:
            super.onActivityResult(requestCode, resultCode, data);
    }
}

AKTUALISIEREN:

REQUEST_GOOGLE_PLAY_SERVICESist eine ganzzahlige Konstante mit einem beliebigen Namen und Wert, auf die in der onActivityResult()Methode verwiesen werden kann.

Außerdem this.onActivityResult()ist es in Ordnung , den obigen Code einzugeben (Sie rufen auch super.onActivityResult()an der anderen Stelle an).

Alexander Farber
quelle
2
Können Sie auf die Quelle verweisen, die behauptet, dass "die Klasse GooglePlayServicesUtil nicht mehr verwendet werden sollte!". Die Google Play Services-API ist so verwirrend.
Lachezar
8
Alle Methoden in GooglePlayServicesUtil, die als veraltet plus Empfehlung am oberen Rand des Javadoc markiert sind, um die GOOGLE_PLAY_SERVICES_PACKAGEKonstante aus der GoogleApiAvailability- Klasse zu übernehmen, sind Googles Art, Ihnen zu sagen: Verwenden Sie die GooglePlayServicesUtilKlasse nicht mehr.
Alexander Farber
3
Was ist, wenn das Gerät über eine ältere Version der Google Play-Dienste verfügt, in der die GoogleApiAvailabilityKlasse nicht vorhanden ist? Wenn wir die Klasse auch innerhalb eines bedingten Ausdrucks statisch referenzieren, stürzt die App dann nicht ab?
Kevin Krumwiede
6
@ Kevin Krumwiede, GoogleApiAvailabilityist Teil der Client-Bibliothek. Der Code wird also in die App kompiliert => Mach dir darüber keine Sorgen.
WindRider
9
Sie sollten onActivityResult () nicht aufrufen. Es soll von außen aufgerufen werden, wenn eine andere Aktivität ein Ergebnis zurückgibt.
Yar
10

Sie müssen stattdessen GoogleApiAvailability verwenden:

GoogleApiAvailability googleApiAvailability = GoogleApiAvailability.getInstance(); 
int errorCode = googleApiAvailability.isGooglePlayServicesAvailable(this);

thisrepräsentiert die context.

Gaurav
quelle
9

Überprüfen Sie das Gerät, um sicherzustellen, dass es über die Google Play Services APK verfügt. Wenn dies nicht der Fall ist, zeigen Sie ein Dialogfeld an, in dem Benutzer die APK aus dem Google Play Store herunterladen oder in den Systemeinstellungen des Geräts aktivieren können.

public static boolean checkPlayServices(Activity activity) {
    final int PLAY_SERVICES_RESOLUTION_REQUEST = 9000;
    GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance();
    int resultCode = apiAvailability.isGooglePlayServicesAvailable(activity);
    if (resultCode != ConnectionResult.SUCCESS) {
        if (apiAvailability.isUserResolvableError(resultCode)) {
            apiAvailability.getErrorDialog(activity, resultCode, PLAY_SERVICES_RESOLUTION_REQUEST)
                    .show();
        } else {
            Logger.logE(TAG, "This device is not supported.");
        }
        return false;
    }
    return true;
}
Anoop M.
quelle
0

Ich habe dies als Spaß in der BaseActivity-Klasse hinzugefügt, um es an allen Orten zu verwenden

    fun checkGooglePlayServices(okAction : ()-> Unit , errorAction: (msg:String, isResolved:Boolean)-> Unit){
    val apiAvailability = GoogleApiAvailability.getInstance()
    val resultCode = apiAvailability.isGooglePlayServicesAvailable(this)
    if (resultCode != ConnectionResult.SUCCESS) {
        if (apiAvailability.isUserResolvableError(resultCode)) {
            apiAvailability.getErrorDialog(
                this,
                resultCode,
                PLAY_SERVICES_RESOLUTION_REQUEST
            ).show()
             // dialoe when click on ok should let user go to install/update play serices


            errorAction("dialog is shown" , true)

        } else {
          "checkGooglePlayServices  This device is not supported.".log(mTag)
            errorAction("This device is not supported",false)
        }
    }else{
        okAction()
    }
}

companion object {
    const val PLAY_SERVICES_RESOLUTION_REQUEST = 1425
}

benutze es so

    (activity as? BaseActivity)?.checkGooglePlayServices({
        // ok so start map
        initializeMap()
    },
        { msg, isResolved ->
            if (!isResolved)
                context?.show(msg)

        }
    )

Oder Sie können es nach Ihren Wünschen anpassen.

Mahmoud Mabrok
quelle