Context.getFilesDir() 또는 getCacheDir() 로 접근가능
Context.getFilesDir() 경로는 /data/data/패키지명 이며
getCacheDir() 경로는 /data/data/패키지명/cache 가된다.
// SDK 28 이하에는 두가지 권한이 필요
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
// SDK 29 이상에는 READ 권한만 필요
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Context.getExternalFilesDir(null)
를 통해 접근 할 수 있다./sdcard/Android/data/
패키지명 경로에 파일이 작성된다.Environment.getExternalStorageDirectory().path
를 통해 접근 가능Environment.DIRECTORY_MUSIC 음악 파일 저장
Environment.DIRECTORY_PODCASTS 팟캐스트 파일 저장
Environment.DIRECTORY_DOWNLOADS 다운로드한 파일 저장
Environment.DIRECTORY_ALARMS 알람으로 사용할 오디오 저장
Environment.DIRECTORY_NOTIFICATIONS 알림음 오디오 저장
Environment.DIRECTORY_PICTURES 그림 파일 저장
Environment.DIRECTORY_MOVIES 영상 파일 저장
Environment.DIRECTORY_DCIM 사진 파일 저장
/sdcard
경로에 파일이 작성된다.Context.getExternalFilesDir()
를 통해 앱 공간에만 접근 할 수 있다.안드로이드 버전 10부터는 MediaStore API
사용을 권장 한다.
MediaStore
은 사용자가 가지고 있는 파일들을 다른 앱에서도 사용 할 수 있도록 설계된 API
Media
디렉토리 안에서 자신의 앱에 해당하는 곳은 권한 없이 사용 가능
이번 버전에서는 WRITE_EXTERNAL_STORAGE
만 있으면 다른 앱의 공용 파일에도 접근이 가능 했지만, 보안상의 이슈로 10부터는 이를 막아 놨다.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
val contentValues = ContentValues()
contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, "파일 명")
contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "text/plain")
contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, "Download")
val resolver = contentResolver
val uri: Uri? =
resolver.insert(MediaStore.Files.getContentUri("external"), contentValues)
try {
val wantToWriteFile = "파일명"
resolver.openOutputStream(uri)!!.write(wantToWriteFile.toByteArray())
} catch (e: Exception) {
e.printStackTrace()
}
}