나는 이렇게 학습한다/App

안드로이드 13+ 버전에서 이미지 권한 처리하기

daco2020 2025. 2. 2. 23:59
반응형

이번 글에서는 Flutter 프로젝트에서 안드로이드 13(API 33) 이상의 이미지 권한을 어떻게 처리하는지 정리해 보겠습니다.

 

문제의 시작

저는 현재 Facepop 이라는 사진 편집 앱을 개발하고 있습니다.

 

Facepop - Google Play 앱

재치있는 단체사진 Facepop으로 만들고 안전하게 공유하세요!

play.google.com

 

앱을 완성하고 나서 제 안드로이드 폰으로 앱이 정상 동작하는 것을 확인하고 기쁜 마음으로 플레이스토어 출시를 했습니다. 그런데 앱을 다운받은 다른 사용자들에게서 '갤러리' 탭이 동작하지 않는다는 제보를 받았습니다.

 

Facepop은 사진 편집 앱이기에 갤러리 탭에서 사진을 선택하는 과정이 필수적이었고 사진을 불러올 수 없는 것은 매우 치명적인 상황이었습니다.

 

하지만 확인을 위해 다시 제 폰으로 테스트했을 때에는 전혀 문제가 없었습니다... 뭐가 문제일까... 검색을 통해 알아보니 문제는 안드로이드 버전 때문이었습니다. 

 

버전 별로 다른 권한

안드로이드 12 이전 버전은 READ_EXTERNAL_STORAGE 권한만 명시하면 되었습니다.

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

 

제 안드로이드 폰이 12 버전의 안드로이드였죠. 그렇기 때문에 READ_EXTERNAL_STORAGE 권한 하나 만으로 이미지를 읽어오는데 문제가 없었습니다.

 

문제는 13 이후 버전입니다. 안드로이드는 13 버전부터 저장소 권한이 세분화되었고 READ_EXTERNAL_STORAGE 권한으로는 미디어 파일에 접근할 수 없었습니다. 

 

대신 미디어 타입별로 권한을 요청해야 하죠. 예를 들어 다음처럼 필요한 권한을 각각 요청해야 합니다.

 

이미지 파일 접근 권한 READ_MEDIA_IMAGES 

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

 

동영상 파일 접근 권한 READ_MEDIA_VIDEO

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

 

오디오 파일 접근 권한 READ_MEDIA_AUDIO

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

 

사용자 선택 미디어 접근 권한 (Android 14 이상) READ_MEDIA_VISUAL_USER_SELECTED

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

 

 

해결 과정

1. AndroidManifest.xml 설정

먼저, 안드로이드 버전별로 적절한 권한을 선언해야 합니다. 각 버전에 맞는 권한을 요청할 수 있도록 설정해야 하죠

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    <!-- SDK 32 이하 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
                     android:maxSdkVersion="32"/>

    <!-- SDK 33 (Android 13) -->
    <uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>

    <!-- SDK 34 (Android 14) -->
    <uses-permission android:name="android.permission.READ_MEDIA_VISUAL_USER_SELECTED"/>
</manifest>

 

기존 12 버전에서 사용하던 READ_EXTERNAL_STORAGE 권한에는 android:maxSdkVersion="32" 옵션을 추가하여 12 버전까지만 사용하도록 명시합니다.

 

그리고 READ_MEDIA_IMAGESREAD_MEDIA_VISUAL_USER_SELECTED 를 추가로 명시합니다.

 

2. PhotoManager 패키지 설정

PhotoManager 는 플러터 앱에서 기기의 미디어 파일(사진, 동영상, 오디오 등)을 쉽게 관리할 수 있도록 도와주는 패키지입니다.

 

PhotoManager 패키지를 사용하여 권한을 요청할 때, requestOption을 통해 미디어 타입을 명시적으로 지정합니다. 

final permission = await PhotoManager.requestPermissionExtend(
  requestOption: const PermissionRequestOption(
    androidPermission: AndroidPermission(
      type: RequestType.image, // 이미지 파일에 대한 권한 요청
      mediaLocation: true, // 미디어 파일의 위치 정보 접근 허용
    ),
  ),
);

 

PermissionRequestOption 은 권한 요청 시 세부 옵션을 지정합니다. 안드로이드 13 이상에서 미디어 파일 유형별로 권한을 요청할 때 사용합니다.

AndroidPermission 는 안드로이드에서 미디어 파일 접근 권한을 세부적으로 설정합니다. RequestType.image 을 지정해 이미지 파일에 대한 권한을 요청하죠. 

 

이렇게 하면 안드로이드 13 이상의 권한 요청이 제대로 이루어집니다.

반응형