[Android] 안드로이드 파일 쓰기 / 파일 저장 / External Storage
Internal Storage
- Permission 없이 사용 가능
- 저장된 파일은 자신의 앱에서만 액세스 가능
- 앱을 지우면 파일도 함께 소멸
- 캐시파일의 개념과 비슷
External Storage
- Permission 권한 필요
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- SD카드 등의 외부저장소에 파일을 저장
- 스마트폰의 저장소 또한 이곳에 포함 (ex. Download 폴더 등)
- getExternalStorageState() 함수를 호출하여 외부 저장소가 사용 가능한지에 대해 확인
//외부 저장소(External Storage)가 마운트(인식) 되었을 때 동작
//getExternalStorageState() 함수를 통해 외부저장장치가 Mount 되어 있는지를 확인
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
//다운로드 폴더에 "file.txt" 이름으로 txt 파일 저장
//Environment.DIRECTORY_DOWNLOADS - 기기의 기본 다운로드 폴더
File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath(), "file" + ".txt");
try{
FileWriter fw = new FileWriter(file, false);
fw.write("TEST MESSAGE");
fw.close();
} catch (IOException e){
e.printStackTrace();
Toast.makeText(getApplicationContext(),"ERROR",Toast.LENGTH_SHORT).show();
}
}
else{
Toast.makeText(getApplicationContext(),"ERROR",Toast.LENGTH_SHORT).show();
}
안드로이드 10, Q 부터는...
안드로이드 Target API 29 (안드로이드 10, Q) 부터 보안상의 이유로
외부 저장소(External Storage)에 접근 불가.
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
....
android:requestLegacyExternalStorage="true">
임시방편으로 AndroidManifest.xml 내에 android:requestLegacyExternalStorage="true" 사용을 해주면 되지만
오직 임시방편일 뿐
이전 코드를 사용해 보면 알겠지만 /sdcard 이하의 영역에는 접근이 불가능하며
open failed: EACCES (Permission denied) 에러가 나옴
그렇다보니 최상위 경로를 가지고오도록 했던 Environment.getExternalStorageDirectory()는 deprecated 되었다.
따라서 안드로이드 Q 이상부터 외부 저장소의 접근해 파일을 읽고 쓰기 위해서는
MediaStore나 SAF(Storage Access Framework)를 이용하는 것을 추천
이미지, 동영상, 오디오 파일과 같은 미디어 형식의 파일을 처리할 때는 MediaStore를 사용하고,
Documents(*.txt, *.pdf 등), 기타 파일들을 읽고 쓰려면 SAF를 사용.
SAF 사용...
ㅁ