[안드로이드] 저장소 사용하기 - 1. Legacy Storage

2021. 2. 23. 21:38바삭바삭 IT/안드로이드

안드로이드에서는 저장소를 내부저장소와 외부저장소로 나눠서 관리하고 있습니다. 안드로이드 버전10(Q)을 기준으로 저장소의 모양이 바뀌었는데요. Q버전 이전의 저장소, Legacy Storage라는 형태가 Q버전 이후로는 Scoped Storage라는 형태로 변경되었습니다. 두개의 차이는 구조인데 그부분은 다음글에서 설명하고, 이번 글에서는 Q이전 형태인 Legacy Storage에 대해서 설명하려고 합니다.

내부저장소와 외부저장소?

내부저장소 | 내부저장소는 모든 스마트폰에서 제공됩니다. 앱을 설치하게 되면 해당 앱을 위한 저장공간이 할당됩니다. 이 공간은 샌드박스 형식으로 되어있어서 해당 앱만 접근하고 외부에서는 볼 수 없는 형태입니다. 앱이 삭제되면 이 공간 또한 같이 제거됩니다.

 

외부저장소 | 대부분 안드로이드 기기는 내부저장소 뿐만 아니라 외부저장소도 갖고있습니다. SD카드와 같이 이동식 저장장치로 제공되기도 하고 내부, 외부 파티션을 나눠 저장공간을 제공하는 경우도 있습니다. 하지만 모든 기기에서 제공되는것이 아니므로 이를 확인하는 코드를 작성해줘야 합니다.

 

내부저장소가 이미 있는데 왜 외부저장소가 또 있는걸까요? 다음과 같은 필요에 의해 제공되고 있습니다.

1. 더 큰 메모리와 디스크공간의 필요

2. 다른앱에서 현재 앱의 데이터를 액세스하기 위해

3. 앱이 지워져도 데이터를 기기에 저장해놓기 위해 (예를들면 앱에서 다운받은 사진들이 될수 있죠.)


내부저장소 사용하기

내부저장소는 따로 권한이 필요하지 않습니다. Context.getFilesDir()또는 getCacheDir()로 접근해서 사용할 수 있습니다. 경로는 /data/data/com.example.appname 이고 캐시의경우 /data/data/com.example.appname/cache가 됩니다.

 

외부저장소 사용하기

안드로이드에서 제공하는 외부저장소에 접근하기 위한 API들입니다. 참고로 안드로이드 버전10(Q)이전까지 사용해온 API이므로 참고만 하시기 바랍니다!

  • Environment.getExternalStorageDirectory() | 기본 외부저장소(SD카드)의 최상위 경로를 리턴합니다. ex) /storage/emulated/0 *이 경로는 기기마다 다를 수 있습니다.
  • Context.getExternalFilesDirs(Strint type) / Context.getExternalCacheDirs() / Context.getExternalMediaDirs() | 앱 내부에서만 사용될 private 디렉토리의 절대경로를 리턴합니다. 앱이 삭제되면 같이 사라집니다. ex) /storage/emulated/0/Android/data/com.example.appname/files
    • Context.getExternalFilesDir(String type)는 아래의 type들을 사용할 수 있어요. 파라미터가 null 이라면 루트 디렉터리를 반환합니다. 아니면 아래 주어진 타입의 서브디렉터리를 반환합니다.
      • Environment.DIRECTORY_MUSIC 음악 파일 저장
      • Environment.DIRECTORY_PODCASTS 팟캐스트 파일 저장
      • Environment.DIRECTORY_DOWNLOADS 다운로드한 파일 저장
      • Environment.DIRECTORY_ALARMS 알람으로 사용할 오디오 저장
      • Environment.DIRECTORY_NOTIFICATIONS 알림음 오디오 저장
      • Environment.DIRECTORY_PICTURES 그림 파일 저장
      • Environment.DIRECTORY_MOVIES 영상 파일 저장
      • Environment.DIRECTORY_DCIM 사진 파일 저장 
      • 더 다양한 타입 보기 | https://developer.android.com/reference/android/os/Environment
    • Context.getExternalCacheDir() | 안드로이드가 자동으로 캐시파일을 지우진 않습니다. 앱이 스스로 이 공간을 관리해야 합니다.
  • Environment.getExternalStoragePublicDirectory(String type) | 공유가능한 디렉토리 리턴합니다. 앱이 삭제되도 파일은 유지됩니다. 이곳에 파일을 저장하려면 WRITE_EXTERNAL_STROAGE 권한을 요청해야 합니다. type에는 위에 나열된 타입들을 똑같이 사용할 수 있습니다. 하지만 null은 넣을 수 없습니다. ex) /storage/emulated/0/mounted
  • MediaStore을 사용합니다. (사용방법은 다음 포스트에서 자세히 다룹니다.)

저장소 사용방법 요약

 파일위치 권한 접근 앱 삭제시 제거
내부저장소 개별 앱 공간 필요 없음 Context.getFilesDir() Y
외부저장소 개별 앱 공간 필요 없음 Context.getExternalFilesDir() Y
공용공간 WRITE_EXTERNAL_STORAGE, READ_EXTERNAL_STORAGE Environment.getExternalStoragePublicDirectory() 또는 MediaStore N

 

다음 포스트에서는 Q버전 이후부터 적용되는 Scoped Storage와 MediaStore사용방법을 다룹니다.

kimdabang.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%A0%80%EC%9E%A5%EC%86%8C-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-2-Scoped-Storage

 

[안드로이드] 저장소 사용하기 - 2. Scoped Storage

안드로이드 버전10 이상부터는 Scoped Storage를 사용합니다. 이전 버전이였던 Legacy Storage와 어떤차이가 있는걸까요? 지난 포스트에서도 말했듯이 안드로이드의 저장소는 크게 내부저장소와 외부저

kimdabang.tistory.com


출처 

simsimjae.tistory.com/267

 

외장메모리공간

안드로이드의 외장 공간이란? public static File getExternalStorageDirectory() 이 함수는 외장 메모리 디렉토리를 리턴한다. 다른 컴퓨터에 의해서 외장 메모리가 연결되었거나, 디바이스로부터 외장 메모

simsimjae.tistory.com

 

반응형