
Android Kotlin 런타임 권한 요청
안드로이드 6.0 (API 23)부터 도입된 런타임 권한 시스템은 앱이 필요한 권한을 실행 중에 요청하도록 요구합니다. 이는 사용자의 보안을 강화하고, 불필요한 권한 요청을 최소화하는 데 목적이 있습니다.
이번 포스팅에서는 런타임 권한을 요청하고 허가받는 방법을 단계별로 알아보겠습니다.
1. 매니페스트에서 권한 선언하기
권한을 요청하기 전에, AndroidManifest.xml
에 필요한 권한을 먼저 선언해야 합니다.
<manifest ...>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
</manifest>
2. 런타임 권한 요청하기
권한이 필요한 기능을 실행하기 전에 checkSelfPermission
을 사용하여 권한이 부여되었는지 확인해야 합니다.
📌 2.1 권한 요청 코드 작성
class MainActivity : AppCompatActivity() {
private val CAMERA_PERMISSION_CODE = 100
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
findViewById<Button>(R.id.button_request_permission).setOnClickListener {
requestCameraPermission()
}
}
private fun requestCameraPermission() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
== PackageManager.PERMISSION_GRANTED) {
showToast("카메라 권한이 이미 허용되었습니다.")
} else {
ActivityCompat.requestPermissions(this,
arrayOf(Manifest.permission.CAMERA), CAMERA_PERMISSION_CODE)
}
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == CAMERA_PERMISSION_CODE) {
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
showToast("카메라 권한이 허용되었습니다.")
} else {
showToast("카메라 권한이 거부되었습니다.")
}
}
}
private fun showToast(message: String) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
}
}
3. 여러 개의 권한을 동시에 요청하는 방법
여러 개의 권한이 필요한 경우, requestPermissions
메서드에 배열로 권한을 전달하면 됩니다.
ActivityCompat.requestPermissions(this,
arrayOf(Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE), 101)
이후 onRequestPermissionsResult
에서 각각의 권한이 승인되었는지 확인하면 됩니다.
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
when (requestCode) {
101 -> {
val cameraGranted = grantResults.getOrNull(0) == PackageManager.PERMISSION_GRANTED
val storageGranted = grantResults.getOrNull(1) == PackageManager.PERMISSION_GRANTED
if (cameraGranted && storageGranted) {
showToast("모든 권한이 허용되었습니다.")
} else {
showToast("필수 권한이 거부되었습니다.")
}
}
}
}
4. 사용자가 권한을 거부했을 때 추가 처리하기
일부 사용자는 “다시 묻지 않기”(Don’t ask again) 옵션을 활성화하여 권한 요청을 무시할 수도 있습니다. 이를 확인하려면 shouldShowRequestPermissionRationale
을 사용해야 합니다.
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
// 권한이 필요한 이유를 사용자에게 설명하는 다이얼로그 표시 가능
showToast("이 기능을 사용하려면 카메라 권한이 필요합니다.")
} else {
// 권한이 완전히 거부됨 (설정 화면으로 이동 유도)
showToast("카메라 권한이 필요합니다. 설정에서 허용해주세요.")
}
설정 화면으로 이동하는 코드 예제:
val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:$packageName"))
startActivity(intent)