본문 바로가기

OS/Android

안드로이드 request Permission

반응형

안드로이드 API 23 이상부터는 사용자들에게 권한을 요청해야만 권한을 얻을 수 있다.

앱을 시작할 때 한번에 권한을 획득하는게 개발자 입장에선 편하지만 유저 입장에서는 당혹스러울 수 있으니 해당 권한을 필요로하는 기능을 실행하기전에 요청 하는 것을 권한다.

권한을 요청하는 소스를 계속 복붙하다보면 겉잡을 수 없이 소스가 더러워질 수 있으니 클래스로 따로 빼서 개발하도록 하자.

object ComPermission
{
    enum class EnumPermission
    {
        STORAGE_PERMISSION, CAMERA_PERMISSION
    }

    const val PERMISSION_REQUEST_OK = 87

    private val m_arrStoragePermissions = arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE)
    private val m_arrCameraPermissions = arrayOf(Manifest.permission.CAMERA)

    private fun getPermissionsType(enumPermission : EnumPermission) : Array<String>
    {
        when(enumPermission)
        {
            EnumPermission.STORAGE_PERMISSION   ->      return m_arrStoragePermissions
            EnumPermission.CAMERA_PERMISSION    ->      return m_arrCameraPermissions
        }
    }

    fun getPermissionState(activity : Activity, enumPermission : EnumPermission) : Boolean
    {
        val arrPermission = getPermissionsType(enumPermission)
        var i = 0
        val size = arrPermission.size
        for (permission in arrPermission)
        {
            if (ContextCompat.checkSelfPermission(activity, permission) == PackageManager.PERMISSION_GRANTED) i++
        }

        if (i == size) return true

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
        {
            ActivityCompat.requestPermissions(activity, arrPermission, PERMISSION_REQUEST_OK)
        }
        return false
    }

    fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray, enumPermission : EnumPermission) : Boolean
    {
        val myPermissions = getPermissionsType(enumPermission)
        if (requestCode == PERMISSION_REQUEST_OK)
        {
            var w = 0
            loop1@ for (permission in permissions)
            {
                for (cameraPermission in myPermissions)
                {
                    if (permission == cameraPermission)
                    {
                        w++
                        continue@loop1
                    }
                }
            }
            if (w != myPermissions.size) return false

            var i = 0
            for (grant in grantResults)
            {
                if (grant == PackageManager.PERMISSION_GRANTED) i++
            }

            if (i == permissions.size) return true
        }
        return false
    }
}

원하는 퍼미션 배열을 생성하고 getPermissionsType과 EnumPermission에 타입을 추가한다.

엑티비티에서 아래와 같이 사용하면 된다.

    private fun onBtnDownload()
    {
        val bResult = ComPermission.getPermissionState(this, ComPermission.EnumPermission.STORAGE_PERMISSION)
        if (bResult)
        {
            //권한이 이미 있음
            ComFile.downloadPicture()
        }
        else
        {
            //권한이 없어서 유저에게 권한 요청을 한 상태
        }
    }

    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray)
    {
        val bResult = ComPermission.onRequestPermissionsResult(requestCode, permissions, grantResults, ComPermission.EnumPermission.STORAGE_PERMISSION)
        if (bResult)
        {
            // 유저가 모든 권한을 승인했을 때
            onBtnDownload()
        }
        else
        {
            // 권한을 요청하였지만 유저가 거부했음
            ComEtc.showMyToast(this, "권한을 취소하여 사진을 다운로드할 수 없습니다~~")
        }
    }

 

반응형