스토리지 액세스 프레임워크
[안드로이드 스토리지 액세스 프레임워크를 사용해서 클라우드 기반의 스토리지(구글 드라이드 등)에 파일을 열고, 생성하고, 저장하는 애플리케이션 구현하기]
1. 스토리지 액세스 프레임워크 : 클라우드 기반의 스토리지 액세스를 안드로이드 애플리케이션에 통합시키는 절차를 수월하게 해줌.
- 사용자에게 사용하기 쉬운 인터페이스 제공 = 안드로이드 애플리케이션의 스토리지 서비스(=문서 제공자)가 호스팅하는 파일들의 브라우징, 삭제, 생성을 쉽게 할 수 있음
- 사용(안드로이드 4.4 ~)
onActivityResult()
[스토리지 액세스 프레임워크 인텐트]
○ ACTION_OPEN_DOCUMENT : 장치에 구성된 문서 제공자에서 파일을 선택할 수 있도록 사용자에게 피커 사용자 인터페이스 액세스를 제공함. 선택된 파일들은 URI 객체 형태로 애플리케이션에 전달됨
○ ACTION_CREATE_DOCUMENT : 사용자가 문서 제공자와 그 제공자의 스토리지 위치 및 새로운 파일명을 선택할 수 있게 해줌.
그리고 선택되면 스토리지 액세스 프레임워크에 의해 그 파일이 생성되고 향후 처리를 위해 그 파일의 URI가 애플리케이션에 반환됨.
openFileDescriptor(Uri, String) + CATEFOTY_OPENABLE 옵션
cf)파일 타입을 제한하여 파일을 선병하는 방법도 있음. MIME 타입의 파일들로 인텐트 객체를 구성하면 됨.
예) 이미지 파일들만 선택 => intent.setType("image/*");
JPEG 이미지만 선택 => intent.setType("image/jpeg");
오디오 파일들만 선택 => intent.setType("audio/*");
MP4 파일들만 선택 => intent.setType("audio/mp4");
다양한 MIME 타입 정보는 다음을 참조 : https://developer.mozilla.org/ko/docs/Web/HTTP/Basics_of_HTTP/MIME_types
- 인텐트 결과 처리
인텐트를 시작시켰던 액티비티의 onActivityResult() 메서드를 호출함.
이 메서드에서는 요청 코드(인텐트 론칭 시에 애플리케이션에서 전달했던 것)와 결과 코드(해당 인텐트가 성공적으로 처리되었는지의 여부를 나타냄) 및 결과 데이터 객체(선택된 파일의 Uri를 포함)를 인자로 받음.
- 파일의 내용읽기
※파일 타입에 따라 달라짐.
○ 텍스트 파일의 경우 :
InputStream 객체를 사용함.
○ 이미지 및 오디오 파일의 경우 :
이미지 파일의 경우 URI 객체로부터 FD(파일 디스크립터)를 추출하여 Bitmap객체로 지정할 수 있음. 그리고 그 이미지를 BitmapFactory 인스턴스로 디코딩함.
파일 디스크립터(openFileDescriptor(uri, "r");)를 'r'모드로 염.
- 파일에 내용 쓰기
읽기에서 Inputstream 객체를 사용하였다면, 쓰기에서는 OutputStream 객체를 사용.
- 파일 삭제하기
파일 삭제 여부는 문서 제공자의 파일 삭제 지원 여부에 달렸음.
- 파일의 지속적인 액세스 얻기
스토리지 액세스 프레임워크를 통해 애플리케이션이 파일의 액세스를 얻으면 그 액세스는 애플리케이션이 실행 중인 안드로이드 장치가 다시 시작될 때까지
유효함.
특정 파일의 지속적인 액세스는 그 Uri에 필요한 퍼미션을 요청하여 얻을 수 있음.
예) FLAG_GRANT_READ_URI_PERMISSION, FLAG_GRANT_WRITE_URI_PERMISSION + takePersistableUriPermission(fileuri, takeFlags);
cf)지속적인 퍼미션이 필요하지 않다면 콘텐트 리졸버의 releasePersistableUriPermission()메서드를 사용해서 해제
------------------------------------------------------------
[안드로이드 스토리지 액세스 프레임워크를 사용하여 클라우드 스토리지 활용하기]