GooglePlayServicesUtil - GoogleApiAvailability


103

Android uygulamamda Google Play Hizmetini kullanmaya çalışıyorum. Google belgesinin dediği gibi, kullanmadan önce Google API'nin kullanılabilir olup olmadığını kontrol etmemiz gerekiyor. Kontrol etmenin bir yolunu aradım. İşte sahip olduğum şey:

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

Ancak Google Api GooglePlayServicesUtil sayfasına gittiğimde, https://developers.google.com/android/reference/com/google/android/gms/common/GooglePlayServicesUtil

Tüm işlevlerin kullanımdan kaldırıldığını görüyorum . Örneğin, yöntem

GooglePlayServicesUtil.isGooglePlayServicesAvailable (kullanımdan kaldırıldı)

Ve Google şunları kullanmanızı önerir:

GoogleApiAvailability.isGooglePlayServicesAvailable .

Ancak, GoogleApiAvailability.isGooglePlayServicesAvailable'ı kullanmaya çalıştığımda şu hata mesajını alıyorum:

görüntü açıklamasını buraya girin


GoogleApiAvailability'yi nerede bulabilirim? Bulamıyorum
mcmillab

@mcmillab +1. 8.1.0'dan 8.4.0'a yükselttim ve gittim GooglePlayServicesUtil(bu, "küçük" bir güncelleme için kötü bir uygulama gibi görünüyor), ancak GoogleApiAvailabilitybir yedek olarak kullanmayı düşünmüyorum .
spaaarky21

Yanıtlar:


204

Çözümü buldum. İçinde GoogleApiAvailability, tüm yöntemler genel yöntemdir, GooglePlayServicesUtiltüm yöntemler ise statik genel işlevdir.

GoogleApiAvailability'yi kullanmak için doğru yol şudur:

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
nedir: PLAY_SERVICES_RESOLUTION_REQUEST
Saman Sattari

12
private final static int PLAY_SERVICES_RESOLUTION_REQUEST = 9000;
Fmolina

7
Bu keyfi bir tamsayı. Değeri uydurabilirsiniz.
Timmmm

4
Bazıları değeri 9000'in üzerinde bir değere ayarlamayı tercih ediyor.
matthias_b_nz

12
Tüm bu Google Play Hizmetleri kitaplık tasarımı tam bir karmaşa. Her şey kusurlu ve dokümantasyon eksikliğinin yanı sıra takip etmesi zor.
mr5

64

GooglePlayServicesUtil sınıfı artık kullanılmamalıdır!

Bunun yerine GoogleApiAvailability sınıfının nasıl kullanılabileceği aşağıda açıklanmıştır - örneğin GCM (veya başka bir Google hizmeti) gerektiğinde:

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

GÜNCELLEME:

REQUEST_GOOGLE_PLAY_SERVICESonActivityResult()yöntemde atıfta bulunulabilen, isteğe bağlı adı ve değeri olan bir tamsayı sabitidir .

Ayrıca, this.onActivityResult()yukarıdaki kodu aramak da sorun yaratmaz ( super.onActivityResult()diğer yeri de arayabilirsiniz ).


2
"GooglePlayServicesUtil sınıfının artık kullanılmaması gerektiğini" iddia eden kaynağa işaret edebilir misiniz? Google Play Hizmetleri API'si çok kafa karıştırıcı.
Lachezar

8
Tüm yöntemler GooglePlayServicesUtil almaya javadoc üstündeki kaldırılan artı öneri olarak işaretlenmiş GOOGLE_PLAY_SERVICES_PACKAGEgelen sabit GoogleApiAvailability kullanmayın: sınıfa anlatmak için Google'ın yoludur GooglePlayServicesUtilartık sınıf.
Alexander Farber

3
Cihaz, GoogleApiAvailabilitysınıfın bulunmadığı daha eski bir Google Play hizmetlerine sahipse ne olur ? Sınıfa, koşullu bir ifade içinde bile statik olarak başvurursak, bu, uygulamayı çökertmez mi?
Kevin Krumwiede

6
@Kevin Krumwiede, GoogleApiAvailabilitymüşteri kütüphanesinin bir parçasıdır. Bu yüzden kodu uygulamaya derlenmiştir => Bunun için endişelenmeyin.
WindRider

9
OnActivityResult () 'u çağırmamalısınız. Başka bir etkinlik sonuç verdiğinde dışarıdan çağrılması amaçlanmıştır.
Yar

10

Bunun yerine GoogleApiAvailability'yi kullanmanız gerekecek :

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

thistemsil eder context.


9

Google Play Hizmetleri APK'sına sahip olduğundan emin olmak için cihazı kontrol edin. Başlamazsa, kullanıcıların APK'yı Google Play Store'dan indirmelerine veya cihazın sistem ayarlarında etkinleştirmelerine olanak tanıyan bir iletişim kutusu görüntüleyin.

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

Bunu BaseActivity sınıfına her yerde kullanılmak üzere eğlenceli olarak ekledim

    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
}

böyle kullan

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

        }
    )

Veya istediğiniz gibi özelleştirebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.