728x90
사용자에게 권한을 요청하는 방법
manifest에 퍼미션 등록 ex) 접근 권한을 등록 해준다.(READ_MEDIA_IMAGES)
checkPermission 함수
private fun checkPermission() {
when {
ActivityCompat.checkSelfPermission( //권한이 허용 되었는지 체크
this,
Manifest.permission.READ_MEDIA_AUDIO
) == PackageManager.PERMISSION_GRANTED -> {
loadImage()
}
ActivityCompat.shouldShowRequestPermissionRationale( //권한이 취소되었을 때,
this,
Manifest.permission.READ_MEDIA_AUDIO
) -> {
showRequestRationalDialog() //권한취소시 교육용 다이얼로그
}
else -> requestReadMediaImages() //두 개의 상황이 아닐 때, 권한 요청
}
}
권한을 요청하고 허용을 한 상태이면 다음 동작을 하기 위해 onRequestPermissionsResult()를 오버라이딩 해준다.
원형
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
}
권한 허용시 다음 동작을 위한 코드 (권한이 허용되면, loadImage()를 부른다.)
//요청된 권한 결과 처리
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
val readImagePermissionGranted =
requestCode == REQUEST_READ_MEDIA_IMAGES_CODE && grantResults.firstOrNull() == PackageManager.PERMISSION_GRANTED
if (readImagePermissionGranted) { //request코드 와 권한이 허용된 상태면 loadImages()
loadImage()
} else {
if(ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.READ_MEDIA_IMAGES)){
showRequestRationalDialog() //권한이 거부되면 교육용 다이얼로그
}
else{
showSettingDialog() //다시 취소시 세팅다이얼로그
}
}
}
추가로, 교육용 다이얼로그에서도 거부가 되면 showSettingDialog() 가 뜨는데 setPositiveButton 시 디테일 세팅 으로 이동하는 코드
private fun navigateToSettings() { //권한이 취소된 상태에서 다이얼로그에서 확인 눌렀을 때 세팅화면으로 이동
val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply {
data = Uri.fromParts("package", packageName, null)
}
startActivity(intent)
}
전체 코드
class SearchActivity : AppCompatActivity() {
//request code
companion object {
private const val REQUEST_READ_MEDIA_IMAGES_CODE = 100
}
//
private val loadImageLauncher =
registerForActivityResult(ActivityResultContracts.GetMultipleContents()) { uriList ->
changeImage(uriList)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_search)
val toolBar = findViewById<androidx.appcompat.widget.Toolbar>(R.id.toolBar)
val loadImageButton = findViewById<Button>(R.id.btn_LoadImage)
toolBar.apply {
title = "SearchActivity"
setSupportActionBar(this)
}
supportActionBar?.setDisplayHomeAsUpEnabled(true)
loadImageButton.setOnClickListener {
checkPermission()
}
}
//선택한 uriList 를 image로 세팅
private fun changeImage(uriList: List<Uri>) {
val image = findViewById<ImageView>(R.id.iv_Image)
image.setImageURI(uriList[0])
}
//갤러리 접근
private fun loadImage() {
loadImageLauncher.launch("image/*")
}
//권한 요청
private fun requestReadMediaImages() {
ActivityCompat.requestPermissions(
this, arrayOf(Manifest.permission.READ_MEDIA_IMAGES),
REQUEST_READ_MEDIA_IMAGES_CODE
)
}
//권한 확인
private fun checkPermission() {
when {
ActivityCompat.checkSelfPermission(
this,
Manifest.permission.READ_MEDIA_AUDIO
) == PackageManager.PERMISSION_GRANTED -> {
loadImage()
}
ActivityCompat.shouldShowRequestPermissionRationale(
this,
Manifest.permission.READ_MEDIA_AUDIO
) -> {
showRequestRationalDialog()
}
else -> requestReadMediaImages()
}
}
private fun showRequestRationalDialog() {
AlertDialog.Builder(this).apply {
setMessage("사진을 가져오려면 권한이 필요합니다.")
setNegativeButton("취소") { dialogInterface, _ ->
dialogInterface.cancel()
}
setPositiveButton("확인") { _, _ -> requestReadMediaImages() }
show()
}
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
android.R.id.home -> {
finish()
true
}
else -> super.onOptionsItemSelected(item)
}
}
//요청된 권한 결과 처리
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
val readImagePermissionGranted =
requestCode == REQUEST_READ_MEDIA_IMAGES_CODE && grantResults.firstOrNull() == PackageManager.PERMISSION_GRANTED
if (readImagePermissionGranted) { //request코드 와 권한이 허용된 상태면 loadImages()
loadImage()
} else {
if(ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.READ_MEDIA_IMAGES)){
showRequestRationalDialog() //권한이 거부되면 교육용 다이얼로그
}
else{
showSettingDialog() //다시 취소시 세팅다이얼로그
}
}
}
private fun showSettingDialog() {//셋팅 다이얼로그
AlertDialog.Builder(this).apply {
setMessage("권한이 취소된 상태입니다. 권한 허용 하러가기")
setNegativeButton("취소") { dialogInterface, _ -> dialogInterface.cancel() }
setPositiveButton("확인") { _, _ -> navigateToSettings() }
show()
}
}
private fun navigateToSettings() { //권한이 취소된 상태에서 다이얼로그에서 확인 눌렀을 때 세팅화면으로 이동
val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply {
data = Uri.fromParts("package", packageName, null)
}
startActivity(intent)
}
}