퍼미션 설정하기
퍼미션이란 앱의 특정 기능에 부여하는 접근 권한을 말합니다. 안드로이드 시스템에서 보호하는 특정 기능을 이용할 때나 다른 앱에서 사용할 수 없도록 보호할 때 퍼 민션을 설정합니다
퍼미션 설정과 사용 설정
A 앱의 컴포넌트를 B 앱에서 사용하는 상황일때 A 앱의 컴포넌트에서 퍼미션을 설정하면 B 앱에서 연동할 때 문제가 발생합니다. 이럴 때는 B 앱에서 <uses-permission>을 설정해줘야 합니다.
매니페스트 | |
<permission> | 기능을 보호하려는 앱의 매니페스트 파일에 설정합니다. |
<uses-permission> | 퍼미션으로 보호된 기능을 사용하려는 앱의 매니페스트 파일에 설정합니다. |
<permission> 태그와 속성 | |
name | 퍼미션의 이름입니다. |
abel, description | 퍼미션을 설명합니다. |
protectionLevel | 보호 수준입니다. |
protectionLevel 속성값은 보호 수준을 의미 | |
normal | 낮은 수준의 보호입니다. 사용자에게 권한 허용을 요청하지 않아도 됩니다. |
dangerous | 높은 수준의 보호입니다. 사용자에게 권한 허용을 요청해야 합니다. |
signature | 같은 키로 인증한 앱만 실행합니다. |
signatureOrSystem | 안드로이드 시스템 앱이거나 같은 키로 인증한 앱만 실행합니다. |
파일에 <permission>을 설정해줬다고 해서 컴포넌트가 보호되지는 않습니다. <permission>을 설정한 다음 이 퍼미션으로 보호하려는 컴포넌트에 적용해야 합니다. 퍼미션을 컴퓨터에 적용할 때는 android:permission 속 서을 이용 합니다. 이후 컴포넌트를 이용하는 곳에서는 매니페스트 파일에 <uses-permission>을 선언해 줘야 정상으로 실행할 수 있습니다.
시스템에서 보호하는 기능 | |
ACCESS_FINE_LOCATION | 위치 정보 접근 |
퍼미션 설정과 사용 설정 | 네트워크 정보 접근 |
ACCESS_WIFI_STATE | 와이파이 네트워크 정보 접근 |
BATTERY_STATS | 배터리 정보 접근 |
BLUETOOTH | 블루투스 장치에 연결 |
BLUETOOTH_ADMIN | 블루투스 장치를 검색하고 페어링 |
CAMERA | 카메라 장치에 접근 |
INTERNET | 네트워크 연결 |
READ_EXTERNAL_STORAGE: | 외부 저장소에서 파일 읽기 |
WRITE_EXTERNAL_STORAGE | 외부 저장소에 파일 쓰기 |
READ_PHONE_STATE | 전화기 정보 접근 |
SEND_SMS | 문자 메시지 발신 |
RECEIVE_SMS | 문자 메시지 수신 |
RECEIVE_BOOT_COMPLETED | 부팅 완료 시 실행 |
VIBRATE | 진동 울리기 |
퍼미션 허용 확인
API 레벨 23 버전부터 허가제로 변경 되었습니다. 그전에는 <uses-permission>을 설정해주기만 하면 이용하는데 문제가 없었지만 23 버전 이후인 지금은 <uses-permission>으로 선언했더라도 사용자가 권한 화면에서 이를 거부할 수 있게 되었습니다. 당연히 거부를 하면 그 기능은 사용을 할 수 없습니다. 그렇기에 앱을 실행할 때 사용자가 퍼미션을 거부했는지 확인하고 만약 거부했으면 다시 퍼미션을 허용해 달라고 요청해야 합니다.
퍼미션을 허용했는지 확인하려면 checkSelfPermission() 함수를 이용합니다.
open static fun checkSelfPermission(
@NotNull context: Context,
@NotNull permission: String,
): Int
두번째 매개변수가 퍼미션을 구분하는 이름이며 결괏값은 다음 중 하나의 상수로 전달됩니다. | |
PackageManager.PERMISSION_GRANTED | 권한을 허용한 경우 ( 0 ) |
PackageManager.PERMISSION_DENIED | 권한을 거부한 경우 ( -1 ) |
checkSelfPermission() 참고
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=shin_soosoo&logNo=221481742166
거부한 상태라면 사용자에게 해당 퍼미션을 허용해 달라고 요청해야 됩니다. 이럴 때 ActivityResultLauncher를 이용합니다.
ActivityResultLauncher 객체는 registerForActivity Result() 함수를 호출해서 만듭니다. 첫 번째 매개변수는 어떤 요청인지를 나타내는 ActivityResultContract 타입 객체이고, 두 번째 매개변수는 결과를 받았을 때 호출되는 콜백 합수입니다.
ActivityResultLauncher 객체의 launch() 함수를 호출하여 요청을 실행합니다.
ActivityResultLauncher() 참고
여기서 거부한다면 다음에 실행을 했을 때 허용을 했는지 거부를 확인을 해서 다시 요청을 해야 합니다. 이때 확인을 하는 함수가 onRequestPermissionsResult() 함수를 사용합니다.
이 함수를 선언해 놓으면 퍼미션 요청 다이얼로그가 닫힐 때 자동으로 호출되며, 다이얼 로그에서 요청한 퍼미션의 결괏값이 세 번째 매개변수로 전달됩니다.
abstract void onRequestPermissionsResult(
@NotNull requestCode: Int,
@NotNull permission: Array<String!>,
@NotNull grantResults: IntArray
): Unit
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array < out String > ,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == = MY_PERMISSION_ACCESS_ALL){
if (grantResults.size > 0) {
for (grant in grantResults) {
if (grant != PackageManager.PERMISSION_GRANTED)
System.exit(0)
}
}
}
}
onRequestPermissionsResult() 참고