GooglePlayServicesUtil so với GoogleApiAvailable


102

Tôi đang cố gắng sử dụng Dịch vụ Google Play trong ứng dụng Android của mình. Như tài liệu của Google cho biết, chúng ta cần kiểm tra xem API của Google có khả dụng không trước khi sử dụng. Tôi đã tìm kiếm một số cách để kiểm tra nó. Đây là những gì tôi nhận được:

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

Nhưng khi tôi truy cập trang Google Api GooglePlayServicesUtil, https://developers.google.com/android/reference/com/google/android/gms/common/GooglePlayServicesUtil

Tôi thấy tất cả các chức năng không được dùng nữa . Ví dụ, phương pháp

GooglePlayServicesUtil.isGooglePlayServicesAvailable (không được dùng nữa)

Và Google khuyên bạn nên sử dụng:

GoogleApiAvailable.isGooglePlayServicesAvailable .

Tuy nhiên, khi tôi cố gắng sử dụng GoogleApiAvailable.isGooglePlayServicesAvailable, tôi nhận được thông báo lỗi:

nhập mô tả hình ảnh ở đây


tôi tìm thấy GoogleApiAvailable ở đâu? Tôi không thể tìm thấy nó.
mcmillab

@mcmillab +1. Tôi đã nâng cấp từ 8.1.0 lên 8.4.0 và GooglePlayServicesUtilđã biến mất (có vẻ như là một thực tế không tốt cho một bản cập nhật "nhỏ") nhưng tôi không GoogleApiAvailabilitymuốn sử dụng để thay thế.
spaaarky21

Khi cập nhật đến căn cứ hỏa lực kiểm này: etivy.com/...
Dawid Drozd

Câu trả lời:


203

Tôi đã tìm được giải pháp. Trong GoogleApiAvailability, tất cả các phương thức là phương thức công khai, trong khi trong GooglePlayServicesUtiltất cả các phương thức là hàm công cộng tĩnh.

Vì vậy, để sử dụng GoogleApiAvailable, cách đúng là:

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
là gì: PLAY_SERVICES_RESOLUTION_REQUEST
Saman Sattari

12
private final static int PLAY_SERVICES_RESOLUTION_REQUEST = 9000;
Ferrrmolina

7
Đó là một số nguyên tùy ý. Bạn có thể tạo ra giá trị.
Timmmm

4
Một số người thích để thiết lập các giá trị cho một cái gì đó hơn 9000.
matthias_b_nz

12
Toàn bộ thiết kế thư viện Dịch vụ của Google Play này là một mớ hỗn độn. Tất cả đều thiếu sót cộng với việc khó theo dõi, thêm vào đó là thiếu tài liệu.
mr5

64

Lớp GooglePlayServicesUtil không nên được sử dụng nữa!

Đây là cách có thể sử dụng lớp GoogleApiAv Khả dụng thay thế - ví dụ: khi cần đến GCM (hoặc bất kỳ dịch vụ nào khác của Google):

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

CẬP NHẬT:

REQUEST_GOOGLE_PLAY_SERVICESlà một hằng số nguyên với tên và giá trị tùy ý, có thể được tham chiếu đến trong onActivityResult()phương thức.

Ngoài ra, gọi this.onActivityResult()theo mã trên là được (bạn gọi super.onActivityResult()ở nơi khác cũng được).


2
Bạn có thể chỉ đến nguồn tuyên bố rằng "Lớp GooglePlayServicesUtil không nên được sử dụng nữa!". API dịch vụ của Google Play thật khó hiểu.
Lachezar

8
Tất cả các phương thức trong GooglePlayServicesUtil được đánh dấu là không dùng nữa cộng với đề xuất ở đầu javadoc để lấy GOOGLE_PLAY_SERVICES_PACKAGEhằng số từ lớp GoogleApiAvailable là cách Google cho bạn biết: không sử dụng GooglePlayServicesUtillớp này nữa.
Alexander Farber

3
Điều gì sẽ xảy ra nếu thiết bị có phiên bản cũ hơn của dịch vụ Google Play mà GoogleApiAvailabilitylớp này không tồn tại? Nếu chúng ta tham chiếu lớp một cách tĩnh, ngay cả bên trong một biểu thức điều kiện, nó sẽ không làm hỏng ứng dụng chứ?
Kevin Krumwiede

6
@Kevin Krumwiede, GoogleApiAvailabilitylà một phần của thư viện khách hàng. Vì vậy, mã của nó được biên dịch vào ứng dụng => Đừng lo lắng về điều đó.
WindRider

9
Bạn không nên gọi onActivityResult (). Nó có nghĩa là được gọi từ bên ngoài, khi một hoạt động khác trả về một kết quả.
Yar,

10

Thay vào đó, bạn sẽ phải sử dụng GoogleApiAv Khả dụng :

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

thisđại diện cho context.


9

Kiểm tra thiết bị để đảm bảo thiết bị có APK Dịch vụ của Google Play. Nếu không, hãy hiển thị hộp thoại cho phép người dùng tải xuống APK từ Cửa hàng Google Play hoặc bật APK đó trong cài đặt hệ thống của thiết bị.

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

Tôi đã thêm điều này như một niềm vui trong lớp BaseActivity để được sử dụng ở mọi nơi

    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
}

sử dụng nó như thế này

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

        }
    )

Hoặc bạn có thể tùy chỉnh nó theo ý muốn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.