이번 프로젝트의 targetSdkVersion 을 31에서 33으로 올렸다.
앱을가장 처음 시작하면 사용자에게 권한요청을 해야한다. 33으로 버전을 올리자마자 권한요청 기능이 동작하지 않았다.
아래의 코드가 이번에 문제가 발생했던 코드다.
private void checkPermission() {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.R){
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED
|| ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
|| ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
|| ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_NUMBERS) != PackageManager.PERMISSION_GRANTED
)
{
ActivityCompat.requestPermissions(mContext, new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.READ_PHONE_NUMBERS
}, MY_PERMISSIONS_REQUEST);
} else {
startLoginFormActivity();
}
}else{
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED
|| ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
|| ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
)
{
ActivityCompat.requestPermissions(mContext, new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.READ_PHONE_STATE
}, MY_PERMISSIONS_REQUEST);
} else {
startLoginFormActivity();
}
}
}
외부 저장소와를 읽고 쓸 수 있어야한다. (앱에 있는 파일, 이미지, 동영상 등을 업로드 하는게 가능해야 한다는 말이다.)
이게 13버전으로 올라오면서 권한요청의 내용이 조금 더 세분화 됐다.
아래는 수정한 코드다.
private void checkPermission() {
// Android 13 (API 33) 이상
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
if (
ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED
|| ContextCompat.checkSelfPermission(this, Manifest.permission.READ_MEDIA_IMAGES) != PackageManager.PERMISSION_GRANTED
|| ContextCompat.checkSelfPermission(this, Manifest.permission.READ_MEDIA_VIDEO) != PackageManager.PERMISSION_GRANTED
|| ContextCompat.checkSelfPermission(this, Manifest.permission.READ_MEDIA_AUDIO) != PackageManager.PERMISSION_GRANTED
|| ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_NUMBERS) != PackageManager.PERMISSION_GRANTED
) {
ActivityCompat.requestPermissions(this, new String[] {
Manifest.permission.READ_MEDIA_IMAGES,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.READ_MEDIA_VIDEO,
Manifest.permission.READ_MEDIA_AUDIO,
Manifest.permission.READ_PHONE_NUMBERS
}, MY_PERMISSIONS_REQUEST);
} else {
startLoginFormActivity();
}
}
// Android 11 (API 30) 이상
else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.R){
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED
|| ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
|| ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
|| ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_NUMBERS) != PackageManager.PERMISSION_GRANTED
)
{
ActivityCompat.requestPermissions(mContext, new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.READ_PHONE_NUMBERS
}, MY_PERMISSIONS_REQUEST);
} else {
startLoginFormActivity();
}
}else{
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED
|| ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
|| ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
)
{
ActivityCompat.requestPermissions(mContext, new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.READ_PHONE_STATE
}, MY_PERMISSIONS_REQUEST);
} else {
startLoginFormActivity();
}
}
}
그냥 외부 저장소라고 요약해서 표현했는데 13버전으로 바뀌면서 더 세분화 됐다.
Manifest.permission.READ_MEDIA_IMAGES,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.READ_MEDIA_VIDEO,
Manifest.permission.READ_MEDIA_AUDIO,
이런 식으로 말이다. 아! 그리고 이를 사용하기 위해서는 반드시 메니페스트에 사용자 권한을 추가하는 것을 잊지말자.
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<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" />
그리고 앱을 플레이스토어에 올릴때 아래의 내용도 추가해야 한다고 해서 추가해줬다.
만약 본인이 개발하고 있는 앱이 os13버전 이상에 플레이스토어에 등록 할 것이라면 아래의 내용도 매니페스트에 추가해주자.
<uses-permission android:name="com.google.android.gms.permission.AD_ID" />