안드로이드 폰에서 카메라로 사진을 촬영하고 이미지를 갤러리에서 가져오는 앱을 만들어 볼 것이다.
앞으로 만들 앱의 작동 순서는 다음과 같다.
카메라 관련 작업은 위험 권한으로 분류되어 권한 처리가 필요하다.
(안드로이드 6.0 (API level 23, targetSdkVersion 23) 버전 이후에 해당)
권한 명세 설정은 AndroidManifest.xml 파일에서 할 수 있다.
[app]-[manifests]의 AnddroidManifest.xml 파일을 열고
① 카메라의 권한 ② 카메라로 촬영한 사진에 대한 접근 권한을 선언한다.
선언 위치는 < application > 태그 시작 전에 입력한다.
class MainActivity : AppCompatActivity () 안에 다음 코드들을 순서대로 작성한다.
권한을 그룹별로 나눠서 저장소 권한과 카메라 권한을 따로 상수에 저장해둔다.
val CAMERA_PERMISSION = arrayOf(Manifest.permission.CAMERA)
val STORAGE_PERMISSION = arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE)
숫자로 사용했던 권한 요청 플래그를 상수로 미리 정의하고 사용한다. 위 코드 밑에 작성한다.
val FLAG_PERM_CAMERA = 98
val FLAG_PERM_STORAGE = 99
승인 후 처리하는 코드는 반복문을 사용하기 때문에 개수와 상관없이 그대로 사용할 수 있다. onCreate() 아래에 작성한다.
fun checkPermission(permission: Array<out String>, flag: Int): Boolean {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
for (permission in permissions) {
if (ContextCompat.checkSelfPermission(this, permisiion) !=
PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, permission, flag)
return false
}
}
}
return true
}
권한 체크 메서드에 직접 권한 배열과 사용할 플래그를 넘겨서 체크하도록 변경한다. 이렇게 하면 카메라 권한은 카메라를 사용할 때만, 스토리지 권한은 스토리지를 사용할 때만 요청할 수 있다.
override fun onRequestPermissionsResult(requestCode: Int
, permissions: Array<out String>
, grantResults: IntArray) {
when (requestCode) {
FLAG_PERM_STORAGE -> {
for (grant in grantResults) {
if (grant != PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "저장소 권한을 승인해야지만 앱을 사용할 수 있습니다.", Toast.LENGTH_LONG).show()
}
}
}
이 앱은 저장소 권한이 없으면 사용할 수 없기 때문에 저장소 권한은 앱을 실행할 때 호출하고 권한 승인이 안되면 앱이 종료되로록 한다.
Toast 메시지를 띄우는 메소드 밑에 finish() 작성
FLAG_PERM_CAMERA -> {
for (grnat in grantResults) {
if (grnat != PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "카메라 권한을 승인해야지만 카메라를 사용할 수 있습니다.", Toast.LENGTH_LONG).show()
}
}
}
Intent에 카메라 앱의 정보를 담아 새로운 Activity로 호출하면 카메라 앱의 촬영 화면을 호출할 수 있다.