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