[Android]안드로이드 Storage

한 강·2022년 3월 2일
0

안드로이드

목록 보기
5/6

내부 저장소(Internal Storage)


  • 모든 스마트폰에서 제공된다.
  • 앱을 설치하게 되면, 해당 앱을 위한 저장공간이 할당된다
  • 샌드박스 형식으로 되어있어, 해당 앱만 접근 가능하며 외부에선 볼 수 없다.
  • 앱이 삭제되면 같이 삭제 된다.
  • 앱별로 내부 저장소에 저장 할 수 있는 데이터의 한계치가 존재해서 큰 용량의 데이터를 저장해야 한다면, 외부 저장소 사용이 필요하다

외부 저장소(External Storage)


  • 대부분의 안드로이드 기기는 내부저장소 뿐만 아니라, 외부 저장소도 갖고 있다.
  • SD 카드와 이동식 저장 장치로 제공되기도 하며, 내부 외부, 파티션을 나눠 저장공간을 제공하는 경우도 있다.
  • 모든 기기에서 제공되는 것이 아니라, 확인하는 코드가 필요하다.

외부 / 내부 저장소가 나뉘어진 이유


  • 더 큰 메모리와 디스크 공간이 필요
  • 다른 앱에서 현재 앱의 데이터를 액세스 하기위해
  • 앱이 지워져도 데이터를 저장하기 위해

내부 저장소 사용하기


  • 따로 권한이 필요하지 않다.
  • Context.getFilesDir() 또는 getCacheDir() 로 접근가능
  • Context.getFilesDir() 경로는 /data/data/패키지명 이며
  • getCacheDir() 경로는 /data/data/패키지명/cache 가된다.

외부 저장소 사용하기


Legacy Storage

// SDK 28 이하에는 두가지 권한이 필요
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

// SDK 29 이상에는 READ 권한만 필요
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  • 공용 공간
    • 파일에 저장하여 타 앱 간 데이터를 공유 할 수도 있다
    • 개별 앱 공간에 저장하여 데이터는 공유하지 않으면서도 앱이 삭제되어도 데이터를 보존할 수 있는 전략을 세울 수 있었다
  • 개별 앱 공간 특징
    • 앱이 삭제 되면 같이 지워진다.
    • 위험 권한이 필요하다
    • 내부 저장소에 저장 할 수 없는 대용량 데이터를 저장 가능하다
    • 다른 앱에서는 접근 할 수 없다.
  • 개별 앱 공간 접근 방법
    • Context.getExternalFilesDir(null) 를 통해 접근 할 수 있다.
    • /sdcard/Android/data/ 패키지명 경로에 파일이 작성된다.
  • 공용 공간 특징
    • 앱이 삭제 되어도 영구적으로 남는다
    • 위험 권한 필요
    • 내부 저장소에 저장 할 수 없는 대용량 데이터를 저장 가능
    • 다른 앱에서 해당 데이터로 자유롭게 접근 가능
  • 공용 공간 접근 방법
    • Environment.getExternalStorageDirectory().path 를 통해 접근 가능
    • Environment.DIRECTORY_MUSIC 음악 파일 저장
    • Environment.DIRECTORY_PODCASTS 팟캐스트 파일 저장
    • Environment.DIRECTORY_DOWNLOADS 다운로드한 파일 저장
    • Environment.DIRECTORY_ALARMS 알람으로 사용할 오디오 저장
    • Environment.DIRECTORY_NOTIFICATIONS 알림음 오디오 저장
    • Environment.DIRECTORY_PICTURES 그림 파일 저장
    • Environment.DIRECTORY_MOVIES 영상 파일 저장
    • Environment.DIRECTORY_DCIM 사진 파일 저장
    • /sdcard경로에 파일이 작성된다.

Scoped Storage

  • 개별 앱 공간 특징
    • 별도의 권한 필요 없음 (외부 저장소 관련 권한이 필요 없음)
    • 앱이 삭제되면 데이터도 같이 지워짐
    • 대용량 데이터 저장 가능
  • 개별 앱 공간 접근 방법
    • Q 이후의 경우, 개별 앱 공간을 사용하는데에 따로 권한 요청이 필요하지 않다.
    • Context.getExternalFilesDir() 를 통해 앱 공간에만 접근 할 수 있다.
  • 공용 공간 특징
    • 내 데이터에만 접근 할 시 별도의 권한 필요 없음
    • 다른 앱이 작성한 데이터를 읽고자 할 때는 권한 필요
    • MediaStore.api 를 통해 접근
    • 앱이 삭제 되어도 데이터는 영구적으로 남는다
    • 대용량의 데이터 저장 가능
  • 공용 공간 접근 방법
    • 안드로이드 버전 10부터는 MediaStore API 사용을 권장 한다.

    • MediaStore 은 사용자가 가지고 있는 파일들을 다른 앱에서도 사용 할 수 있도록 설계된 API

    • Media 디렉토리 안에서 자신의 앱에 해당하는 곳은 권한 없이 사용 가능

    • 이번 버전에서는 WRITE_EXTERNAL_STORAGE 만 있으면 다른 앱의 공용 파일에도 접근이 가능 했지만, 보안상의 이슈로 10부터는 이를 막아 놨다.

      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
          val contentValues = ContentValues()
          contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, "파일 명")
          contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "text/plain")
          contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, "Download")
          val resolver = contentResolver
          val uri: Uri? =
              resolver.insert(MediaStore.Files.getContentUri("external"), contentValues)
          try {
              val wantToWriteFile = "파일명"
              resolver.openOutputStream(uri)!!.write(wantToWriteFile.toByteArray())
          } catch (e: Exception) {
              e.printStackTrace()
          }
      }
profile
안드로이드 개발자 & Flutter 개발자

0개의 댓글