Android

[Android] 안드로이드 파일 쓰기 / 파일 저장 / External Storage

jokey12 2020. 12. 31. 01:26

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 이상부터 외부 저장소의 접근해 파일을 읽고 쓰기 위해서는

MediaStoreSAF(Storage Access Framework)를 이용하는 것을 추천

 

이미지, 동영상, 오디오 파일과 같은 미디어 형식의 파일을 처리할 때는 MediaStore를 사용하고,

Documents(*.txt, *.pdf 등), 기타 파일들을 읽고 쓰려면 SAF를 사용.

 

SAF 사용...