android 6.0 마시멜로부터 런타임 권한 처리가 추가되었다. 예를 들어서 카메라와 갤러리를 호출하기 위해서는 접근 권한이 필요한데, 6.0 이전까지는 AndroidManifest에 사용할 permission만 추가하면 되었지만 이제는 앱 사용 중 실제로 접근하는 시점에 권한을 허용했는지 체크하여 처리를 해야한다.
카메라, 갤러리 뿐만 아니라 전화번호부 읽어오기, 직접 전화 걸기 등 앱을 사용하면서 체크해야 할 권한의 종류가 굉장히 많은데, 카메라와 사진첩(갤러리) 접근 권한으로 안드로이드 권한처리에 대하여 알아보자.
1. AndroidManifest.xml 파일에 선언
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
2. 권한요청
fun requestPermissions(): Boolean {
if(ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED
&& ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED){
return true
}
val permissions: Array<String> = arrayOf(
Manifest.permission.CAMERA,
Manifest.permission.READ_EXTERNAL_STORAGE)
ActivityCompat.requestPermissions(this, permissions, 0)
return false
}
3. 권한요청 처리 결과 수신
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
when(requestCode){
0 -> {
if (grantResults.isNotEmpty()){
var isAllGranted = true
// 요청한 권한 허용/거부 상태 한번에 체크
for (grant in grantResults) {
if (grant != PackageManager.PERMISSION_GRANTED) {
isAllGranted = false
break;
}
}
// 요청한 권한을 모두 허용했음.
if (isAllGranted) {
// 다음 step으로 ~
}
// 허용하지 않은 권한이 있음. 필수권한/선택권한 여부에 따라서 별도 처리를 해주어야 함.
else {
if(!ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.READ_EXTERNAL_STORAGE)
|| !ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.CAMERA)){
// 다시 묻지 않기 체크하면서 권한 거부 되었음.
} else {
// 접근 권한 거부하였음.
}
}
}
}
}
}
4. "다시 묻지 않기" 상태로 거부되었을 경우, 앱 설정 화면으로 이동하여 권한을 직접 풀어주도록 유도
val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
.setData(Uri.parse("package:" + BuildConfig.APPLICATION_ID))
startActivity(intent)
'프로그래밍 > android' 카테고리의 다른 글
[android] Android 11, targetSdkVersion 30 전화번호 읽기 권한 READ_PHONE_STATE, READ_PHONE_NUMBERS (0) | 2021.01.27 |
---|---|
[android] 안드로이드 빠른 스플래시 처리 (#splash) (0) | 2021.01.15 |
[kotlin] for문 다양한 사용법 (0) | 2021.01.12 |
[kotlin] 커스텀 리스너(Custom Listener)를 람다(Lamda) 형식으로 사용하기 (0) | 2021.01.08 |
[android] 강제 회전 시키기 #screenOrientation (portrait <---> landscape) (0) | 2021.01.06 |