앱에서 권한을 요청을 하는 방법을 알아봅시다. 그것도 Kotlin으로. 그것이 정답이니까.
처음엔 한 가지 권한을 요청하는 방법을 보고 뒤로 여러 가지의 권한을 요청하는 방법을 봅시다.
// 카메라 권한 요청
<uses-permission android:name="android.permission.CAMERA"/>
// 위치 권한 요청
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
private val cameraResultLauncher : ActivityResultLauncher<String> =
// 버튼을 누르면 권한 요청을 줄 메소드
registerForActivityResult(
ActivityResultContracts.RequestPermission()) {
// 대화상자로 권한을 요청한다.
isGranted ->
// boolean으로 권한이 승인 되었는지 확인한다.
if(isGranted) {
Toast.makeText(this,
"카메라 권한 승인", Toast.LENGTH_LONG).show()
} else {
Toast.makeText(this,
"카메라 권한 거절", Toast.LENGTH_LONG).show()
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val btnCameraPermission : Button = findViewById(R.id.btn_Permission)
btnCameraPermission.setOnClickListener {
if(Build.VERSION.SDK_INT>= Build.VERSION_CODES.M &&
shouldShowRequestPermissionRationale(Manifest.permission.CAMERA)
){
// 권한 요청을 거부한 상태면 true를 반환한다.
Toast.makeText(this, "카메라 권한이 필요합니다", Toast.LENGTH_SHORT).show()
// else if()로 shouldShowRequestPermissionRationale를 사용하여 다른 권한도
// 이전 권한 결과값을 보여줄 수 있다.
} else {
cameraResultLauncher.launch(
Manifest.permission.CAMERA
// camera 권한
)
}
}
}
private val cameraAndLocationResultLauncher : ActivityResultLauncher<Array<String>> =
registerForActivityResult(
ActivityResultContracts.RequestMultiplePermissions()) {
permissions ->
permissions.entries.forEach{
// map으로 받아온 권한을 key와 value로 구분하여 요청 결과값을 받아옴
val permissionName = it.key // 권한 이름
val isGranted = it.value // 권한 요청 결과값
if(isGranted) {
if(permissionName == Manifest.permission.ACCESS_FINE_LOCATION) {
Toast.makeText(
this,
"fine location 권한 승인",
Toast.LENGTH_LONG
).show()
}else if(permissionName == Manifest.permission.ACCESS_COARSE_LOCATION) {
Toast.makeText(
this,
"coarse location 권한 승인",
Toast.LENGTH_LONG
).show()
} else {
Toast.makeText(
this,
"카메라 권한 승인",
Toast.LENGTH_LONG
).show()
}
} else {
if(permissionName == Manifest.permission.ACCESS_FINE_LOCATION) {
Toast.makeText(
this,
"fine location 권한 거절",
Toast.LENGTH_LONG
).show()
} else if(permissionName == Manifest.permission.ACCESS_COARSE_LOCATION) {
Toast.makeText(
this,
"coarse location 권한 거절",
Toast.LENGTH_LONG
).show()
} else {
Toast.makeText(
this,
"카메라 권한 거절",
Toast.LENGTH_LONG
).show()
}
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val btnCameraPermission : Button = findViewById(R.id.btn_Permission)
btnCameraPermission.setOnClickListener {
if(Build.VERSION.SDK_INT>= Build.VERSION_CODES.M &&
shouldShowRequestPermissionRationale(Manifest.permission.CAMERA)
){
// 권한 요청을 거부한 상태면 true를 반환한다.
Toast.makeText(this, "카메라 권한이 필요합니다", Toast.LENGTH_SHORT).show()
// else if()로 shouldShowRequestPermissionRationale를 사용하여 다른 권한도
// 이전 권한 결과값을 보여줄 수 있다.
} else {
cameraAndLocationResultLauncher.launch(
arrayOf(Manifest.permission.CAMERA,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
)
// Array로 권한들을 넣어준다.
)
}
}
}