본문 바로가기

개발/Android

[Android] Q Scoped Storage - MediaStore로 화면 스크린샷 저장하기 - Android Q

2019.10.29

안드로이드 Q부터 Storage정책이 변경되었습니다.

 

우선 기존 Q 이전에서는 어떻게 적용되었는지, Q 이후에는 어떻게 적용되는지 살펴보겠습니다.

 

● Android Q 이전

개별 앱만 접근 가능

 

 

외부 저장소 권한이 있으면 누구나 접근이 가능

  - READ_EXTERNAL_STORAGE 

  - WRITE_EXTERNAL_STORAGE 

 

 

 

 

 

 

 

 

 

 

 

● Android Q 이후

샌드박스 저장공간

  - 개별 앱만 접근 가능

  - 읽고 쓰기 위한 별도의 권한 필요 없음

  - Context.getExternalFilesDir(...)

  - 앱 삭제 시 함께 삭제됨

  - 앨범 아트, 썸네일 등 다른 앱과 공유할 필요가 없는 미디어 파일은 샌드박스 공간을 활용

 

 

 

 

 

 

 

 

 

 

 

 

공용 저장공간

  - MediaStore.Audio

  - MediaStore.Video

  - MediaStore.Images

  - 별도 권한 없이 파일 생성 가능

  - 외부 저장소 권한으로 다른 앱이 생성한 파일 접근 가능

 

 

 

 

 

 

 

 

 

 

다운로드 저장공간

  - MediaStore.Downloads

  - 별도 권한 없이 파일 생성 가능

  - 시스템 파일 선택기를 통해서만 다른 앱이 생성한 파일 접근 가능

 

 

 

 

 

 

 

 

● Scoped mode

원활한 Migration을 위해 Scoped mode 적용 여부를 선택할 수 있는 플래그를 Manifest.xml파일에서 아래와 같이 제공하고 있습니다.

<application android:requestLegacyExternalStorage="true">

 

다음 Android 버전(Android 11 / R)에서는 Target SDK 버전과 관계없이 모든 앱에 Scoped mode를 적용될 예정입니다.

단, 개발 앱의 Scoped mode 여부는 앱 설치 시 정해지며, 이후 변경되지 않습니다.

 

그럼 이제 코드로 비교해보겠습니다. (다음 예제는 Button을 통해 화면 스크린샷을 찍는 Sample입니다.)

 

다음 코드는 Android Q 이전에서 이미지 파일을 저장하는 예제입니다.

 

 

다음 코드는 Android Q 이후에서 이미지 파일을 저장하는 예제입니다.

 

 

 

참고

https://developer.android.com/preview/privacy/scoped-storage#java

https://developer.android.com/preview/features?hl=ko#create-files-external-storage

https://codechacha.com/ko/android-q-scoped-storage/

https://codechacha.com/ko/android-mediastore-insert-media-files/

 

 

감사합니다.