안드로이드 앱은 핸드폰의 제한된 공간에서 작동 되는데 앱 외부에 있는 리소스(카메라, 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) { switch(requestCode) { case returnCode: if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 권한 허가된 경우 처리 } else { // 권한 거절된 경우 처리 } break; } } |
6. 테스트 프로젝트
간단한 권한 요청만 진행하는 프로젝트를 하나 생성해 봅니다.
프로젝트를 생성하고 소스를 입력 합니다.
실제 사용되는 파일은 2개이고 전체 소스 입니다.
- AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> |
- MainActivity.java
package copycoding.tistory.permissiontest; |
7. 결과 화면
- 처음 권한 요청
처음 권한을 요청하면 위 그림과 같이 [거부]와 [허용] 버튼이 나타 납니다.
여기에서 거부를 클릭 했습니다.
- 거부 후 다시 실행시
이번에는 [다시묻지않음]이 추가된 요청 화면이 나타 납니다.
- copy coding -
'Android' 카테고리의 다른 글
안드로이드(Android) 레이아웃 RelativeLayout 정리 (0) | 2021.02.21 |
---|---|
안드로이드(Android) 레이아웃 LinearLayout 정리 (0) | 2021.02.14 |
안드로이드(Android) 핸드폰 version 정보와 API Level 확인 방법 (0) | 2021.01.21 |
안드로이드(Android) 파일 읽기 쓰기 및 파일 위치 확인 (0) | 2020.12.25 |
안드로이드(Android) EditText 엔터키 이벤트(enter key event) 사용방법 (0) | 2020.12.22 |