Android Kotlin Permission
Permission
1. App에 대한 <permission> 태그 추가
<permission android:name="com.example.permission.TEST_PERMISSION"
android:label="Test Permission"
android:description="@string/permission_desc"
android:protectionLevel="dangerous" />
- AndroidManifest.xml 파일에 추가
- name : permission 이름
- label, description : permission에 대한 설명
- protectionLevel : 보호 수준
normal : 낮은 수준 보호. 유저에게 권한 부여 요청 안함
dangerous : 높은 수준 보호. 유저에게 권한 부여 요청
signature : 동일한 키로 사인된 앱만 실행
signatureOrSystem : 안드로이드 시스템 앱 이거나 동일키로 사인된 앱에서 실행
2. Component에 대한 Permission 설정
<activity
android:name=".MainActivity"
android:exported="true"
android:permission="com.example.TEST_PERMISSION">
</activity>
퍼미션을 걸고 싶은 액티비티에 permission 항목에 퍼미션 이름 입력
3. Permission 획득
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission> 태그에 획득할 퍼미션 이름을 입력
4. 시스템 Permission 종류
앱과 앱 간의 연동에 더불어, 시스템에서 퍼미션으로 보호하는 기능을 연동하려면 해당 Permission 획득해야함
ACCESS_FINE_LOCATION : 위치 정보
ACESS_NETWORK_STATE : 네트워크 정보
ACCESS_WIFI_STATE : Wi-Fi 네트워크 정보
BATTERY_STATS : 배터리 정보
BLUETOOTH : 블루투스 장치에 연결
BLUETOOTH_ADMIN : 블루투스 장치를 검색하고 페어링
CAMERA : 카메라 장치
INTERNET : 네트워크 연결
READ_EXTERNAL_STORAGE : 외부 저장소 파일 읽기
WRITE_EXTERNAL_STORAGE : 외부 저장소에 파일 쓰기
READ_PHONE_STATE : 전화기 각종 정보
SEND_SMS : SMS 발신
RECEIVE_SMS : SMS 수신
RECEIVE_BOOT_COMPLETED : 부팅 완료 시 실행
VIBRATE : 진동
5. Permission Check
API Level 23 이전 버전에서 퍼미션은 신고제, API Level 23 버전부터 퍼미션은 허가제
val status = ContextCompat.checkSelfPermission(this, "android.permission.ACCESS_FINE_LOCATION")
if (status == PackageManager.PERMISSION_GRANTED) {
Log.d("Permission", "permission granted")
} else {
Log.d("Permission", "permission denied")
}
퍼미션 체크는 checkSelfPermission() 함수 이용. 매개변수로 퍼미션 이름을 준다.
결과 값은 상수로 전달
PackageManager.PERMISSION_GRANTED : 퍼미션이 허락된 경우
작업 실행
PackageManager.PERMISSION_DENIED : 퍼미션이 거부된 경우 ->
유저에게 퍼미션을 허락해 달라는 요청을 보내야 한다.
6. Permission Request 방법
1) requestPermissions() 방법
ActivityCompat.requestPermissions(this, arrayOf<String>("android.permission.ACCESS_FINE_LOCATION"), 100)
한꺼번에 여러개의 퍼미션을 배열(arrayOf)로 줄 수 있다.
유저가 거부 혹은 확인을 선택하면 onRequestPermissionsResult() 함수가 자동 콜 됨.
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray // 유저의 선택
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "permission granted", Toast.LENGTH_SHORT).show()
} else {
Toast.makeText(this, "permission denied", Toast.LENGTH_SHORT).show()
}
}
2) registerForActivityResult() 방법
API 31 버전에서 추가
val requestPermissionLauncher = registerForActivityResult(
ActivityResultContracts.RequestPermission()
) { isGranted ->
if (isGranted) {
Toast.makeText(this, "permission granted", Toast.LENGTH_SHORT).show()
} else {
Toast.makeText(this, "permission denied", Toast.LENGTH_SHORT).show()
}
}
실행 예)
requestPermissionLauncher.launch(Manifest.permission.ACCESS_FINE_LOCATION)