건우의 개발 일기

[안드로이드, 삽질] Android 10, Scoped Storage Issue 본문

이슈

[안드로이드, 삽질] Android 10, Scoped Storage Issue

거누팍 2020. 2. 17. 00:19

😑 오늘의 삽질

 

🤷‍♀️ 이게 뭐지?

 

 

2월 4일 심상치 않은 메시지 하나가 날아왔습니다.

권한이 다 허용되어 있는데 Permission denied 가 뜬다는 것이었습니다 (?)

당시에는 별 큰 이슈는 아니라고 생각했습니다. 😭

 

🤬 아니 ㅡㅡ 이게 뭐지??

때마침 잠시 쉬는 동안 사이드 프로젝트를 하나 해보고 있는중이였는데 저장공간에서 Permission denied 가 뜨기 시작한 것이었습니다.

제 사이드 프로젝트 특성상 저장 공간을 사용하지 못하면 단 하나의 작업도 진행할 수 없는 상황이었습니다.

아니 분명 어제까진 됐는데;; 

( 구글링 → 퍼미션 확인하세요 → 돼있음 → 그럼 이 방법으로 확인하셈 → 돼있음 → ;; )

결국 그날 작업한 코드가 문제인 건가 싶어 눈물을 머금고 Discard all changes를 했습니다.

( Discard → 안됨 → ?? )

( 퍼미션 라이브러리 의존 삭제, 직접 퍼미션 구현 → 안됨 → ㅡㅡ )

아니 어제까진 됐다니깐? 하루 사이에 뭔 일이 일어난 거야

 

😴 삽질 결과

알아보니 Android 10부터 Scoped Storage를 사용하여 특별히 다른 처리를 해주지 않는 한 내장 메모리의 전체 공간에 직접 접근이 불가능하답니다.

근데. 테스트 용 폰이 제가 자는 동안 Android 9에서 Android 10으로 업데이트를 했었네요....;;

 

 

😄 Android Scoped Storage

 

Android 10을 Target API로 설정한 앱이 Android 10 이상의 단말에 설치되는 경우, 외부 저장소에 대해 Scoped storage 모드로 동작하게 됩니다.

 

🤔 Scoped Storage 란?

개별 앱 공간이 샌드박스 형식으로 격리되어 다른 앱의 파일에 직접 접근할 수 없게 하는 방식을 말합니다.

 

기존 내장 메모리, Scoped Storage

 

Scoped Storage를 사용하게 되면 앱을 삭제하였을 때 해당 앱에서 다운로드하였던 파일도 함께 삭제되게 됩니다.

또한 다른 앱의 폴더를 공용으로 사용할 수 없고 접근할 수도 없습니다.

 

😎 Scoped Storage에 대응하기

Environment.getExternalStorageDirectory()가 현재 deprecated 되어있습니다.

Scoped Storage를 사용하고 싶다면 getExternalFilesDir(), getExternalCacheDir(), getExternalMediaDir()중 하나를 Context와 함께 사용하면 됩니다.

만약 Scoped Storage를 사용하지 않고 기존의 Public 폴더를 당분간 계속 사용하고 싶다 하시면

android:requestLegacyExternalStorage="true"

위의 플래그를 Manifest에 추가시켜주면 됩니다.

하지만 구글에서 내년까지 모든 앱에 Scoped Storage를 적용한다고 밝혔기 때문에 최대한 빠르게 이에 대응해야 할 것입니다.

저는 일단 플래그를 추가하여 Scoped Mode 활성화를 해제하였지만 당분간 Scoped Mode에 대응할 계획입니다.

 

참고자료

 

이제는 Android Scoped Storage를 준비해야 할 때

Android 10에서 외부저장소에 대해 Scoped Storage Mode가 소개되었습니다. 이에 영향을 받는 애플리케이션은 2020년 상반기까지는 Scoped mode에 대한 준비가 되어있어야 합니다.

medium.com

쌩큐 😉