GooglePlayServicesUtil vs GoogleApiAvailability

102

Saya mencoba menggunakan Layanan Google Play di aplikasi Android saya. Seperti yang dikatakan dokumen Google, kita perlu memeriksa apakah Google API tersedia sebelum menggunakannya. Saya telah mencari cara untuk memeriksanya. Inilah yang saya dapatkan:

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

Tetapi ketika saya membuka halaman GooglePlayServicesUtil Google Api, https://developers.google.com/android/reference/com/google/android/gms/common/GooglePlayServicesUtil

Saya menemukan semua fungsi sudah usang . Misalnya metode

GooglePlayServicesUtil.isGooglePlayServicesAvailable (tidak digunakan lagi)

Dan Google merekomendasikan untuk menggunakan:

GoogleApiAvailability.isGooglePlayServicesAvailable .

Namun, ketika saya mencoba menggunakan GoogleApiAvailability.isGooglePlayServicesAvailable, saya mendapatkan pesan kesalahan:

masukkan deskripsi gambar di sini

James
sumber
di mana saya menemukan GoogleApiAvailability? Saya tidak dapat menemukannya.
mcmillab
@mcmillab +1. Saya memutakhirkan dari 8.1.0 ke 8.4.0 dan GooglePlayServicesUtilhilang (yang tampaknya seperti praktik yang buruk untuk pembaruan "kecil") tetapi saya tidak GoogleApiAvailabilityingin menggunakannya sebagai pengganti.
spaaarky21
Saat memperbarui ke Firebase, checkout ini: etivy.com/…
Dawid Drozd

Jawaban:

203

Saya sudah menemukan solusinya. Di GoogleApiAvailability, semua metode adalah metode publik, sedangkan di GooglePlayServicesUtilsemua metode adalah fungsi publik statis.

Jadi untuk menggunakan GoogleApiAvailability, cara yang benar adalah:

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
sumber
9
apa itu: PLAY_SERVICES_RESOLUTION_REQUEST
Saman Sattari
12
private final static int PLAY_SERVICES_RESOLUTION_REQUEST = 9000;
Ferrrmolina
7
Ini adalah bilangan bulat sewenang-wenang. Anda dapat membuat nilainya.
Timmmm
4
Beberapa lebih memilih untuk menyetel nilainya menjadi lebih dari 9000.
matthias_b_nz
12
Seluruh desain perpustakaan Layanan Google Play ini berantakan. Semuanya cacat dan sulit untuk diikuti, ditambah dengan kurangnya dokumentasi.
mr5
64

Kelas GooglePlayServicesUtil seharusnya tidak digunakan lagi!

Berikut adalah bagaimana kelas GoogleApiAvailability dapat digunakan sebagai gantinya - ketika misalnya GCM (atau layanan Google lainnya) diperlukan:

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

MEMPERBARUI:

REQUEST_GOOGLE_PLAY_SERVICESadalah konstanta bilangan bulat dengan nama dan nilai sembarang, yang bisa dirujuk dalam onActivityResult()metode.

Selain itu, menelepon this.onActivityResult()dengan kode di atas tidak apa-apa (Anda juga menelepon super.onActivityResult()di tempat lain).

Alexander Farber
sumber
2
Dapatkah Anda menunjuk ke sumber yang mengklaim bahwa "Kelas GooglePlayServicesUtil tidak boleh digunakan lagi!". API Layanan Google Play sangat membingungkan.
Lachezar
8
Semua metode di GooglePlayServicesUtil ditandai sebagai usang ditambah rekomendasi di bagian atas javadoc untuk mengambil GOOGLE_PLAY_SERVICES_PACKAGEkonstanta dari kelas GoogleApiAvailability adalah cara Google untuk memberi tahu Anda: jangan gunakan GooglePlayServicesUtilkelas itu lagi.
Alexander Farber
3
Bagaimana jika perangkat memiliki layanan Google Play versi lama yang GoogleApiAvailabilitykelasnya tidak ada? Jika kita mereferensikan kelas secara statis, bahkan di dalam ekspresi kondisional, bukankah itu akan membuat aplikasi crash?
Kevin Krumwiede
6
@Kevin Krumwiede, GoogleApiAvailabilityadalah bagian dari perpustakaan klien. Jadi kodenya dikompilasi ke dalam app => Jangan khawatir tentang itu.
WindRider
9
Anda sebaiknya tidak memanggil onActivityResult (). Ini dimaksudkan untuk dipanggil dari luar, ketika aktivitas lain mengembalikan hasil.
Yar
10

Anda harus menggunakan GoogleApiAvailability sebagai gantinya:

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

thismewakili context.

Gaurav
sumber
9

Periksa perangkat untuk memastikannya memiliki APK Layanan Google Play. Jika tidak, tampilkan dialog yang memungkinkan pengguna mendownload APK dari Google Play Store atau mengaktifkannya di setelan sistem perangkat.

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

Saya telah menambahkan ini sebagai kesenangan di kelas BaseActivity untuk digunakan di semua tempat

    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
}

gunakan seperti ini

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

        }
    )

Atau Anda dapat menyesuaikannya sesuai keinginan.

Mahmoud Mabrok
sumber