[React Native_android 에러해결] 저장소접근권한 (target sdk32이하, 33이상 적용)
에러 상태
▼ 서론
앞전에 진행한, '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