[안드로이드/android] 외부 저장소(External Storage) PART1

Posted by 앱해피
2015. 6. 22. 12:53 안드로이드 이론

 

외부 저장소(External Storage) 사용하기

 

안드로이드 장치에서는 공유되는 "외부 저장소"에 파일을 저장할 수 있다. 외부 저장소는 SD 카드와 같이 1)제거될 수 있는 저장 장치 또는 2)제거될 수 없는 저장 장치로 구성된다.

외부 저장소에 저장되는 파일들은 어디서나 읽을 수 있고, 유저가 데이터도 변경할 수 있다.

 

[주의]

 

외부 저장소를 유저가 컴퓨터에 마운트 시키거나 또는 매체로부터 제거했을 때, 외부 저장소를 사용하지 못할 수도 있다. 또한 외부 저장소에 저장된 파일은 보안 기능은 갖추고 있지 않는다. 외부 저장소에 있는 파일은 모든 어플리케이션에서 접근할 수 있고, 유저는 그 파일을 삭제할 수도 있다.

 

외부 저장소에 접근하는 방법

 

외부 저장소의 데이터를 읽거나 쓰기 위해서는, 어플리케이션에서 READ_EXTERNAL_STORAGE 또는 WRITE_EXTERNAL_STORAGE 시스템 권한을 갖고 있어야 한다.

 

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

 

외부 저장소에 존재하는 파일에 대해 읽기 쓰기 모두 지원을 원할 때는, WRITE_EXTERNAL_STORAGE 권한만 추가하면 된다.

 

외부 저장소(External Storage) 이용 가능유무 확인하기

 

외부 저장소와 관련된 작업을 하기 전, 외부 저장소의 이용가능 여부를 확인하기 위해 getExternalStorageState()를 항상 호출해야 한다. 외부 저장소가 컴퓨터에 연결되어 있을 수도 있고, 스마트폰과 연결이 되지 않았을 수도 있고 그밖에 여러가지 상황속에 있을 수 있기 때문이다. 아래 코드는 외부 저장소의 이용가능 여부를 확인하는 코드다.


/* 외부 저장소가 현재 read와 write를 할 수 있는 상태인지 확인한다 */
public boolean isExternalStorageWritable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        return true;
    }
    return false;
}

 

/* 외부 저장소가 현재 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;
}

 

getExternalStorageState() 메소드는 확인하고자 원하는 다른 상태값들을 반환한다.

ex) 외부 저장소가 컴퓨터에 연결된 상태인지, 외부 저장소가 스마트폰에 연결된 상태인지 등등.

이 메소드를 이용해서 외부 저장소를 사용하고자 하는 어플리케이션에서 더 많은 정보를 알 수 있게 된다.

 

다른 어플리케이션과 공유할 수 있는 파일 저장하기

 

일반적으로, 유저가 어플리케이션을 사용하면서 생성된 파일들은 스마트폰의 "public" 위치에 저장되어야 하며, 이를 통해서 다른 앱이 파일에 접근할 수 있게 해야 한다. 이와 같은 작업을 하기 위해서는, Music/, Pictures/ 그리고 Ringstones/와 같은 공개된 디렉토리 중 하나를 사용해야 한다.

 

"public" 디렉토리를 얻기 위해서는, 파라미터로 DIRECTORY_MUSIC, DIRECTORY_PICTURES, DIRECTORY_RINGTONES 또는 다른 다른 타입과 같이 사용하기 원하는 디렉토리의 유형을 전달해야만 한다.

 

각각의 파일을 그와 매칭되는 적절한 매체 유형의 디렉토리에 저장함으로써, 안드로이드 시스템에 존재하는 파일들을 잘 분류할 수 있게 된다.

 

아래 코드에서는 pictures라는 디렉토리에 새로운 photo album과 관련된 디렉토리를 생성한다.

 

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;
}

 

감사합니다 ^_^