► React Native/개발일기

[React Native_android 에러해결] 저장소접근권한 (target sdk32이하, 33이상 적용)

다람트리 2023. 11. 24. 20:42
반응형

 

에러 상태

 

▼ 서론

앞전에 진행한, 'android target sdk 33 이슈' 작업중에, 이어서 추가 에러가 발생하였다.

android target sdk 33으로 업그레이드 하면서, 갑자기 오래된폰에서는 파일저장 접근권한허용이 뜨지않는다.. @@@ 너무해 ㅜㅜㅜ

 - 해당기능형태: 사진다운로드받으면, 파일앱에 사진이 저장되는 기능.

   파일앱에 저장하기위하여, 파일에 사진저장을위한 접근권한허용이 필요한데, 관련한 alert이 안뜬다.... ㄷ ㄷ 

 

 

▼ 'android target sdk 33 이슈' 작업 내용: https://daram-tree.tistory.com/222

 

[React Native_에러해결] android target sdk 33 이슈

안드로이드 정책이 바뀌어서, 안드로이드 api 33으로 바꿔야만 배포가 가능하다. 그래서 지난주부터 react-native 업데이트부터 다양한 방법을 시도하며 각종 에러를 해결해나가는 눈빠지는 작업을

daram-tree.tistory.com

 


 

상황 분석

 

 분석

아래와 같이 sdk33에서는 요청권한 코드가 세분화되고 변경되면서 발생한 오류로 보인다.

 


해결방법

 

1. AndroidManifest.xml 수정

 

 기존코드

android> app> src> main> AndroidManifest.xml

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

 

 변경된 코드

android> app> src> main> AndroidManifest.xml

    <!-- compileSdkVersion:33부터 적용 -->
    <uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>  
    <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />  
    <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />  

    <!-- compileSdkVersion:32까지 적용 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32"/>  
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32"/>

2. permission 퍼미션함수 수정

 

 기존코드

      const checkPermission = async () => {
        if (Platform.OS === "ios") {
          downloadImage();
        } else {
          try {
            const msg = {
              title: "저장소 권한 필요",
              message: "사진을 다운로드하려면 앱이 저장소에 접근해야합니다.",
            };

            const granted32 = await PermissionsAndroid.request(
              PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,
              msg
            );

            if (granted32 === PermissionsAndroid.RESULTS.GRANTED) {
              downloadImage();
              console.log("저장권한이 부여되었습니다. (granted32)");
            } else {
              CustomAlert("저장권한이 부여되지 않았습니다.");
            }
          } catch (error) {
            console.warn(error);
          }
        }
      };

 

 

 변경된 코드

      const checkPermission = async () => {                                       
// checkPermission함수생성: 안드로이드 저장소 접근권한 확인
        if (Platform.OS === "ios") {                                              
// ios android인지 체크 진행
          downloadImage();                                                        
// if(ios)= 이미지다운로드하는 함수(downloadImage())로 넘어감
        } else {                                                                  
// if(android)= 권한체크 진행
          try {
            const msg = {                                                         
// msg= 권한안내 메세지
              title: "저장소 권한 필요",
              message: "사진을 다운로드하려면 앱이 저장소에 접근해야합니다.",
            };
            const granted33 = await PermissionsAndroid.request(                   
// granted33= SDK33 이상에 적용되는 request(READ_MEDIA_IMAGES)
              PermissionsAndroid.PERMISSIONS.READ_MEDIA_IMAGES,
              msg
            );
            const granted32 = await PermissionsAndroid.request(                   
// granted32= SDK32 이하에 적용되는 request(WRITE_EXTERNAL_STORAGE)
              PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,
              msg
            );

            if (granted33 === PermissionsAndroid.RESULTS.GRANTED) {               
// if(SDK33이상)= SDK33이상에 맞는 권한허용체크 후, 이미지다운로드하는 함수(downloadImage())로 넘어감
              downloadImage();
              console.log("저장권한이 부여되었습니다. (granted33)");
            } else if (granted32 === PermissionsAndroid.RESULTS.GRANTED) {        
// if(SDK32이하)= SDK32이하에 맞는 권한허용체크 후, 이미지다운로드하는 함수(downloadImage())로 넘어감
              downloadImage();
              console.log("저장권한이 부여되었습니다. (granted32)");
            } else {
              CustomAlert("저장권한이 부여되지 않았습니다.");                             
// 저장권한 거부한 상태
            }
          } catch (error) {                                                       
// 진행중에 에러난 상태
            console.warn(error);
          }
        }
      };

 

AndroidManifest.xml 수정방법을 사수분이 어케저케 찾아내셨다

님은 갓사수

 

 


개인적으로 개발시행착오를 겪으면서, 그런 경험들을 기록하기도하고, 모은정보들을 메모하며, 개인공부내용을 공유하는 게시물입니다. 친절한 조언과 다양한 의견 남겨주시고, 소통해주시는분들은 언제든지 환영합니다 :D

 

 

반응형