https://donghyeok90.tistory.com/281
이 포스팅에서 다룬 코드가 일부 환경에서는 정상적으로 동작하지 않았다.
'앨범에서 가져오기'를 선택하면 미디어 파일 접근 권한 설정을 물어보는 창이 나와야 하는데,
아무것도 나오지 않았다.
로그는 다음과 같이 나왔다.
코드는 아무리 살펴봐도 이상이 없는데 왜 동작하지 않지?
안드로이드스튜디오 재설치도 해봤지만 소용 없었다.
한참 시간이 걸려 결국 원인을 찾아냈다.
안드로이드 13의 변경사항으로 미디어 파일 접근 권한이 바뀌었다고 한다.
세분화된 미디어 파일 권한
이 변경사항은 Android 13 이상(API 33 or higher)을 타겟팅하는 앱을 대상으로 적용됩니다.
주요 내용은 미디어 파일 전체에 접근할 수 있는 READ_EXTERNAL_STORAGE 권한이 더 이상 사용되지 않고, 3개 권한으로 분리되었습니다.
- READ_MEDIA_IMAGES : 이미지, 사진 파일 접근 권한
- READ_MEDIA_VIDEO : 비디오 파일 접근 권한
- READ_MEDIA_AUDIO : 오디오 파일 접근 권한
따라서, 타겟 API가 33 이상인 앱은 READ_EXTERNAL_STORAGE를 사용하지 말고, 필요에 따라서 3개의 권한을 사용자에게 요청하셔야 합니다.
자세한 내용은 이 글을 참고하자.
그래서 바꿔 준 부분은 다음과 같다.
- manifest의 허용할 권한을 READ_MEDIA_IMAGES로 변경
- 권한 확인하는 부분의 코드를 변경
private void requestPermission() {
if(ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,
Manifest.permission.READ_MEDIA_IMAGES)){
Toast.makeText(MainActivity.this, "권한 수락이 필요합니다.",
Toast.LENGTH_SHORT).show();
}else{
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.READ_MEDIA_IMAGES}, 500);
}
}
private boolean checkPermission(){
int result = ContextCompat.checkSelfPermission(MainActivity.this,
Manifest.permission.READ_MEDIA_IMAGES);
if(result == PackageManager.PERMISSION_DENIED){
return false;
}else{
return true;
}
}
target API가 33이상일 때는 이렇게 하면 잘 동작한다.