본문 바로가기
Development Solutions/Flutter & Dart

안드로이드 버전별 앨범 접근 권한 설정 가이드

by studio ODOC 2025. 3. 24.
반응형

안드로이드 버전별 앨범 접근 권한 설정 가이드

1. 안드로이드 버전별 권한 변화

안드로이드에서 미디어 파일(이미지, 동영상, 오디오)에 접근하는 방법은 버전별로 다르게 적용됩니다. 안드로이드 12까지는 READ_EXTERNAL_STORAGE 권한만으로 저장소의 모든 파일에 접근할 수 있었지만, 안드로이드 13부터는 미디어 타입별로 권한이 세분화되었습니다. 따라서 개발자는 안드로이드 버전에 맞춰 적절한 권한을 요청해야 합니다.

2. 안드로이드 12 (API 31) 이전 버전

안드로이드 12 및 그 이전 버전에서는 READ_EXTERNAL_STORAGE 권한을 선언하면 모든 미디어 파일(이미지, 동영상, 오디오)에 접근할 수 있었습니다.

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

이전에는 이 권한만으로 미디어 파일을 읽어오는 데 문제가 없었으나, 안드로이드 13부터는 새로운 권한 체계가 적용됩니다.

3. 안드로이드 13 (API 33) 이상

안드로이드 13부터는 READ_EXTERNAL_STORAGE 권한만으로는 미디어 파일에 접근할 수 없습니다. 대신 미디어 타입별로 개별 권한을 요청해야 합니다.

각 미디어 파일 접근을 위한 권한:

  • 이미지 파일 접근 권한
  • <uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
  • 동영상 파일 접근 권한
  • <uses-permission android:name="android.permission.READ_MEDIA_VIDEO"/>
  • 오디오 파일 접근 권한
  • <uses-permission android:name="android.permission.READ_MEDIA_AUDIO"/>

4. 안드로이드 14 (API 34) 이상

안드로이드 14에서는 더욱 강화된 보안 정책이 적용되었습니다. 사용자가 선택한 미디어 파일에만 접근할 수 있도록 READ_MEDIA_VISUAL_USER_SELECTED 권한이 추가되었습니다.

  • 사용자 선택 미디어 접근 권한
    <uses-permission android:name="android.permission.READ_MEDIA_VISUAL_USER_SELECTED"/>
    

5. AndroidManifest.xml 설정

안드로이드 버전에 따라 적절한 권한을 선언해야 합니다.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    
    <!-- SDK 32 이하 (안드로이드 12) -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
                     android:maxSdkVersion="32"/>
    
    <!-- SDK 33 (안드로이드 13) -->
    <uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
    <uses-permission android:name="android.permission.READ_MEDIA_VIDEO"/>
    <uses-permission android:name="android.permission.READ_MEDIA_AUDIO"/>
    
    <!-- SDK 34 (안드로이드 14) -->
    <uses-permission android:name="android.permission.READ_MEDIA_VISUAL_USER_SELECTED"/>
</manifest>

이렇게 하면 안드로이드 12 이하에서는 기존 방식으로 동작하고, 안드로이드 13 이상에서는 새로운 권한 체계에 맞춰 동작하게 됩니다.

6. 런타임 권한 요청 코드

권한을 AndroidManifest.xml에 추가하는 것만으로는 충분하지 않습니다. 안드로이드 6.0 (API 23) 이상에서는 반드시 런타임 권한을 요청해야 합니다.

안드로이드 12 이하의 런타임 권한 요청

if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.S) { // API 31 이하
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
        != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this,
            arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE),
            REQUEST_CODE)
    }
}

안드로이드 13 이상에서의 런타임 권한 요청

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { // API 33 이상
    val permissions = mutableListOf<String>()
    
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_MEDIA_IMAGES)
        != PackageManager.PERMISSION_GRANTED) {
        permissions.add(Manifest.permission.READ_MEDIA_IMAGES)
    }
    
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_MEDIA_VIDEO)
        != PackageManager.PERMISSION_GRANTED) {
        permissions.add(Manifest.permission.READ_MEDIA_VIDEO)
    }
    
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_MEDIA_AUDIO)
        != PackageManager.PERMISSION_GRANTED) {
        permissions.add(Manifest.permission.READ_MEDIA_AUDIO)
    }
    
    if (permissions.isNotEmpty()) {
        ActivityCompat.requestPermissions(this, permissions.toTypedArray(), REQUEST_CODE)
    }
}

 

7. 결론

안드로이드 버전별로 저장소 접근 권한이 점점 강화되면서, 개발자는 이에 맞는 권한 요청 방식을 적용해야 합니다.

  • 안드로이드 12 이하: READ_EXTERNAL_STORAGE 사용
  • 안드로이드 13 이상: READ_MEDIA_IMAGES, READ_MEDIA_VIDEO, READ_MEDIA_AUDIO 개별 요청
  • 안드로이드 14 이상: READ_MEDIA_VISUAL_USER_SELECTED 활용

이제는 단순히 저장소 권한을 요청하는 것이 아니라, 필요한 미디어 타입에 맞는 권한을 적절하게 사용해야 합니다. 최신 안드로이드 버전에 맞춰 권한 설정을 올바르게 적용하여 앱이 정상적으로 동작하도록 개발해야 합니다.

반응형