Mobile/Kotlin

[kotlin] 권한 처리하기

클리엘 2020. 12. 23. 13:01
728x90

사용자 기기의 특정 영역에 접근하려면 그에 해당하는 권한을 얻어야 합니다. 이번 예제에서는 카메라에 접근하는 앱을 만들어 권한을 어떻게 처리할 수 있을지를 알아보도록 하겠습니다.

 

우선 다음과 같이 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를 누르면 카메라를 실행합니다.

 

 

만약 앱을 수정해 다시 테스트해야 한다면 앱을 삭제하고 다시 실행해야 합니다.

728x90