Android
[Android] 권한 요청
Xmobile
2020. 10. 5. 15:56
모든 Android 앱은 액세스가 제한된 샌드박스에서 실행됩니다. 자체 샌드박스 밖에 있는 리소스나 정보를 앱이 사용해야 하는 경우에는 앱이 적절한 권한을 요청해야 합니다. 앱에 권한이 필요하다고 선언하려면 권한을 앱 매니페스트에 표시한 후 사용자가 런타임에 각 권한을 승인하도록 요청합니다(Android 6.0 이상).
1.매니페스트에 권한 추가
<uses-permission android:name="android.permission.CAMERA" />
2 6.0이상 버전에 대해서 요청을 합니다.
private fun setupUI() {
binding.request.setOnClickListener {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
showCamera()
} else {
showCameraWithPermission(Manifest.permission.CAMERA
, "게임에 필요한 권한 필요” //거절한 경우 필요 설명
, "카메라 권한 요청”) //거절한 경우 버튼 설명
}
}
}
3. 권한 요청
@RequiresApi(Build.VERSION_CODES.M)
private fun showCameraWithPermission(permissionName: String, reasonDesc: String, reasonButtonText: String) {
if (checkSelfPermission(permissionName) == PackageManager.PERMISSION_GRANTED) {
//허용
showCamera()
} else {
if (shouldShowRequestPermissionRationale(permissionName)) {
//거절한 경우 설명 후 재 요청.
Snackbar.make(binding.mainLayout, reasonDesc, Snackbar.LENGTH_INDEFINITE)
.setAction(reasonButtonText
) {
requestPermissions(
arrayOf(permissionName),
PERMISSION_REQUEST_CAMERA
)
}.show()
} else {
//거절기록 없을때 최초 false 권한 요청
requestPermissions(
arrayOf(permissionName),
PERMISSION_REQUEST_CAMERA
)
}
}
}
4. 콜백 응답
@RequiresApi(Build.VERSION_CODES.M)
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == PERMISSION_REQUEST_CAMERA) {
if (grantResults.size == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "권한 성공", Toast.LENGTH_SHORT).show()
showCamera()
} else {
if (shouldShowRequestPermissionRationale(Manifest.permission.CAMERA)) {
Toast.makeText(this, "권한 거절", Toast.LENGTH_SHORT).show()
} else {
//거부 및 다시 묻지 않기
Toast.makeText(this, "앱 기능 실행을 위해서는 설정화면에서 권한을 허용해주세요 ", Toast.LENGTH_LONG).show();
}
}
}
}