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)
    }
}

+ Recent posts