외부 저장소에 파일을 저장하기 위해서는 MediaStore를 통해서만 가능하다.
촬영된 이미지 파일을 외부 저장소에 저장하기 위한 메서드를 만든다.
MainActivity.kt 파일에 이미지 파일을 만드는 메서드를 정의한다.
메서드는 파일명, 마임타입, 비트맵을 파라미터로 사용하고 처리된 결괏값으로 Uri를 반환한다.
메서드의 파라미터로 넘겨받은 값으로 MediaStore에 저장할 파일의 이름과 마임타입을 설정한다.
안드로이드 버전을 체크해서 Q이상이면 다른 곳에서 내가 사용하는 데이터를 요청할 경우 무시하는 옵션을 추가한다.
IS_PENDING이 1일 때 동작하고 처리가 완료되면 다시 0으로 돌려 놓는 코드를 작성해야 한다.
MediaStore에 파일을 등록하고, 등록된 Uri를 특정 변수에 너장한다.
파일을 읽고 쓸수 있는 파일디스크립터를 열고 변수에 저장한다.
파일디스크립터를 사용할 수 있다면, FileOutputStream으로 비트맵 파일을 저장한다. (압축률 숫자가 작을수록 화질이 낮아지면서 파일의 크기도 작아진다.)
저장이 안료되면 IS_PENDING을 0DMFH QUSRUDGKRH, MediaStore를 업데이트한다.
완료되면 uri를 반환해서 호출한 측에서 사용할 수 있도록 한다.
onActivityResult( ) 메서드에서 카메라로 찍은 후 전달된 이미지를 저장하기 위한 코드를 작성한다.
사진을 저장하려면 파일명이 중복되지 않도록 해야한다. 사진이 저장되는 현재 시간을 이용해서 파일명을 생성하여 파일명이 중복되지 않도록하는 메서드를 작성한다.
카메라가 정상적으로 호출된 후 사용자가 사진 촬영을 하면 결과값을 전달 받는 메서드를 작성한다.
메서드로 전달된 비트맵을 saveImageFile( ) 함수에서 전처리하고, 반환된 Uri를 이미지뷰에 세팅하도록 코드를 작성한다.
Intent와 startActivityForResult( ) 메서드로 갤러리 앱을 호출해 사용자가 사진을 선택하고 onActivityResult( ) 메서드에서 선택한 사진의 정보를 받을 수 있다.
activity_main.xml 파일에 UI 화면을 디자인하고 디자인화면에서 추가한 컴포넌트를 동작시켰을 때 반응을 확인하는 Listener를 추가한다.
갤러리를 호출하는 코드를 작성한다.
디자인 화면에 추가된 컴포넌트의 동작을 통해 전달된 이미지 데이터를 디자인 화면에 추가했던 이미지뷰에 세팅한다.