안드로이드 유저라면 핸드폰을 사용하다가
지도 앱을 다운 받았을 때 위치 액세스 권한을 허용해 달라고 요청받은 적이 많을 것이다.
개발자가 앱을 만들 때 사용자에게 액세스 권한을 받으려면 퍼미션 허용을 요청해야 하는데
오늘은 그 퍼미션에 대해 알아보겠다 !!
<퍼미션의 의미>
퍼미션이란 앱의 특정 기능에 부여하는 접근 권한을 의미한다.
<퍼미션을 설정하는 상황>
1. 내가 개발하는 앱이 다른 앱이나 안드로이드 시스템에서 보호하는 특정 기능을 이용할 때
2. 내가 만든 기능을 다른 앱에서 사용할 수 없도록 보호하고 권한을 얻은 앱에서만 허용하고 싶을 때
<퍼미션의 사용과 설정>
A앱의 컴포넌트를 B앱에서 사용하는 상황이라고 가정하자.
A앱의 개발자가 매니페스트 파일에 <permission> 태그로 퍼미션을 설정하면 이를 이용하는
B앱의 코드를 아무리 잘 구현하더라도 실행되지 않는다.
이때는 B앱의 매니페스트 파일에 <uses-permission> 태그로 해당 퍼미션을 이용하겠다고 설정해줘야 한다.
따라서
1. <permission> : 기능을 보호하려는 앱의 매니페스트 파일에 설정
2. <uses-permission> : 퍼미션으로 보호된 기능을 사용하려는 앱의 매니페스트 파일에 설정
매니페스트 파일에 퍼미션을 설정할 때는 <permission> 태그와 다음 속성을 이용한다
<퍼미션 태그 속성>
1. name : 퍼미션의 이름
2. label, description : 퍼미션 설명
3. protectionLevel : 보호 수준
- normal : 낮은 수준의 보호. 사용자에게 권한 허용을 요청하지 않아도 OK
- dangerous : 높은 수준의 보호. 사용자에게 권한 허용을 요청해야 함
- signature : 같은 키로 인증한 앱만 실행 가능
- signatureOrSystem : 안드로이드 시스템 앱이거나 같은 키로 인증한 앱만 실행
<퍼미션 적용하기>
매니페스트 파일에 <permission>을 설정했다고 해서 컴포넌트가 보호되지는 않는다.
<permission>을 설정한 다음 이 퍼미션으로 보호하려는 컴포넌트에 적용해야 한다.
퍼미션을 적용할 때는 android:permission 속성을 이용한다.
<activity
android:name=".OneActivity"
android:permission="com.example.TEST_PERMISSION"> //여기
<intent-filter>
<action android:name="android.intent.action.PICK" />
</intent-filter>
</activity>
이제 이 컴포넌트는 com.example.TEST_PERMISSION에 의해 보호되며 이 컴포넌트를 이용하는 곳에서는
매니페스트 파일에 <uses-permission>을 선언해줘야 정상적으로 실행되는 것이다.
<uses-permission android:name="com.example.TEST_PERMISSION" />
<안드로이드 시스템에서 보호하는 기능을 사용할 때>
이처럼 외부 앱과 연동할 때 퍼미션 사용을 설정해야 하지만 안드로이드 시스템에서 보호하는
기능을 사용할 때도 매니페스트 파일에 퍼미션 사용 설정을 해야한다.
https://developer.android.com/reference/android/Manifest.permission?hl=ko
기본 플랫폼에서 정의한 권한 목록은 위의 링크에서 확인할 수 있다.
<퍼미션 허용 확인>
퍼미션은 API 레벨 1 버전부터 있었떤 내용이지만 API 레벨 23 ( 안드로이드 6 ) 버전부터 정책이 바뀌었다.
API 23 이전 : 개발자가 매니페스트 파일에 <uses-permission>으로 선언만 하면 보호받는 기능을 앱에서 이용하는 데 문제 X
API 23 이후 : 허가제. 즉 개발자가 <uses-permission>으로 선언했더라도 사용자가 권한 화면에서 이를 거부할 수 있게 됨
만약 사용자가 앱의 권한 설정에서 특정 퍼미션을 제거하면 <uses-permission>를 선언하지 않은 것과 같은 것이다.
결국 API 23버전부터는 매니페스트 파일에 <uses-permission>을 선언하는 것뿐만 아니라 앱을 실행할 때
사용자가 퍼미션을 거부했는지 확인하고 만약 거부를 했으면 다시 퍼미션을 허용해달라고 요청해야 한다.
(신뢰되지 않는 어플 쓸 때는 거부할 때가 많은데 .. 개발자들을 피곤하게 하는 행동이었다니 반성하게 됨)
사용자가 펴미션을 허용했는지 확인하려면 checkSelfPermission() 함수를 이용해야한다.
public static int checkSelfPermission(@NonNull Context context, @NonNull String permission)
두번째 매개변수가 퍼미션을 구분하는 이름이며
결괏값은 다음 중 하나의 상수로 전달된다.
- PERMISSION_GRANTED : 권한을 허용한 경우
- PERMISSION_DENIED : 권한을 거부한 경우
만약 퍼미션을 거부한 상태라면 사용자에게 해당 퍼미션을 허용해 달라고 요청해야 한다.
사용자에게 퍼미션 허용을 요청할 때는 ActivityResultLauncher를 이용해야한다.
ActivityResultLauncher 객체는 registerForActivityResult() 함수를 호출해서 만든다.
public final @NonNull ActivityResultLauncher<I> <I, O> registerForActivityResult(
@NonNull ActivityResultContract<I, O> contract,
@NonNull ActivityResultCallback<O> callback
)
첫번째 파라미터 : 어떤 요청인지를 나타내는 ActivityResultContract 타입 객체
두번째 파라미터 : 결과를 받았을 때 호출되는 콜백
private val requestPermissionLauncher = registerForActivityResult(
ActivityResultContracts.RequestPermission()
) { isGranted ->
if (isGranted) {
// 권한 획득 성공 시
} else {
// 권한 획득 거부 시
}
}
위 방법으로 객체를 만들었다면
필요한 곳에서 ActivityResultLauncher 객체의 launch() 함수를 호출하여 요청을 실행한다.
requestPermissionLauncher.launch("android.permission.ACCESS_FINE_LOCATION")
두번째 파라미터 쓰는 것은 나중에 설명하겠다 !!!
'안드로이드' 카테고리의 다른 글
[안드로이드] 퍼미션 설정하기 (0) | 06:34:17 |
---|---|
[안드로이드] API 레벨 호환성 고려하기 (0) | 05:37:59 |
[안드로이드] 앱 구성 파일 분석(3) - 메인 환경 파일 (0) | 05:08:04 |
[안드로이드] 앱 구성 파일 분석(2) - 그래들 빌드 설정 파일 (0) | 03:53:23 |
[안드로이드] 앱 구성 파일 분석(1) - 프로젝트, 모듈의 폴더 구성 알아보기 (0) | 03:51:29 |
[안드로이드] 코틀린 언어 소개 (0) | 2022.05.20 |
댓글0