반응형
안드로이드 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, "권한을 취소하여 사진을 다운로드할 수 없습니다~~")
}
}
반응형
'OS > Android' 카테고리의 다른 글
AudioRecord to Wav 저장용 (0) | 2020.11.05 |
---|---|
안드로이드 Room (0) | 2020.10.25 |
안드로이드 targetSdkVersion 29에서 외부저장소 접근하기 (0) | 2020.09.18 |
No field with the name mListener is found in Animation class (0) | 2020.09.08 |
안드로이드 CustomView 생성자 (0) | 2020.07.16 |