11월 기준 마켓에 등록 되는 안드로이드 앱들은 TargetAPI 30 이 되어야한다.

안드로이드 11로 변경하면서 그중 가장 큰 이슈중에 하나가 범위 지정 저장소 적용(Scoped Storage)인데

다음과 같다.

사용자에게 더 많은 파일 제어 권한을 제공하고 파일이 복잡해지는 것을 제한하기 위해, Android 10(API 수준 29) 이상을 타겟팅하는 앱은 기본적으로 외부 저장소로 범위가 지정된 액세스 권한 또는 범위 지정 저장소가 부여됩니다. 이러한 앱은 외부 저장소의 앱별 디렉터리와 앱에서 만든 특정 유형의 미디어에만 액세스할 수 있습니다.

원래는 29부터 범위 지정 저장소가 적용이 되어 있었다. 하지만 requestLagacyExternalStorage 속성을 true 값으로 하면 범위 지정 저장소와 관련된 변경사항들을 일시적으로 선택 해제 할수 있다.

안드로이드 11로 타겟팅하도록 앱을 설정하면 이제 requestLagcyExternalStorage 속성을 무시하기 때문에 거기에 맞게 저장소 대응을 해줘야 한다.

먼저 11로 타겟팅 하면서 WRITE_EXTERNAL_STORAGE 권한 및 WRITE_MEDIA_STORAGE 독점 권한은 더 이상 추가 액세스를 제공하지 않는다.

<uses-permission
        android:name="android.permission.WRITE_EXTERNAL_STORAGE"
        android:maxSdkVersion="28" />

maxSdkVersion을 28로 맞춰줌으로써 Q버전 미만과 이상을 구분하는게 더 좋다.


공용 저장소

위 그림을 보면 개별 앱 공간은 이전과 동일하다. 하지만 외부저장소의 개별 앱 공간이 샌드박스 형식으로 격리된다. 외부저장소의 공용공간이 사진 및 동영상, 음악, 다운로드 구조로 분리 되고 이 안에서 앱 패키지 별로 또 구분되어 저장하게 되었다. (기존의 자유롭게 파일을 저장할 수 있던 public files 공용 공간이 앞에 말했던 4개의 조직화된 수집공간으로 나누어 관리 되는거라 보면 된다)

외부저장소 공용공간이 분리되고 패키지 별로 또 구분 됨에 따라 관리가 쉬워지고 저장공간 차지 확인등 여러가지 장점이 생긴다.

Timber.e("--외부 저장소--")
//경로 storage/emulated/0
Timber.d("getExternalStorageDirectory1 : ${Environment.getExternalStorageDirectory()}")
//경로 storage/emulated/0/Pictures
Timber.d(
    "getExternalStorageDirectory2 : ${Environment.getExternalStoragePublicDirectory(
        Environment.DIRECTORY_PICTURES
    )}"
)

위 코드들이 targetSdkVersion을 29 이상으로 올리면 아래와 같이 Deprecated 된다.