권한의 유형
1. 권한 명세
2. 기능 명세
- <uses - feature>
- 플레이 스토어에 올렸을 때 해당 기능이 있는기기만 사용할 수 있음
권한 보호 수준
1. 일반권한
- 일반권한으로 설정 팡일인 Android Manifest에 명시하면 설치시 사용자에게 권한 승일을 묻는 팝업창 생성
- 인터넷 사용, 알림 설정 등
2. 위험권한
- 앱이 사용자의 개인정보와 관련된 데이터나 기능을 액세스 하거나 다른 앱 및 기기의 작동에 영향을 줄 우려가 있는 권한
3. 서명 권한
- 권한을 사용하려는 앱이 권한을 정의하는 앱과 동일한 인증서로 서명된 경우 시스템은 권한을 자동으로 등록
Runtime Permission 등록 방법
1. Manifest 에 받고자 하는 권한 등록
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission
android:name="android.permission.BLUETOOTH_SCAN"
android:usesPermissionFlags="neverForLocation"
tools:targetApi="s" />
2. 해당 권한이 허용됐는지 거부 됐는지 확인
private fun hasPermissions(permissions: Array<String>): Boolean {
for (permission in permissions) {
if (ActivityCompat.checkSelfPermission(context, permission)
!= PackageManager.PERMISSION_GRANTED
) {
Timber.d("PERMISSION CHECK : $permission NOT GRANTED")
return false
}
}
return true
}
- 해당 함수를 만들어 해당함수의 매개변수로 받은 권한이 허용되었는지 거부되었는지 확인
- return value
3. registerForActivityResult 콜백 작성
private val requestPermission =
registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) {
if(Build.VERSION.SDK_INT == Build.VERSION_CODES.TIRAMISU) {
if(it[android.Manifest.permission.BLUETOOTH_SCAN] == true ||
it[android.Manifest.permission.BLUETOOTH_CONNECT] == true
) {
}
else {
if(!shouldShowRequestPermissionRationale(android.Manifest.permission.BLUETOOTH_SCAN) ||
!shouldShowRequestPermissionRationale(android.Manifest.permission.BLUETOOTH_CONNECT)) {
}
else {
}
}
}
}
- 주의해야 할 점은 시스템에서 팝업 시켜주는 권한 허용 다이얼로그에서 2번 거절하면 다시 시스템에서 권한 허용 다이얼로그를 팝업 시켜 주지 않음으로 세팅 화면으로 이동 시켜주어야 함
4. 콜백 실행
val bluetoothPermissionArray: Array<String> = arrayOf(
android.Manifest.permission.BLUETOOTH_SCAN,
android.Manifest.permission.BLUETOOTH_CONNECT
)
requsetPermission.launch(bluetoothPermissionArray)