ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [React Native_android 에러해결] 저장소접근권한 (target sdk32이하, 33이상 적용)
    ► React Native/개발일기 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

     

     

    반응형
Designed by Tistory.