Carrot
Android

[Jetpack Compose] 외부 공유 저장소에 폴더 생성하기

NaDuck 2023. 1. 23. 11:29

(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