Android Kotlin Permission Check - 권한 요청 및 설정

Notepad96

·

2022. 2. 4. 09:01

300x250

 

 


1. 결 과

결 과

 

# 이 글은 애플리케이션에서 필요한 권한을 요청하고 확인하여 권한 허용 여부의 따른 동작을 설정하는 방법을 기술한다.

 

 

 

 


2. AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.permissionsexample">

    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

    <uses-feature android:name="android.hardware.camera" android:required="true" />
    
    .....

 

# 요구하는 권한을 매니페스트 파일서 user-permission을 사용하여 추가해준다.

 

 

 


3. MainActivity.kt

package com.example.permissionsexample

import android.Manifest
import android.content.pm.PackageManager
import android.os.Build
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast
import androidx.core.content.ContextCompat

class MainActivity : AppCompatActivity() {

    private val REQUEST_PERMISSIONS = 1

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        checkPermission()
    }

    private fun checkPermission() {
        var permission = mutableMapOf<String, String>()
        permission["camera"] = Manifest.permission.CAMERA
        permission["storageRead"] = Manifest.permission.READ_EXTERNAL_STORAGE
        permission["storageWrite"] =  Manifest.permission.WRITE_EXTERNAL_STORAGE

        // 현재 권한 상태 검사
        var denied = permission.count { ContextCompat.checkSelfPermission(this, it.value)  == PackageManager.PERMISSION_DENIED }

        // 마시멜로 버전 이후
        if(denied > 0 && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            requestPermissions(permission.values.toTypedArray(), REQUEST_PERMISSIONS)
        }
    }

    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if(requestCode == REQUEST_PERMISSIONS) {

            /* 1. 권한 확인이 다 끝난 후 동의하지 않은것이 있다면 종료
            var count = grantResults.count { it == PackageManager.PERMISSION_DENIED } // 동의 안한 권한의 개수
            if(count != 0) {
                Toast.makeText(applicationContext, "서비스의 필요한 권한입니다.\n권한에 동의해주세요.", Toast.LENGTH_SHORT).show()
                finish()
            } */

            /* 2. 권한 요청을 거부했다면 안내 메시지 보여주며 앱 종료 */
            grantResults.forEach {
                if(it == PackageManager.PERMISSION_DENIED) {
                    Toast.makeText(applicationContext, "서비스의 필요한 권한입니다.\n권한에 동의해주세요.", Toast.LENGTH_SHORT).show()
                    finish()
                }
            }
        }
    }

}

 

# checkPermission 함수를 정의하였으며 이는 현재 permission(권한)의 상태를 체크한다.

 

권한은 허용 후 옵션에서 다시 거부로 바꿀 수도 있으므로 애플리케이션을 실행할 때마다 체크가 필요하다.

 

상태를 체크한 후 권한이 필요하다면 requestPermmisions를 사용하여 권한을 요청할 수 있다.

 

 

 

private fun checkPermission() {
    var permission = mutableMapOf<String, String>()
    permission["camera"] = Manifest.permission.CAMERA
    permission["storageRead"] = Manifest.permission.READ_EXTERNAL_STORAGE
    permission["storageWrite"] =  Manifest.permission.WRITE_EXTERNAL_STORAGE

    // 현재 권한 상태 검사
    var denied = permission.count { ContextCompat.checkSelfPermission(this, it.value)  == PackageManager.PERMISSION_DENIED }

    // 마시멜로 버전 이후
    if(denied > 0 && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        requestPermissions(permission.values.toTypedArray(), REQUEST_PERMISSIONS)
    }
}

 

# 여기서는 mutableMap을 사용하여 권한을 묶어서 관리를하며 count를 사용하여 DENIED 된 권한의 개수를 구한다.

 

# 개수가 0 이상(거부한 권한이 있음)이며 현재 빌드 버전이 마시멜로 이후 버전이라면 권한을 요청하도록 requestPermissions를 호출하도록 한다.

 

마시멜로 버전 이후 이상인 이유는 마시멜로 버전부터 이용자가 권한을 허락해야 이용이 가능하도록 바뀌었기 때문이다.

 

 

 

override fun onRequestPermissionsResult(
    requestCode: Int,
    permissions: Array<out String>,
    grantResults: IntArray
) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    if(requestCode == REQUEST_PERMISSIONS) {

        /* 1. 권한 확인이 다 끝난 후 동의하지 않은것이 있다면 종료
        var count = grantResults.count { it == PackageManager.PERMISSION_DENIED } // 동의 안한 권한의 개수
        if(count != 0) {
            Toast.makeText(applicationContext, "서비스의 필요한 권한입니다.\n권한에 동의해주세요.", Toast.LENGTH_SHORT).show()
            finish()
        } */

        /* 2. 권한 요청을 거부했다면 안내 메시지 보여주며 앱 종료 */
        grantResults.forEach {
            if(it == PackageManager.PERMISSION_DENIED) {
                Toast.makeText(applicationContext, "서비스의 필요한 권한입니다.\n권한에 동의해주세요.", Toast.LENGTH_SHORT).show()
                finish()
            }
        }
    }
}

 

# 사용자에게 권한을 요청한 후 결과를 처리하는 곳으로 grantResult의 값이 DENIED일 경우 Toast 메시지와 함깨 애플리케이션이 종료되도록 구성하였다.

 

 

 

 

 


4. 전체 코드

 

 

GitHub - Notepad96/BlogExample

Contribute to Notepad96/BlogExample development by creating an account on GitHub.

github.com

 

300x250