GooglePlayServicesUtil против GoogleApiAvailability

Я пытаюсь использовать Службу Google Play в своем приложении для Android. Как говорится в документе Google, нам нужно проверить, доступен ли Google API перед его использованием. Я искал способ проверить это. Вот что я получил:

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

Но когда я перехожу на страницу Google Api GooglePlayServicesUtil, https://developers.google.com/android/reference/com/google/android/gms/common/GooglePlayServicesUtil

Я нахожу, что все функции устарели. Например, метод

GooglePlayServicesUtil.isGooglePlayServicesAvailable(устаревший)

И Google рекомендует использовать:

GoogleApiAvailability.isGooglePlayServicesAvailable.

Однако, когда я пытаюсь использовать GoogleApiAvailability.isGooglePlayServicesAvailable, я получаю сообщение об ошибке:

enter image description here

Ответ 1

Я нашел решение. В GoogleApiAvailability все методы являются общедоступным методом, а в GooglePlayServicesUtil все методы являются статической публичной функцией.

Итак, чтобы использовать GoogleApiAvailability, правильный путь:

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

Ответ 2

Класс GooglePlayServicesUtil больше не должен использоваться!

Вот как можно использовать класс GoogleApiAvailability - когда требуется, например, GCM (или любая другая служба 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);
    }
}

UPDATE:

REQUEST_GOOGLE_PLAY_SERVICES - целочисленная константа с произвольным именем и значением, которое можно отнести к методу onActivityResult().

Кроме того, вызов this.onActivityResult() в приведенном выше коде в порядке (вы также вызываете super.onActivityResult() в другом месте).

Ответ 3

Вместо этого вам нужно будет использовать GoogleApiAvailability:

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

this представляет context.

Ответ 4

Проверьте устройство, чтобы убедиться, что он имеет APK сервисов Google Play. Если он не отображает диалоговое окно, которое позволяет пользователям загружать APK из магазина Google Play или включить его в системе устройства настройки.

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