GooglePlayServicesUtil 대 GoogleApiAvailability { int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this); if (resultCode !=

Android 앱에서 Google Play 서비스를 사용하려고합니다. 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을 사용하려고하면 오류 메시지가 표시됩니다.

여기에 이미지 설명 입력



답변

해결책을 찾았습니다. 에서 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;
}


답변

GooglePlayServicesUtil 클래스를 더 이상 사용하면 안됩니다!

예를 들어 GCM (또는 다른 Google 서비스)이 필요한 경우 GoogleApiAvailability 클래스를 대신 사용할 수있는 방법은 다음과 같습니다 .

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

최신 정보:

REQUEST_GOOGLE_PLAY_SERVICESonActivityResult()메서드 에서 참조 할 수있는 임의의 이름과 값을 가진 정수 상수입니다 .

또한 this.onActivityResult()위의 코드를 호출 해도 괜찮습니다 ( super.onActivityResult()다른 곳 에서도 호출 ).


답변

대신 GoogleApiAvailability 를 사용해야 합니다.

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

this를 나타냅니다 context.


답변

기기에 Google Play 서비스 APK가 있는지 확인하세요. 그렇지 않은 경우 사용자가 Google Play 스토어에서 APK를 다운로드하거나 기기의 시스템 설정에서 활성화 할 수있는 대화 상자를 표시합니다.

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


답변

나는 이것을 BaseActivity 클래스에 재미로 추가하여 모든 곳에서 사용할 수 있습니다.

    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
}

이렇게 사용하세요

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

        }
    )

또는 원하는대로 사용자 지정할 수 있습니다.


답변