사용자 기기의 특정 영역에 접근하려면 그에 해당하는 권한을 얻어야 합니다. 이번 예제에서는 카메라에 접근하는 앱을 만들어 권한을 어떻게 처리할 수 있을지를 알아보도록 하겠습니다.
우선 다음과 같이 app -> manifests에 있는 AndroidManifest.xml파일을 열어 다음과 같이 user-permission태그를 추가해 카메라 사용자 권한을 추가합니다.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapplication">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
        <uses-permission android:name="android.permission.CAMERA"></uses-permission>
</manifest>
그리고 임의의 버튼 하나를 만들어 둡니다.

MainActivity에서 카메라에 접근하기 전에 이미 해당 권한이 부여되어 있는지를 확인하도록 하는 함수를 작성합니다. 권한이 부여되어 있는데 계속 권한 요청을 하면 문제가 되겠죠. 예제에서는 checkPermission으로 이 부분을 구현하였으며 checkSelfPermission의 결과가 PERMISSION_GRANTED라면 권한이 이미 부여되었다고 판단하면 됩니다.
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
    fun checkPermission(): Boolean {
        val cameraPermission = ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA)
        if (cameraPermission == PackageManager.PERMISSION_GRANTED)
            return true
        else
            return false
    }
}위에서 생성해둔 버튼에 클릭리스너를 생성하고 위에서 작성한 함수를 호출해 결과를 받도록 합니다.
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    button.setOnClickListener {
        val rtn = checkPermission()
    }
}그다음 카메라를 열게 하는 함수를 작성합니다. 이 함수는 아래 주소에서 가져왔습니다. 구글 사진 촬영 예제에서 가져왔습니다.
fun dispatchTakePictureIntent() {
    Intent(MediaStore.ACTION_IMAGE_CAPTURE).also { takePictureIntent ->
        takePictureIntent.resolveActivity(packageManager)?.also {
            startActivityForResult(takePictureIntent, 1)
        }
    }
}권한이 부여된 상태라면 dispatchTakePictureIntent 함수를 호출해 카메라를 실행하도록 합니다.
button.setOnClickListener {
    val rtn = checkPermission()
    if (rtn)
        dispatchTakePictureIntent()
}만약 권한이 부여되지 않았다면 이제 사용자에게 접근권한을 요청해야 합니다. 따라서 다음과 같이 권한을 요청하는 함수를 작성합니다. 맨 끝에 1이라고 지정한 값은 응답을 받을 때 구별하기 위한 요청 코드이며 구별 가능한 임의의 값을 지정하면 됩니다.
fun requestPermission() {
    ActivityCompat.requestPermissions(this, arrayOf(android.Manifest.permission.CAMERA), 1)
}위 함수를 호출하면 카메라에 대한 권한을 사용자에게 요청하게 되는데 사용자가 요청에 대한 응답을 하게 되면 onRequestPermissionsResult 함수를 실행하게 되므로 이 함수를 override합니다.
함수에서 requestCode를 통해 권한을 요청했던 코드와 비교하고 맞다면 grantResults로 승인 여부를 확인합니다. 권한이 승인되었다면 카메라를 실행하면 되지만 그렇지 않으면 그대로 처리를 종료합니다.
override fun onRequestPermissionsResult(
    requestCode: Int,
    permissions: Array<out String>,
    grantResults: IntArray
) {
    if (requestCode == 1){
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED)
            dispatchTakePictureIntent()
        else
            finish()
    }
}함수를 만들었으면 버튼 리스너에서 결과가 false일 때 권한 요청을 하는 함수를 호출하도록 합니다.
button.setOnClickListener {
    val rtn = checkPermission()
    if (rtn)
        dispatchTakePictureIntent()
    else
        requestPermission()
}이제 앱을 실행해 봅시다.

버튼을 누르면 권한 요청부터 시작합니다.

Allow를 누르면 카메라를 실행합니다.

만약 앱을 수정해 다시 테스트해야 한다면 앱을 삭제하고 다시 실행해야 합니다.
'Mobile > Kotlin' 카테고리의 다른 글
| [kotlin] Preferences (0) | 2020.12.28 | 
|---|---|
| [kotlin] 저장소및 파일처리 (0) | 2020.12.24 | 
| [Kotlin] 위젯 - ViewPager2 (0) | 2020.12.23 | 
| [Kotlin] Widget 만들기 (0) | 2020.12.22 | 
| [Kotlin] View (0) | 2020.12.22 | 
![[kotlin] 권한 처리하기](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FsNa0g%2FbtqJWToYLTK%2FAAAAAAAAAAAAAAAAAAAAAP3yeYKxEookUPyVr-1FwqypsRUMeU3dTGrxe6p_zg9v%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1761922799%26allow_ip%3D%26allow_referer%3D%26signature%3D3zZ89qt10jefAe5JZx%252Fl5308ceE%253D)