안녕하세요~~~ 🤓🤓🤓
오늘은 Android 13 이상의 기기에서 앱 미디어 권한을 불러오는 방법에 대해 포스팅 하려고 합니다!!
현재 사내에서 React Native로 프로젝트를 진행하고 있습니다.
Android는 targetSdkVersion은 33이며, 이는 현재 최신 버전인 Android 13을 대응할 수 있는 환경 입니다.
해당 프로젝트에서 미디어 이미지 요청을 위해 expo-media-library를 사용하고있습니다. (version: 15.0.0)
expo-media-library는 사용자의 미디어 라이브러리에 대한 액세스를 제공하는 라이브러리 입니다.
expo-media-library에서는 앱 저장공간을 요청하는 requestPermissionsAsync() 함수를 사용하면 아래와 같은 권한 상태를 획득할 수 있습니다.
Android 13인 기기에서는 requestPermissionsAsync() 함수를 요청하면 PermissionStatus가 무한대로 undetermined이 뜨는 이슈가 있었습니다.
권한을 요청했고 사용자가 권한 허용 혹은 거부를 하지 않았는데, undetermined???
왜 그럴까요 🤷🏻❓ 🤷🏻❓ 🤷🏻❓
이유를 알기 위해서 우선 Android 외부 저장소 권한에 대해 알 필요가 있습니다.
Android 12까지는 앱 저장 공간 요청을 위해 WRITE_EXTERNAL_STORAGE와 READ_EXTERNAL_STORAGE의 권한을 필수로 합니다.
하지만 Android 13부터는 위의 권한을 아래와 같이 세분화 시키기로 합니다.
혹시 expo-media-library에서 위의 권한 대응이 되어있지 않은지 확인해보았는데, 역시나 15.0.0 버전에서는 WRITE_EXTERNAL_STORAGE와 READ_EXTERNAL_STORAGE의 권한만 요청할 뿐, 세분화된 미디어 권한은 요청하고 있지 않았습니다.
(그래서 Android 13인 기기에서는 정의되어있지 않는 권한을 요청하니 앱에 무한 요청을 시도하고 있지 않았나싶은 저의 추측...⭐️)
그래서 expo-media-library 라이브러리를 고치기로 합니다!
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>
MediaLibraryModule.kt 수정
(경로) expo-media-library/android/src/main/java/expo/modules/medialibrary/MediaLibraryModule.kt
EXTERNAL_STORAGE 권한 요청을 하는 부분에 SDK 33(TIRAMISU) 이상이면 READ_MEDIA_IMAGES 권한을 불러올 수 있도록 분기 처리하였습니다.
위의 수정사항들을 patch-package를 통해 프로젝트 내의 expo-media-library 소스를 수정하였습니다.
yarn patch-package expo-media-library
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