(2023.1.23 기준)
우선 외부 저장소 접근을 하기 위해서 Manifest 파일에 아래의 권한들이 필요하다.
- SDK 28 이하(안드로이드 9)
- WRITE_EXTERNAL_STORAGE
- READ_EXTERNAL_STORAGE
- SDK 29 이상(안드로이드 10)
- READ_EXTERNAL_STORAGE
- MANAGE_EXTERNAL_STORAGE
- <application> ... android:requestLegacyExternalStorage="true" </application> (안드로이드 10에서만)
안드로이드 10 이상부터 WRITE_EXTERNAL_STORAGE 권한은 무시된다.
정리하자면, 아래와 같이 권한을 설정해주면 된다.
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" tools:ignore="ScopedStorage" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<application
android:requestLegacyExternalStorage="true"
...
</application>
한 편, 안드로이드에서 보안 강화 정책으로 인해
SDK 30 이상으로 타겟팅하게 되어 있음. 즉 외부 공유 저장소로 들어가 mkdirs()과 같은 메소드 사용 불가
따라서 현재 외부 공유 저장소에 접근하여 폴더를 생성하려면 MediaStore를 사용해야 한다.
fun createFolder(folderName: string) {
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
val contentValues = ContentValues().apply {
put(MediaStore.Images.Media.RELATIVE_PATH, "DCIM/$folderName")
put(MediaStore.Images.Media.IS_PENDING, 1) // 독점
}
context.contentResolver.insert(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
contentValues
)
contentValues.put(MediaStore.Images.Media.IS_PENDING, 0) // 독점 해제
Toast.makeText(context, "[$folderName] 폴더 생성", Toast.LENGTH_SHORT).show()
}
}
위는 DCIM 하위에 새로운 폴더를 생성하는 함수이다.
실질적으로 폴더를 생성하는 코드는 이 부분
context.contentResolver.insert(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
contentValues
)
참고)
https://developside.tistory.com/102
안드로이드 11 대응(Target SDK 30) - Scoped storage
2020년 11월 1일 부로 안드로이드 Target SDK 레벨이 29 이상이어야만 업데이트가 가능합니다. 이로 인해서 Target SDK 를 올리는 작업을 하기로 결정하게 되었고, 이왕 작업하는 거 Target SDK를 30으로 올
developside.tistory.com
https://developer.android.com/training/data-storage
데이터 및 파일 저장소 개요 | Android 개발자 | Android Developers
데이터 및 파일 저장소 개요 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Android는 다른 플랫폼의 디스크 기반 파일 시스템과 유사한 파일 시스템을 사용
developer.android.com
https://youngest-programming.tistory.com/386
[안드로이드] Scoped Storage(범위지정 저장소) 정리 (Legacy Storage와 차이점 정리)
[2021-06-04 업데이트] 이전에 안드로이드 11에 대해 공부했던 내용 중 안드로이드 10에서 나온 거지만 11에서도 언급된 범위 지정 저장소(Scoped Storage)에 관련 사항들에 대해 정리해보려합니다. ㅎㅎ
youngest-programming.tistory.com
'Android' 카테고리의 다른 글
[Jetpack Compose] TextField 입력 후 키보드 숨기기 (0) | 2023.01.23 |
---|---|
[Jetpack Compose] Compose 기초 (0) | 2023.01.14 |
[React Native] 텍스트에 이모지(emoji) 넣기 (0) | 2022.09.20 |
[Android/Kotlin] Toast 메시지 위치 설정하기 (0) | 2022.07.24 |
[Android/Kotiln] Toast 중복(duration 중첩) 피하기 (0) | 2022.07.22 |