GooglePlayServicesUtil vs GoogleApiAvailability


102

J'essaie d'utiliser le service Google Play dans mon application Android. Comme le dit le document Google, nous devons vérifier si l'API Google est disponible avant de l'utiliser. J'ai cherché un moyen de le vérifier. Voici ce que j'ai:

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

Mais lorsque je vais sur la page Google Api GooglePlayServicesUtil, https://developers.google.com/android/reference/com/google/android/gms/common/GooglePlayServicesUtil

Je trouve que toutes les fonctions sont obsolètes . Par exemple, la méthode

GooglePlayServicesUtil.isGooglePlayServicesAvailable (obsolète)

Et Google recommande d'utiliser:

GoogleApiAvailability.isGooglePlayServicesAvailable .

Cependant, lorsque j'essaie d'utiliser GoogleApiAvailability.isGooglePlayServicesAvailable, j'obtiens le message d'erreur:

entrez la description de l'image ici


où puis-je trouver GoogleApiAvailability? Je ne peux pas le trouver.
mcmillab

@mcmillab +1. J'ai mis à jour de 8.1.0 à 8.4.0 et GooglePlayServicesUtilje suis parti (ce qui semble être une mauvaise pratique pour une mise à jour "mineure") mais je ne vois pas GoogleApiAvailabilityà utiliser en remplacement.
spaaarky21 le

Lors de la mise à jour vers Firebase, procédez comme suit
Dawid Drozd

Réponses:


203

J'ai trouvé la solution. Dans le GoogleApiAvailability, toutes les méthodes sont des méthodes publiques, tandis que dans GooglePlayServicesUtiltoutes les méthodes sont des fonctions publiques statiques.

Donc, pour utiliser GoogleApiAvailability, la bonne façon est:

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

9
qu'est-ce que: PLAY_SERVICES_RESOLUTION_REQUEST
Saman Sattari

12
private final static int PLAY_SERVICES_RESOLUTION_REQUEST = 9000;
Ferrrmolina

7
C'est un entier arbitraire. Vous pouvez compenser la valeur.
Timmmm

4
Certains préfèrent définir la valeur sur quelque chose de plus de 9000.
matthias_b_nz

12
Toute cette conception de la bibliothèque des services Google Play est un désordre complet. Tout est imparfait et difficile à suivre, en plus du manque de documentation.
mr5

64

La classe GooglePlayServicesUtil ne devrait plus être utilisée!

Voici comment la classe GoogleApiAvailability peut être utilisée à la place - lorsque, par exemple, GCM (ou tout autre service Google) est nécessaire:

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

METTRE À JOUR:

REQUEST_GOOGLE_PLAY_SERVICESest une constante entière avec un nom et une valeur arbitraires, auxquels la onActivityResult()méthode peut faire référence .

De plus, appeler this.onActivityResult()le code ci-dessus est correct (vous appelez également super.onActivityResult()à l'autre endroit).


2
Pouvez-vous pointer vers la source qui prétend que "La classe GooglePlayServicesUtil ne devrait plus être utilisée!". L'API des services Google Play est tellement déroutante.
Lachezar

8
Toutes les méthodes de GooglePlayServicesUtil marquées comme obsolètes plus la recommandation en haut de la javadoc de prendre la GOOGLE_PLAY_SERVICES_PACKAGEconstante de la classe GoogleApiAvailability est le moyen de Google de vous dire: n'utilisez plus la GooglePlayServicesUtilclasse.
Alexander Farber

3
Que faire si l'appareil dispose d'une ancienne version des services Google Play dans laquelle la GoogleApiAvailabilityclasse n'existe pas? Si nous référençons la classe de manière statique, même dans une expression conditionnelle, ne plantera-t-elle pas l'application?
Kevin Krumwiede

6
@Kevin Krumwiede, GoogleApiAvailabilityfait partie de la bibliothèque cliente. Donc, son code est compilé dans l'application => Ne vous en faites pas.
WindRider

9
Vous ne devez pas appeler onActivityResult (). Il est destiné à être appelé de l'extérieur, lorsqu'une autre activité renvoie un résultat.
Yar le

10

Vous devrez utiliser GoogleApiAvailability à la place:

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

thisreprésente le context.


9

Vérifiez l'appareil pour vous assurer qu'il dispose du fichier APK des services Google Play. Si ce n'est pas le cas, affichez une boîte de dialogue qui permet aux utilisateurs de télécharger l'APK à partir du Google Play Store ou de l'activer dans les paramètres système de l'appareil.

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

0

J'ai ajouté cela comme amusant dans la classe BaseActivity à utiliser dans tous les endroits

    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
}

utilise-le comme ça

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

        }
    )

Ou vous pouvez le personnaliser comme vous le souhaitez.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.