[React Native] Android 13 이상 타겟팅 하는 앱 미디어 권한 불러오기

jiveloper·2023년 11월 4일
1

React Native

목록 보기
11/14
post-thumbnail

안녕하세요~~~ 🤓🤓🤓
오늘은 Android 13 이상의 기기에서 앱 미디어 권한을 불러오는 방법에 대해 포스팅 하려고 합니다!!


0. 배경

현재 사내에서 React Native로 프로젝트를 진행하고 있습니다.
Android는 targetSdkVersion은 33이며, 이는 현재 최신 버전인 Android 13을 대응할 수 있는 환경 입니다.

해당 프로젝트에서 미디어 이미지 요청을 위해 expo-media-library를 사용하고있습니다. (version: 15.0.0)


1. expo-media-library 설명

expo-media-library는 사용자의 미디어 라이브러리에 대한 액세스를 제공하는 라이브러리 입니다.

expo-media-library에서는 앱 저장공간을 요청하는 requestPermissionsAsync() 함수를 사용하면 아래와 같은 권한 상태를 획득할 수 있습니다.


2. expo-media-library 사용 중 발생한 이슈

Android 13인 기기에서는 requestPermissionsAsync() 함수를 요청하면 PermissionStatus가 무한대로 undetermined이 뜨는 이슈가 있었습니다.


권한을 요청했고 사용자가 권한 허용 혹은 거부를 하지 않았는데, undetermined???

왜 그럴까요 🤷🏻‍❓ 🤷🏻‍❓ 🤷🏻‍❓


이유를 알기 위해서 우선 Android 외부 저장소 권한에 대해 알 필요가 있습니다.


3. Android 외부 저장소 권한 설명

Android 12까지는 앱 저장 공간 요청을 위해 WRITE_EXTERNAL_STORAGEREAD_EXTERNAL_STORAGE의 권한을 필수로 합니다.

하지만 Android 13부터는 위의 권한을 아래와 같이 세분화 시키기로 합니다.

혹시 expo-media-library에서 위의 권한 대응이 되어있지 않은지 확인해보았는데, 역시나 15.0.0 버전에서는 WRITE_EXTERNAL_STORAGEREAD_EXTERNAL_STORAGE의 권한만 요청할 뿐, 세분화된 미디어 권한은 요청하고 있지 않았습니다.


(그래서 Android 13인 기기에서는 정의되어있지 않는 권한을 요청하니 앱에 무한 요청을 시도하고 있지 않았나싶은 저의 추측...⭐️)


4. expo-media-library 15.0.0 버전 수정

그래서 expo-media-library 라이브러리를 고치기로 합니다!

  1. AndroidManifest.xml 수정

    (경로 1) expo-media-library/android/build/intermediates/merged_manifest/debug/AndroidManifest.xml
    (경로 2) expo-media- library/android/src/main/AndroidManifest.xml

    이미지 권한 요청이 필요했기 때문에, Android 12 (SDK 32)까지는 EXTERNAL_STORAGE 권한을 사용하도록 하고, Android 13 (SDK 33)부터는 세분화된 권한을 요청할 수 있도록 READ_MEDIA_IMAGES 권한을 추가하였습니다.

    <manifest package="expo.modules.medialibrary"
       xmlns:android="http://schemas.android.com/apk/res/android"
       xmlns:tools="http://schemas.android.com/tools">
     <uses-permission
         android:name="android.permission.READ_EXTERNAL_STORAGE"
         android:maxSdkVersion="32" />
     <uses-permission
         android:name="android.permission.WRITE_EXTERNAL_STORAGE"
         android:maxSdkVersion="32"
         tools:ignore="ScopedStorage" />
     <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
    </manifest>

  1. MediaLibraryModule.kt 수정

    (경로) expo-media-library/android/src/main/java/expo/modules/medialibrary/MediaLibraryModule.kt

    EXTERNAL_STORAGE 권한 요청을 하는 부분에 SDK 33(TIRAMISU) 이상이면 READ_MEDIA_IMAGES 권한을 불러올 수 있도록 분기 처리하였습니다.


5. expo-media-library 패치패키지

위의 수정사항들을 patch-package를 통해 프로젝트 내의 expo-media-library 소스를 수정하였습니다.

yarn patch-package expo-media-library

6. 느낀점

expo-media-library는 현재 15.6.0 버전까지 나와있으며, 나중에 알고보니 해당 버전에는 Android 13에 대한 저장공간 세부 권한 요청이 대응 되어있었습니다...!

해당 버전으로 패키지를 받아서 사용했다면 더 편했겠지만...^^ 그랬다면 Android 13을 대응해야한다는 사실 조차 몰랐을 겁니다.

오히려 15.0.0 버전을 사용하게 되어 Android OS 별 권한을 달리 줘야한다는 사실을 새롭게 알게 되고 대응법도 알게 되어 다행이고 뿌듯합니다.

expo-media-library 공식문서를 보면 권한 요청에 대해서는 READ_EXTERNAL_STORAGE와 WRITE_EXTERNAL_STORAGE 권한만 적혀있는데, 네이티브의 업데이트 내용이 있으면 공식문서도 같이 업데이트 되었으면 하는 바람입니다...!! (공식문서가 조금 아쉽네요...😅)





참고

expo-media-library의 Android 13 권한 대응 코드 적용
https://github.com/expo/expo/pull/20907

안드로이드 13 세분화된 미디어 권한
https://developer.android.com/about/versions/13/behavior-changes-13?hl=ko#granular-media-permissions

profile
👩🏻‍💻 Clean Code와 Refactoring에 관심이 많은 개발자 입니다.

0개의 댓글