안드로이드 Access app-specific files
안드로이드는 애플리케이션이 데이터를 저장할 수 있는 저장소를 두 가지로 제공하고 있다.
Device File Explorer
-> 단말기에 저장된 파일을 볼 수 있다.
openFileOutput
, openFileInput
// MODE_PRIVATE : 덮어 씌우기
// MODE_APPEND : 이어서 쓰기
val fos = openFileOutput("data1.dat", MODE_PRIVATE)
val dos = DataOutputStream(fos)
dos.writeInt(100)
dos.writeDouble(11.11)
dos.writeBoolean(true)
dos.writeUTF("문자열1")
dos.flush()
dos.close()
Android/data
폴더에 저장되고, 저장된 파일은 다른 app이 접근할 수 없으며 app을 삭제하면 같이 삭제된다.emulated/Android/data/패키지명/files
)를 가져온다.쓰기
val filePath = getExternalFilesDir(null).toString()
val fos = FileOutputStream("${filePath}/data2.dat")
val dos = DataOutputStream(fos)
dos.writeInt(200)
dos.writeDouble(22.22)
dos.writeBoolean(false)
dos.writeUTF("문자열2")
dos.flush()
dos.close()
fos.close()
textView.text = "외부 저장소 앱 데이터 폴더에 저장"
읽기
val fis = FileInputStream("${filePath}/data2.dat")
val dis = DataInputStream(fis)
val data1 = dis.readInt()
val data2 = dis.readDouble()
val data3 = dis.readBoolean()
val data4 = dis.readUTF()
dis.close()
fis.close()
button5.setOnClickListener {
// 파일 관리 앱의 액티비티를 실행한다.
val fileIntent = Intent(Intent.ACTION_CREATE_DOCUMENT)
fileIntent.addCategory(Intent.CATEGORY_OPENABLE)
// MimeType을 설정한다.
// MimeType이란? 파일에 저장되어 있는 데이터의 양식이 무엇인지를 타나내는 문자열
// https://developer.mozilla.org/ko/docs/Web/HTTP/Basics_of_HTTP/MIME_types
fileIntent.type = "*/*"
writeActivityLauncher.launch(fileIntent)
// 사용자가 저장할 파일을 선택하고 돌아오면 ResultCode는 RESULT_OK가 들어온다.
}
button6.setOnClickListener {
// 파일 관리 앱의 액티비티를 실행한다.
val fileIntent = Intent(Intent.ACTION_OPEN_DOCUMENT)
fileIntent.type = "*/*"
readActivityLauncher.launch(fileIntent)
}
내부 저장소 : openFileOutput, openFileInput
외부 저장소 : FileInputStream, FileOutputStream
외부 저장소에 저장된 파일은 모든 애플리케이션이 자유롭게 접근할 수 있어 보안에 문제가 되었다.
이에 안드로이드 10 부터는 외부 저장소에 제한을 두어 보안을 강화하게 되었다.
안드로이드 10에서는 외부 저장소의 정책을 무력화 할 수 있는 옵션이 있었으나 11부터는 이 옵션이 제거되어 외부 저장소의 자유로운 접근은 불가능하게 되었다.
이러한 외부 저장소를 Scoped Storage 정책이라 부른다.
Scoped Storage는 다음과 같은 형태로 구성된다.
앱 데이터 폴더 : 읽고 쓰는데 권한이 필요가 없으며 해당 애플리이션만 접근이 가능하다. 애플리케이션 삭제 시 폴더도 같이 삭제된다.
미디어 파일들 : 사진, 동영상, 음원파일들을 저장하는 장소이다.
공용 파일들 : Downloads 폴더. 이 폴더에 저장된 파일은 모든 애플리케이션이 접근할 수 있다. 단, 코드를 통한 직접 접근은 불가능하고 단말기에 설치된 파일 관리 어플을 통해서만 접근이 가능하다. 즉, 파일 관리 어플을 실행해 사용자가 직접 파일을 선택해줘야 가능하다.