일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Kotlin
- Android 13
- mvvm
- 인앱결제
- rx
- google play
- Koin
- Android
- junit
- Observable
- liveData
- android13
- Reactive
- MotionLayout
- 테스트 자동화
- MediaPlayer
- databinding
- SWIFTUI
- Animation
- node.js
- MediaSession
- mysql
- RxKotlin
- node
- 동영상
- PagingLib
- list
- paging
- GCP
- SwiftUI Tutorial
- Today
- Total
봄날은 갔다. 이제 그 정신으로 공부하자
Android Q의 새로운 저장소 정책 본문
깜빡하고 있었다. Android Q(10)의 보안 강화 Scoped Storage
Android Q(10) 이전의 저장소 접근 권한은 사용자에게 EXTERNAL_STORAGE 권한만 얻으면 되었습니다.
권한만 얻으면 앱 및 단말의 파일 저장소에 접근하여 데이터를 읽고 쓸수 있었습니다.
하지만 Q에서 외부 저장소를 다루는 새로운 정책 Scoped Storage가 소개되었습니다
Scoped Storage는 기본적으로 앱이 디바이스의 모든 파일을 탐색하지 못한다는 전제가 깔려있습니다.
Q부터는 앱이 자유롭게 접근할 수 있는 것은 자신의 개인 앱 데이터 뿐으로
공용 미디어 파일들은 READ_EXTERNAL_STORAGE 권한이 있어야 접근이 가능하고,
그 외의 파일들은 사용자에게 접근 권한을 개별로 받아야 합니다.
Q의 Scoped Storage 정책
Scoped Storage는 아래와 같이 3개로 나누어서 설명할 수 있습니다.
- 앱 데이터 폴더(App specific directory)
- 미디어 파일들(MediaStore)
- 공용 파일들(Storage Access Framework)
앱 데이터 폴더(App specific directory, Sandbox)
앱 데이터 폴더는 이전과 동일합니다.
별도의 권한이 필요없고, 다른 앱들은 자신의 데이터 폴더에 접근할 수 없으며 앱이 삭제되면 데이터 폴더도 함께 삭제됩니다.
미디어 파일들(MediaStore)
공용 폴더 안에 있는 미디어 파일들은 MediaStore를 통해 읽을 수 있습니다.
예를 들어, 사진 또는 동영상 파일을 찾고 싶으면 공용 폴더 하위의 파일들을 탐색하는 방식이 아니라 MediaStore에 쿼리를 하여 Uri 객체를 얻어 사용해야 합니다.
다음과 같은 콜렉션들에 저장된 파일들은 MediaStore를 통해 읽을 수 있습니다.
MediaStore를 통해 파일을 읽으려면 READ_EXTERNAL_STORAGE 권한이 필요하지만 파일을 생성하는 것은 권한이 없어도 됩니다.
공용 파일들(Downloads 폴더, Storage Access Framework)
공용 미디어 파일들을 제외하고, Downloads 폴더 등을 접근할 때는 SAF(Storage Access Framework)를 이용해야 합니다.
SAF는 폴더들을 관리하는 DocumentsProvider와, 사용자가 앱에 파일 접근을 허용할 수 있도록 UI를 제공하는 DocumentsUI로 이루어져 있습니다.
Q에서 앱들은 공용 파일들에 접근할 때 DocumentsUI의 액티비티를 띄워 사용자에게 파일에 대한 접근 권한을 부여받은 후에, 그 파일을 읽거나 쓰도록 해야 합니다.
사용자가 파일 또는 폴더를 선택하기 때문에 사용자는 더 좁은 범위로 권한을 부여할 수 있게 되었습니다.
앱 업데이트
Android Q가 설치된 기기에서는 저장 장치에 접근하기 위해 Scoped Storage 정책에 따라 앱을 수정해야 하지만
앱의 Target SDK 설정에 따라 정책을 임시로 회피 할 수 있습니다.
- Android Target SDK를 28이하로 설정
별도의 처리 없이 Scoped Storage 정책 회피 가능
- Android Target SDK를 29이상으로 설정
manifest.xml 파일의 <application에 requestLegacyExternalStorage 속성을 true로 설정하여 회피
android:requestLegacyExternalStorage="true"
* 단 android 11(R)을 타겟팅하는 앱은 Scoped Storage 정책이 강제 적용됩니다.
정리
android Q에 적용된 보안 강화 Scoped Storage는 회피가 가능하도록 유예 기간을 두었지만 말 그대로 유예 기간이므로
앱이 접근하는 저장 장치에 따른 접근 처리가 필요합니다.
다음 글에서는 andrid R(11)에 맞게 미디어 저장소에 접근하는 방법을 샘플 코드를 통해 설명하도록 하겠습니다.
https://als2019.tistory.com/54
'android Tip' 카테고리의 다른 글
네트워크 비동기 통신에서 중복 요청 방지 (0) | 2021.03.05 |
---|---|
android R Scoped Storage 2편 (미디어 저장소에서 이미지를 읽어오자) (0) | 2021.02.11 |
간단히 만들어보는 시간차를 통한 중복 클릭 방지 class (0) | 2021.02.03 |
앱 재실행 (App Restart) (0) | 2021.01.22 |
PopupWindow로 Spinner 대체하기 (0) | 2021.01.18 |