<uses-permission android:name="android.permission.CAMERA"/> //카메라 권한
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> //저장소 읽기
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> //저장소 쓰기
//카메라 요청
fun openCamera() {
val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
startActivityForResult(intent, REQ_CAMERA) //101
}
카메라에서 찍은 사진을 외부저장소(포토갤러리)에 저장할 거면
setContentView 아랫줄에 저장소 권한을 요청하는 코드를 작성해야한다.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
//외부 저장소 권한 요청
requirePermissions(arrayOf(android.Manifest.permission.WRITE_EXTERNAL_STORAGE),PERM_STORAGE) //99
}
외부 저장소 권한 요청(99) > 저장소 승인 시 실행할 코드(permissionGranted) or 승인 거부시 실행할코드 (permissionDenied) >
외부 저장소 권한이 승인되었을 때 호출 (setViews) > 버튼 클릭 시 카메라 권한 요청(100) (직접 호출이 아닌 결과에 따라 승인되었을 경우에만 permissionGranted()에서 카메라를 요청할 것.)
카메라 요청(101)하는 openCamera() 작성
권한 처리 메서드에서 각각의 코드 완성하기.
permissionGranted() 에서 > 카메라 권한 승인 시 > openCamera()
정리 : 외부 저장소 권한 요청 > 승인 > 카메라 권한 요청 > 승인 > 카메라 요청
외부 저장소 권한 요청 > 거부 > 토스트 메시지 > 앱 종료
외부 저장소 권한 요청 > 승인 > 카메라 권한 요청 > 거부 > 토스트 메시지
사진 촬영 > 결과값 > 이미지뷰에 출력
사진 촬영이 완료되면 onActivityResult() 메서드로 결괏값이 전달된다!!
촬영한 사진 정보는 세번째 파라미터인 data에 인텐트로 전달이 된다.
전달받은 data 파라미터에서 사진을 꺼내 이미지 뷰에 셋팅.
:data 파라미터를 통해 전달되는 사진은 data.extras.get("data")로 꺼낼 수 있다. 꺼낸 값이 null이 아닌지 확인 후 Bitmap으로 형변환 하고 사용해야 한다. data.extras.get으로 꺼낸 값의 타입이 Object이므로 변환하지 않으면 이미지뷰에 사용할 수 없다. data나 extras가 null일 수 도 있기때문에 data?.extras?.get("data")로 null안정성 체크하기.
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if(resultCode == Activity.RESULT_OK)
when(requestCode) {
REQ_CAMERA -> {
realUri?.let { uri ->
val bitmap = loadBitmap(uri)
binding.challengeWriteImage.setImageBitmap(bitmap)
if(findImageFileNameFromUri(uri)) {
Log.d("PICK_FROM_GALLERY","갤러리에서 절대주소 Pick 성공")
} else {
Log.d("PICK_FROM_GALLERY","갤러리에서 절대주소 Pick 실패")
}
realUri = null
}
}
REQ_STORAGE -> {
//갤러리에서 가져온 이미지데이터를 IMAGEPREVIEW에 할당
//(data의 data속성으로 해당 이미지의 uri가 전달)
data?.data?.let { uri ->
binding.challengeWriteImage.setImageURI(uri)
realUri = uri
}
}
}
}
var realUri : Uri? = null //uri 는 특정 리소스 자원을 고유하게 식별할 수 있는 식별자 의미.
//이미지를 미디어 스토어에 생성
fun createImageUri(filename:String, mimeType:String):Uri? {
var values = ContentValues() //(파일명, 파일타입 입력)
values.put(MediaStore.Images.Media.DISPLAY_NAME, filename)
values.put(MediaStore.Images.Media.MIME_TYPE, mimeType)
return contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,values)
}
//MediaStore.Images.Media.EXTERNAL_CONTENT_URI : 사진이 저장될 저장소의 이름이 상수로 정의되어 있는 것.
//db로 비교하면 테이블 이름과 같은 역할.
사진 촬영 > 파일명 생성 > 이미지 uri 생성 > 미디어 스토어에 저장 > uri를 사용해서 미디어 스토어에 저장된 이미지 읽어오기 >