본문 바로가기
개발/Google Developers korea 블로그

안드로이드 6.0 런타임 권한과 Google Play 서비스 8.1

by darksilber 2015. 9. 26.
반응형

출처 - http://googledevkr.blogspot.kr/

 

2015년 9월 25일 금요일

안드로이드 6.0 런타임 권한과 Google Play 서비스 8.1

Google Play 서비스 8.1 버전은 안드로이드 6.0의 새로운 런타임 권한 모델을 지원하는 첫 번째 Google Play 서비스 버전입니다. 기본적으로 Google Play 서비스는 API를 지원하는 데 필요한 권한을 갖고 있으며, 이전과 마찬가지로 여러분의 앱은 해당 기능을 사용할 때 사용 권한을 요청할 필요가 없습니다. 하지만 API Level 23버전을 타겟으로 앱을 업데이트한 경우에는 API 호출을 위해 실행 중에 코드 상에서 필요한 권한을 확인하고 사용자에게 적절한 권한을 요청해야 합니다.

새로운 런타임 권한을 준비하는 개발자 여러분을 위하여, Google Play 서비스를 사용하는 앱을 6.0 버전에 맞도록 업데이트할 때 어떤 준비 과정이 필요한지 간단히 정리해 보았습니다.

시작하기 전에…

이어질 내용은 런타임 권한 모델을 지원하기 위해 targetSdkVersion 값을 23으로 업데이트 한 상황에 해당하는 내용입니다. 여러분의 targetSdkVersion 값을 확인하시고, 또한, 이전 버전의 기기도 지원하기 위해 23 버전의 v4 서포트 라이브러리를 사용하고 있는지 살펴보시기 바랍니다. AndroidManifest.xml 파일에 필요한 권한도 모두 선언되어 있어야 합니다.
defaultConfig {
 minSdkVersion 9
 targetSdkVersion 23
}

dependencies { compile 'com.android.support-v4:23.0.1 }


1.GoogleApiClient 연결

GoogleApiClient를 통해 Google Play 서비스에 연결해 사용할 때, Google Play 서비스 동작에 필요한 권한이 없다면 앱 동작에 문제가 발생할 수 있습니다. 코드를 추가로 작성할 필요없이  startResolutionForResult() 메서드를 올바르게 활용하고 있다면 크게 걱정할 필요는 없습니다.

@Override
public void onConnectionFailed(ConnectionResult result) {
      if (mResolvingError) {
             // Already attempting to resolve an error.
             return;
      } else if (result.hasResolution()) {
             try {
                   mResolvingError = true;
                   result.startResolutionForResult(this, REQUEST_RESOLVE_ERROR);
             } catch (SendIntentException e) {
                   // There was an error with the resolution intent. Try again.
                   mGoogleApiClient.connect();
             }
      } else {
             // Show dialog using GooglePlayServicesUtil.getErrorDialog()
             showErrorDialog(result.getErrorCode());
             mResolvingError = true;
      }
}

해당 함수를 호출하면, 연결 오류가 발생 할 때, 사용자가 문제의 원인을 쉽게 파악하고 해결할 수 있도록 Google Play 서비스에서 사용자에게 정보를 제공합니다. 예를 들어 Google Play 서비스가 필요한 권한을 없는 경우, 다음과 같은 대화창이 표시됩니다.

2.권한 확인

Google Play 서비스 연결이 성공해도 필요한 권한이 없을 수도 있습니다. 그런 만큼, API를 호출하거나 GoogleApiClient 에 연결하기 전에 필요한 권한을 가졌는지 확인해야 합니다. 

서포트 라이브러리에 새롭게 추가된 checkSelfPermissions() 메서드를 사용해 권한을 갖고 있는지 확인할 수 있습니다. 만일 필요한 권한이 없는 경우, 다음과 같이 requestPermissions() 메서드를 이용해 사용자에게 직접 해당 권한을 요청해야합니다.

private static final int REQUEST_CODE_LOCATION = 2;
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED) {
 // Request missing location permission.
 ActivityCompat.requestPermissions(this, 
    new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 
    REQUEST_CODE_LOCATION);
} else {
 // Location permission has been granted, continue as usual.
 Location myLocation = 
             LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
}

3.사용자 응답 확인

두 번째 단계에서 requestPermissions() 메서드를 이용해 사용자에게 권한을 요청한 후에는 onRequestPermissionsResult() 에서 사용자 응답을 확인할 수 있습니다. 물론 사용자가 권한 요청을 거부할 수 있으므로, 결과 값을 잘 확인한 후 적절한 작업을 수행해야 합니다. 또한, 서로 다른 권한 요청에 대한 응답이 동일한 콜백으로 넘어올 수 있으므로, 어떤 권한 요청에 대한 응답인지도 확인해야 합니다.
public void onRequestPermissionsResult(int requestCode, 
                                      String[] permissions,
                                      int[] grantResults) {
     if (requestCode == REQUEST_CODE_LOCATION) {
          if(grantResults.length == 1 
       && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
          // success!
          Location myLocation =
               LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
     } else {
     // Permission was denied or request was cancelled
     }
}


4.이유 설명하기

사용자가 권한 요청을 거부한 경우, 다시 권한을 요청해야 한다면 조금 더 자세한 설명이 필요합니다. 특히나, 여러분의 앱에 꼭 필요한 권한인데, 사용자가 해당 권한이 왜 필요한지 잘 이해하지 못하고 있다면, 사용자가 해당 권한이 필요한 이유를 잘 이해할 수 있도록 안내가 필요합니다.

이런 경우 requestPermissions() 메서드를 호출하기 전에, shouldShowRequestPermissionRationale() 메서드를 호출해 값을 확인하고, 만일 결과 값이 ‘true’이라면, 요청하는 권한에 관해 좀 더 자세히 설명할 수 있습니다.
private static final int REQUEST_CODE_LOCATION = 2;
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED) {
 // Check Permissions Now

  if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.ACCESS_FINE_LOCATION)) {
        // Display UI and wait for user interaction
  } else {
 ActivityCompat.requestPermissions(
             this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 
                                     REQUEST_CODE_LOCATION);
  }
} else {
     // permission has been granted, continue as usual
     Location myLocation = 
        LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
}

그럼에도 사용자는 언제나 여러분의 권한 요청을 거부할 수 있습니다. 이럴 때에도 개발자 여러분은 권한이 필요하지 않은 앱의 나머지 기능들 잘 동작하도록 만드셔야 합니다. 이를 위한 보다 자세한 내용과 모범 사례가 개발자 사이트에 공유되어 있습니다. 한 번 확인해보시기 바랍니다. 또한, 아래와 같은 참고 자료도 살펴보시면 좋을 것 같습니다.


안드로이드 M 오픈 테스트 랩

마지막으로, 만일 여러분이 Google Play 서비스를 사용하는 앱을 만들고 계신다면, 새로운 8.1 버전의 SDK를 다운로드 받아 적용해보고, 최신 안드로이드 개발자 프리뷰 버전 위에서 여러분의 앱이 잘 동작하는지 테스트해보시기 바랍니다. 혹시 적당한 디바이스가 없거나 어떻게 테스트할 지 잘 알 수 없어 도움이 필요하시다면, 구글 코리아에서 매주 진행하고 있는 안드로이드 M 오픈 테스트 랩에 참여해 보시기 바랍니다.

반응형

댓글