범위 저장소가 Android Q에서 부터 강제되면서 공용 저장소에 사진을 저장하기 위해선 경로가 아닌 Uri를 사용해야한다.
private fun captureImageFromCamera() {
Intent(MediaStore.ACTION_IMAGE_CAPTURE).also {intent ->
intent.resolveActivity(packageManager)?.also {
intent.putExtra(MediaStore.EXTRA_OUTPUT, getSavedImageUri()) // 카메라 인텐트로 이미지를 저장할 Uri를 넘겨줌
startActivityForResult(intent, REQUEST_CAPTURE_PHOTO)
}
}
}
// MediaStore를 통해 공용저장소의 경로 대신 Uri를 획득 (Ex DCIM, Picture 등 폴더 및 하위)
private fun getSavedImageUri(): Uri? {
val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss").format(Date())
val name = "JPEG_${timeStamp}_"
val contentValues = ContentValues()
contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, "$name.jpg")
contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/jpg")
contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, "${Environment.DIRECTORY_DCIM}/Camera")
return contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)
}
captureImageFromCamera() 메서드 안에서처럼 카메라 인텐트를 시작하기 전에 Uri를 넘겨준다.