Calrip 개발 블로그

Android 11 범위 지정 저장소 업데이트 대응 본문

Android

Android 11 범위 지정 저장소 업데이트 대응

칼립 2020. 5. 11. 13:28

1. 시작

Android 11에서는 외부 저장소의 앱 및 사용자 데이터를 보다 안전하게 보호하기 위하여 범위 지정 저장소가 도입됩니다.

 

Android 10(API 수준 29)을 타겟팅하는 앱에서는 requestLegacyExternalStorag 속성을 요청하여 범위 지정 저장소 와 관련된 변경사항을 선택 해제하여 사용할 수 있었습니다. 이후 Android 11을 타겟팅하도록 앱을 업데이트하면 requestLegacyExternalStorag 속성을 무시하여 앱 내부에서 외부 저장소 접근이 승인되지 않습니다.

 

 

2. 데이터 이전

기존 앱이 requestLegacyExternalStorag 레거시 저장소 모델을 사용하고 이전에 Android 10 이하(API 수준 29) 이하를 타겟팅 했다면 범위 지정 저장소 모델이 사용되었을 때 앱이 액세스 할 수 없는 디렉터리에 데이터를 저장할 수 있습니다. Android 11을 타겟팅하기 전에 먼저 범위 지정 저장소와 호환되는 디렉터리로 데이터를 이전합니다.

 

이전할 데이터가 있다면 사용자가 Android 11을 타겟팅하는 앱의 새 버전으로 업그레이드할 때 레거시 저장소 모델을 보존할 수 있습니다. 이렇게 하면 사용자가 앱에서 이전에 데이터를 저장했던 디렉터리에 저장된 앱 데이터에 액세스 할 수 있는 권한을 유지할 수 있습니다. 업그레이드에 레거시 저장소 모델을 사용하려면 앱의 Manifest에서 preserveLegacyExternalStorage 속성을 true로 설정합니다.

 

 

3. 모든 파일 액세스

일부 앱에는 파일 관리나 백업 및 복원 작업과 같이 광범위한 파일 액세스가 필요한 사례가 있습니다. 이러한 앱은 다음을 실행하여 모든 파일 엑세스 권한을 얻을 수 있습니다.

 

   1. Manifest에서 MANAGE_EXTERNAL_STORAGE 권한을 선언합니다.

   2. Intent 작업을 사용하여 ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION 앱에 모든 파일 관리 액세스 허용

   옵션을 사용 설정할 수 있는 시스템 설정 페이지로 사용자를 안내합니다.

 

 

위의 모든 파일 액세스 허용 권한은 다음 권한을 부여합니다.

 

  • 공유 저장공간 내의 모든 파일에 대한 읽기/쓰기 액세스
  • MediaStore.Files 테이블의 콘텐츠에 관한 액세스

파일 액세스 허용 권한을 허용한 앱은 MediaStore API 또는 원시 파일 경로를 사용하여 이러한 파일에 엑세스할 수 있습니다. 앱이 저장소 액세스 프레임워크를 사용한다면 이 앱을 사용하여 모든 파일 액세스 권한이 제공하는 추가 파일 및 디렉터리에 액세스 할 수 없습니다.

 

 

4. 권한을 사용하지 않고 파일저장 

MANAGE_EXTERNAL_STORAGE 권한을 사용하지 않고 이미지 및 파일을 안드로이드 내부 저장소에 쓰려면, 공유 공간에 저장하는 방식이 아닌 애플리케이션마다 할당되어있는 저장 영역에 파일을 쓰기 하면 됩니다.

 

기존의 내부 공유 공간에 저장하기위해 가져오는 파일 경로 소스 코드
File file = new File(Environment.getExternalStorageDirectory() + "/Test/");

위의 메서드를 사용하여 내부 경로를 가져와서 파일을 쓰기를 한다면, Android 10 이상의 레거시 저장소 모델을 사용하지 않는 앱에서는 "접근 승인이 되지 않습니다" 라는 시스템 토스트 메시지가 표시되게 됩니다.

 

그래서 공유 공간을 사용하지않고, 애플리케이션마다 할당되어있는 저장 영역에 파일 쓰기로 소스를 변경하여서 사용하여야 합니다.

 

애플리케이션 고유 공간에 저장하기위해 가져오는 파일 경로 소스 코드
 File file = new File(getExternalFilesDir(Environment.DIRECTORY_PICTURES), imageFileName);

위의 방법대로 애를리케이션 마다 할당되어있는 저장 영역에 파일 쓰기를 할 경우, 다른 앱에서는 자유롭게 접근할 수 없으며 설치된 애플리케이션이 삭제될 때 해당 저장소에 있는 모든 파일이 삭제가 됩니다. 

 

애플리케이션이 삭제되어도 생성한 파일이 삭제가 되지 않도록 하려면, 애플리케이션 저장 영역이 아닌 MANAGE_EXTERNAL_STORAGE 권한을 획득한 후 공유되는 저장공간에 파일을 저장시켜야 합니다.

 

 

5. 마무리

MANAGE_EXTERNAL_STORAGE 권한을 사용하면 앱이 공유 저장공간에 있는 정보에 액세스할 수 있습니다. 향후 업데이트를 진행할 때 Google Play 콘솔에서 이 권한이 필요한 앱에 관한 가이드라인을 제공하여서 사용하면 됩니다.

 

MANAGE_EXTERNAL_STORAGE 권한을 사용하지않고 애플리케이션 내부적으로 임시로 사용하는 사진, 동영상, 파일 등 데이터는 애플리케이션 고유 저장공간 영역에 저장한 후 사용하면 됩니다.