LISTORY

안드로이드 File 관리. 내부저장소&외부저장소 본문

IT/안드로이드

안드로이드 File 관리. 내부저장소&외부저장소

LiStoryTeller 2017. 7. 8. 18:09



모든 안드로이드 기기에는 파일을 저장할 수 있는 저장소가 있습니다.


저장소는 외부와 내부로 나뉘는데, 일반적으로 내부 저장소는 안드로이드 기기 자체에서 제공하는 비휘발성 내부 메모리를 말하고 외부 저장소는 마이크로 SD카드와 같은 이동식 저장소를 말합니다.


앱을 안드로이드 기기에 설치할 경우 기본적으로 내부 저장소에 저장이됩니다.


하지만 앱이 지나치게 크거나 하는 이유 등으로 외부 저장소에 설치를 원할 경우, 따로 설정하여 외부 저장소에도 어플리케이션을 설치할 수도 있습니다.



내부저장소와 외부저장소의 특징은 다음과 같습니다.





외부저장소에 파일을 저장하거나 읽고 싶을 경우에는 권한이 필요하여 manifest 파일에 따로 권한을 부여해줘야 하지만 내부저장소에 파일을 저장하거나 파일을 접근하는 것에는 특별한 권한을 필요로 하지 않습니다.


외부저장소 접근 권한을 얻기 위해서는 manifest에 다음과 같은 선언을 해줘야 합니다.


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

권한을 얻으면 외부저장소에 접근할 수 있는데, 접근을 위해서는 몇가지 과정이 필요합니다.


일단 외부저장소는 제거되었거나 사용자가 PC에 마운트했을 경우 등 사용하지 못할 경우가 종종 존재합니다.


때문에 getExternalStorageState() 함수를 호출하여 현재 외부 저장소가 사용가능한 상태가 맞는지 확인해야 합니다.


반환된 상태가 MEDIA_MOUNTED와 동일하다면 파일을 읽거나 쓸 수 있습니다.


public boolean isExternalStorageWritable() {
   
String state = Environment.getExternalStorageState();
   
if (Environment.MEDIA_MOUNTED.equals(state)) {
       
return true;
   
}
   
return false;
}

/* Checks if external storage is available to at least read */
public boolean isExternalStorageReadable() {
   
String state = Environment.getExternalStorageState();
   
if (Environment.MEDIA_MOUNTED.equals(state) ||
       
Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
       
return true;
   
}
   
return false;
}


외부저장소에 저장할 수 있는 파일의 종류는 두개로 분류됩니다.


공용 파일
다른 앱 및 사용자가 자유롭게 사용할 수 있는 파일입니다. 사용자가 앱을 제거해도 이러한 파일을 사용자가 계속 사용할 수 있도록 유지해야 합니다.

예를 들어 앱으로 캡처된 사진 또는 기타 다운로드된 파일이 이에 해당합니다.

전용 파일
정당하게 앱에 속하고 사용자가 앱을 제거 하면 삭제되어야 하는 파일입니다. 이러한 파일은 외부 저장소에 저장된 파일이기 때문에 엄밀히 말해 사용자 및 다른 앱의 액세스가 가능하긴 하지만, 앱 외부에서 사용자에게 실제로 가치를 제공하지는 않습니다. 사용자가 앱을 제거하면 시스템은 앱의 외부 전용 디렉터리 내 모든 파일을 삭제합니다.

예를 들어 앱에서 다운로드한 추가 리소스 또는 임시 미디어 파일이 이에 해당합니다.


공용 파일을 저장하고 싶을 때엔 getExternalStoragePublicDirectory() 메서드를 사용하여 외부 저장소의 적절한 디렉토리의 File을 가져올 수 있습니다.


이 메서드는 DIRECTORY_MUSIC, DIRECTORY_PICTURES와 같이 저장하고자 하는 파일의 유형을 지정하는 인수를 받습니다.


public File getAlbumStorageDir(String albumName) {
   
// Get the directory for the user's public pictures directory.
   
File file = new File(Environment.getExternalStoragePublicDirectory(
           
Environment.DIRECTORY_PICTURES), albumName);
   
if (!file.mkdirs()) {
       
Log.e(LOG_TAG, "Directory not created");
   
}
   
return file;
}


개인 파일을 저장하고 싶을 경우에는 getExternalFilesDir()에 원하는 디렉터리 유형을 전달하여 적절한 디렉터리를 얻을 수 있습니다.


getExternalFilesDir()을 통해 저장한 파일들은 getExternalStoragePublicDirectory() 메소드를 통해 저장한 파일들과 달리, 어플을 삭제할 경우 함께 삭제됩니다.


public File getAlbumStorageDir(Context context, String albumName) {
   
// Get the directory for the app's private pictures directory.
   
File file = new File(context.getExternalFilesDir(
           
Environment.DIRECTORY_PICTURES), albumName);
   
if (!file.mkdirs()) {
       
Log.e(LOG_TAG, "Directory not created");
   
}
   
return file;
}

앱의 외부저장소의 root 디렉터리를 가져오고 싶은 경우에는 getExternalFilesDir()에 null을 인자로 넘겨주면 됩니다.


getExternalStoragePublicDirectory(), 또는 getExternalFilesDir()을 사용할 때에 DIRECTORY_PICTURES와 같이 API 상수로 제공되는 디렉터리 이름을 사용해야 하는데, 이는 시스템이 파일을 적절하게 처리할 수 있도록 도와줍니다.




내부저장소에 존재하는 파일에 접근하거나 파일을 저장하기 위해선 내부저장소의 경로를 얻는 과정이 필요합니다.


경로를 얻는 메소드는 다음과 같습니다.


getFileDir()
앱에 대한 내부 디렉터리를 나타내는 File을 반환합니다.
getCacheDir()
앱의 임시 캐시 파일에 대한 내부 디렉터리를 나타내는 File을 반환합니다. 더 이상 필요하지 않은 파일은 모두 삭제하고 언제든지 사용할 수 있는 메모리 크기에 합리적인 크기 제한(예. 1MB)을 구현해야 합니다. 저장 공간이 부족해지기 시작하면 경고 없이 시스템이 캐시 파일을 삭제할 수도 있습니다.


File file = new File(context.getFilesDir(), filename);


Comments