본문 바로가기

만났던 에러들

안드로이드 targetSdkVersion 을 33 (android 13버전)으로 올릴때 사용자 권한(user permission) 주의점

이번 프로젝트의 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" />