Blessing Venus

4.4(킷캣) 이상에서 외장메모리(SDCard) 쓰기(Write) 이슈 및 해결방안 본문

Tip&Tech/Android

4.4(킷캣) 이상에서 외장메모리(SDCard) 쓰기(Write) 이슈 및 해결방안

Blessing Venus 2017. 11. 9. 11:13


안드로이드 4.4 이후 SDCard Write 이슈 및 해결책


외장 SDCard(외장메모리) 사용시 안드로이드 4.4(킷캣) 이전에는 제약 없이 폴더 생성과 파일 생성이 자유로웠으나 4.4 킷캣부터는 이것을 허용하지 않게 되었습니다.

안드로이드 4.4(킷캣)부터는 자신의 package-specific 공간에만 자유롭게 사용이 가능하다고 합니다.

이 공간에 파일을 쓰거나 폴더를 생성할때는 해당 경로에 접근하기 위해 4.4부터 제공하는 getExternalFilesDirs(String type)메서드를 통해서 접근해야 합니다.

이 메서드를 통해서 전달받는 File[] 형태의 값은 아래와 같습니다.

0번째 요소 : 내장메모리 경로

1번째 요소 : 외장메모리 경로


외장SDCard가 존재하지 않을 경우는 File객체 배열을 한개만 리턴합니다.

이에 대한 예외처리가 필요합니다.


샘플코드를 만들었습니다.


//샘플코드
String sdCardPath = null;
File[] file = getExternalFilesDirs(Environment.DIRECTORY_DOCUMENTS);
if(file.length < 2){
Log.d(TAG, "내장메모리 경로 : " + file[0].getPath());
Log.d(TAG, "SD카드가 존재하지 않습니다.");
return;
}

Log.d(TAG, "내장메모리 경로 : " + file[0].getPath());
Log.d(TAG, "외장메모리 경로 : " + file[1].getPath());

sdCardPath = file[1].getPath();

//테스트 폴더 생성
File newFolder = new File(sdCardPath + "/DIR_TEST");
newFolder.mkdir();

//테스트 파일 생성
File newFile = new File(sdCardPath + "/test.txt");
try {
FileOutputStream fos = new FileOutputStream(newFile);
String msg = "이 파일은 SD 카드에 저장된 메세지입니다.";
fos.write(msg.getBytes());
fos.close();
} catch(FileNotFoundException fnfe) {
Log.d(TAG, "파일 생성 실패");
} catch(IOException ioe) {
Log.d(TAG, "데이터 쓰기 실패");
}


출처

https://developer.android.com/reference/android/content/Context.html?hl=ko#getExternalFilesDir(java.lang.String)


https://medium.com/marojuns-android/kitkat-4-4-%EC%97%90%EC%84%9C-%EB%A7%9E%EB%8B%A5%EB%9C%A8%EB%A6%B0-%EC%9D%B4%EC%8A%88-%EB%B0%8F-%ED%95%B4%EA%B2%B0-1ecb94c24694



Comments