본문 바로가기

개발/Front-end

[RN] RN 버전에 따른 안드로이드 앨범 접근 권한 문제 해결

안드로이드에서 사용자 앨범에 접근하기 위해서는 앨범 접근 권한을 요청해야 합니다.

안드로이드 13 이전 버전에서는 PermissionAndroid에 정의되어 있는 권한 중 READ_EXTERNAL_STORAGE을 통해서 접근할 수 있었으나, 13 버전(SDK 33)부터는 이 권한이 아무 역할을 하지 않는다. 기존 권한은 READ_MEDIA_IMAGE, READ_MEDIA_VIDEO, READ_MEDIA_AUDIO으로 대체되었다고 안드로이드 문서에서 제공하고 있다. [1]

 

변경된 파일 접근 권한 문서

 

RN에서는 0.70 이상 버전부터 이 내용이 반영되어 있다.

 

READ_MEDIA_* 권한이 없는 0.68(왼쪽)

 

그렇기 때문에 0.6X 버전을 사용할 때는 안드로이드 13 버전 이상에서 파일 접근 권한을 요청할 경우 원하는 동작을 수행하지 못하게 될 수 있다. 실제로 사이드 프로젝트 진행 중 없는 권한 요청으로 인해 앱이 꺼지는 문제가 발생했다.

 

이를 해결하기 위해서는 3가지 방법을 사용할 수 있는데[2]
  1. RN 버전을 0.70 버전 이상으로 업그레이드하는 방법
  2. react-native-permissions [3]와 같은 라이브러리를 설치해서 사용하는 방법
  3. patch-package [4]를 통해서 직접 패치하는 방법
이 중 1번은 과정이 번잡하기 때문에 탈락, react-native-permissions는 사용하는 권한이 많이 없음에도 라이브러리를 추가하기 싫어서 탈락. 결국. 직접 필요한 권한을 추가한 후 patch-package를 적용하는 3번 방식을 선택했다. 

(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

[2] : https://stackoverflow.com/questions/75010079/react-native-permissionsandroid-doesnt-include-read-media-images-how-to-work-a

[3] : https://github.com/zoontek/react-native-permissions

[4] : https://github.com/ds300/patch-package

 

반응형