안드로이드 앱은 핸드폰의 제한된 공간에서 작동 되는데 앱 외부에 있는 리소스(카메라, SMS, 저장공간 등)에 접속 하기 위해서는 핸드폰 소유자의 접근 허가 권한을 받아야 이용이 가능 합니다. 물론 Android 5.1(API 수준 22) 이하에서 실행하는 기기에 설치된 앱 이라면 권한이 설정 만으로도 자동으로 부여되므로 허가 요청은 필요하지 않습니다. 권한을 요청하는 순서대로 설명을 하면
1. 권한 설정
앱에서 필요한 권한을 AndroidManifest.xml 파일에 등록을 해야 합니다. 문법은 <uses-permission android:name="string" android:maxSdkVersion="integer" /> 과 같이 작성 합니다. Parameters android:name 요청하려는 권한의 이름. android:maxSdkVersion 권한이 필요한 최고 레벨 값. (“21” 이라면 API 레벨 21까지만 필요하고 22 이상은 필요 없다는 의미)
실제 사용 예를 들면 아래처럼 입력하면 됩니다. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18" /> 권한의 종류는 안드로이드 사이트에 리스트 되어 있으며 양이 많아 링크만 연결해 드립니다. https://developer.android.com/reference/android/Manifest.permission
2. 앱에 이미 권한이 부여되었는지 확인사용하려는 권한을 이미 부여 받았다면 권한 요청을 다시 하지는 않습니다. ContextCompat.checkSelfPermission() 메서드를 사용하여 앱에 이미 권한을 부여 받았는지 확인을 할 수 있습니다. 호출 결과로는 PERMISSION_GRANTED 또는 PERMISSION_DENIED를 반환 받게 됩니다. public static int checkSelfPermission (Context context, String permission) Parameters context Context permission String : 필요한 권한 명칭
Returns int PackageManager.PERMISSION_GRANTED - 이미 권한이 있는 경우 PackageManager.PERMISSION_DENIED – 권한이 없는 경우
실제 사용 예는 아래와 같습니다. ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION);
3. 앱에 권한이 필요한 이유 설명
앱에 필요한 권한을 요청 하려는 경우 사용자가 처음 권한을 요청 받은건지 기존에 요청을 받았는데 거부를 한 것인지에 따라 요청 방식을 달리 해야 하고 요청 화면도 달라지게 됩니다. shouldShowRequestPermissionRationale() 메서드는 사용자가 이전에 권한 요청을 거부한 경우 true 값을 넘겨주게 되어 있습니다. 그 결과를 이용하여 앱을 사용하려면 권한이 필요함을 사용자에게 알려 주는 안내를 추가 해야 합니다. public static boolean shouldShowRequestPermissionRationale (Activity activity, String permission)
Parameters activity Activity: The target activity. permission String : 필요한 권한 명칭
Returns boolean Whether you should show permission rationale UI.
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)) { // 이전에 거부한 경우 권한 필요성 설명 및 권한 요청 } else { // 처음 요청하는 경우 그냥 권한 요청 }
4. 권한요청
권한 요청은 메소드를 호출 하면서 필요한 권한을 적어주면 됩니다. 요청 하려는 권한이 한개 이상이면 String 배열에 죽 기입해 주면 되고 너무 많으면 배열을 별도로 작성해서 추가해도 됩니다. static void requestPermissions(Activity activity, String[] permissions, int requestCode)
Parameters Activity Activity permissions String[p] : 필요한 권한 명칭들 requestCode 실행 후 전달 받을 코드
requestCode는 개발자가 임의로 만들어 놓은 코드를 말하고 메소드가 void를 리턴하는데 전달받으려는 값을 설정 한다는 건 메소드 실행 후 onRequestPermissionsResult() 메소드를 이용하여 결과 값을 넘겨 주게 됩니다.
- 요청 권한이 한개인 경우 static final int PERMISSIONS_REQUEST_READ_LOCATION = 0x00000001;
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSIONS_REQUEST_READ_LOCATION);
- 요청 권한이 2개 이상인 경우 static final int PERMISSIONS_REQUEST_READ_LOCATION = 0x00000001; private String[] PERMISSIONS = { Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION }; ActivityCompat.requestPermissions(this,PERMISSIONS,PERMISSIONS_REQUEST_READ_LOCATION);
5. 권한요청 응답처리
사용자가 권한 요청 대화상자에 응답하면 시스템은 앱의 onRequestPermissionsResult() 메소드를 호출 하게 되고 이곳에서 결과에 대한 다음 작업을 진행하게 됩니다. public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { |