안드로이드에서 사용자 앨범에 접근하기 위해서는 앨범 접근 권한을 요청해야 합니다.
안드로이드 13 이전 버전에서는 PermissionAndroid에 정의되어 있는 권한 중 READ_EXTERNAL_STORAGE을 통해서 접근할 수 있었으나, 13 버전(SDK 33)부터는 이 권한이 아무 역할을 하지 않는다. 기존 권한은 READ_MEDIA_IMAGE, READ_MEDIA_VIDEO, READ_MEDIA_AUDIO으로 대체되었다고 안드로이드 문서에서 제공하고 있다. [1]
RN에서는 0.70 이상 버전부터 이 내용이 반영되어 있다.
그렇기 때문에 0.6X 버전을 사용할 때는 안드로이드 13 버전 이상에서 파일 접근 권한을 요청할 경우 원하는 동작을 수행하지 못하게 될 수 있다. 실제로 사이드 프로젝트 진행 중 없는 권한 요청으로 인해 앱이 꺼지는 문제가 발생했다.
- RN 버전을 0.70 버전 이상으로 업그레이드하는 방법
- react-native-permissions [3]와 같은 라이브러리를 설치해서 사용하는 방법
- patch-package [4]를 통해서 직접 패치하는 방법
(patch-package은 패치 파일을 생성해 주는 도구로 이에 대한 내용이 중심이 아니기 때문에 나중에 기회가 되면 따로 정리하도록 하겠다.)
그러기 위해서는 node_modules에 설치된 react-native의 안드로이드 권한 관련 코드를 찾아야 한다.
node_modules/react-native/Libraries/PermissionAndroid/PermissionAndroid.js 파일에 해당 내용이 정의되어 있다.
PERMISSIONS라는 파일 및 PermissionAndroid라는 클래스를 살펴보게 되면, 앞서 말한 권한들이 없는 것을 확인할 수 있다. 해당 파일에 우리가 사용하길 원하는 권한을 아래와 같이 +로 표기한 코드들을 추가해 준다.
const PERMISSIONS = Object.freeze({
RECEIVE_WAP_PUSH: 'android.permission.RECEIVE_WAP_PUSH',
RECEIVE_MMS: 'android.permission.RECEIVE_MMS',
READ_EXTERNAL_STORAGE: 'android.permission.READ_EXTERNAL_STORAGE',
+ READ_MEDIA_IMAGES: 'android.permission.READ_MEDIA_IMAGES',
+ READ_MEDIA_VIDEO: 'android.permission.READ_MEDIA_VIDEO',
+ READ_MEDIA_AUDIO: 'android.permission.READ_MEDIA_AUDIO',
WRITE_EXTERNAL_STORAGE: 'android.permission.WRITE_EXTERNAL_STORAGE',
BLUETOOTH_CONNECT: 'android.permission.BLUETOOTH_CONNECT',
BLUETOOTH_SCAN: 'android.permission.BLUETOOTH_SCAN',
// ...
});
// ...
class PermissionsAndroid {
READ_CALL_LOG: string,
READ_CONTACTS: string,
READ_EXTERNAL_STORAGE: string,
+ READ_MEDIA_IMAGES: string,
+ READ_MEDIA_VIDEO: string,
+ READ_MEDIA_AUDIO: string,
READ_PHONE_NUMBERS: string,
READ_PHONE_STATE: string,
READ_SMS: string,
// ...
}
이렇게 수정해 준 후 patch-package를 통해서 patch 파일을 만들어준다. 이를 실행할 경우 수정한 내용에 대한 patch 파일이 생성되고, package.json에서 postinstall을 정의해 주면 yarn install을 통해서 파일을 설치할 때 패치된 내용을 반영해서 설치하도록 설정해 준다.
이렇게 수정하고 나면 정상적으로 해당 권한을 사용할 수 있는 것을 확인할 수 있다.
지금 진행하고 있는 사이드 프로젝트의 경우 0.7X 버전에서 발생할 수 있는 hermes 문제 등으로 인해 현재 0.68 버전을 쓰고 있어 이와 같은 방법으로 안드로이드 13 이상 버전에 대한 앨범 허용 권한 문제를 해결했다.
해당 권한을 직접 하드코딩하는 방법도 있지만, 그 방법은 좋은 방법은 아니니까... 만약 동일한 문제를 겪은 분이 있다면 참고가 되기를 바라며.
[1] : https://developer.android.com/reference/android/Manifest.permission#READ_EXTERNAL_STORAGE
[3] : https://github.com/zoontek/react-native-permissions
[4] : https://github.com/ds300/patch-package
'개발 > Front-end' 카테고리의 다른 글
[CSS] position: absolute 화면 중앙 배치 (0) | 2022.07.02 |
---|---|
<hr> 태그, vw를 사용해서 부모 컴포넌트에 상관없이 width 할당하기 (0) | 2022.04.18 |
[이슈리포트] Next.js 프로젝트에서 도메인 별로 다른 정보 뿌려주기 (0) | 2022.04.04 |
[이슈리포트] i18n과 라우팅 변경하기 (0) | 2022.03.23 |
[TIL] react-router의 Link와 a 태그 (0) | 2021.11.05 |