IDE & Framework/Android

[Kotlin]ActivityForResult 및 checkSelfPerission 을 permissionLauncher로 대체하기

Greensky0026 2021. 12. 19. 13:42
반응형

자주 사용하기 때문에 검색안하고 긁어 쓰려고 포스팅 합니다...!


순서

1. 설정창 여는 퍼미션

2. 설정창 필요없이 팝업으로 획득하는 퍼미션

 

 

 

1. 설정창을 열어야 하는 system alert window의 경우

var ovelayPermission = Settings.canDrawOverlays(this)
val intent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:$packageName"))

val activityLauncher =
	registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
    	ovelayPermission = Settings.canDrawOverlays(this)
	    if(!ovelayPermission){
	        Toast.makeText(this,"권한이 없어 앱을 종료합니다.",Toast.LENGTH_SHORT).show()
	        finish()
	    } else {
        	//권한 획득시 수행할 작업
        }
}

if(!ovelayPermission){
    activityLauncher.launch(intent)
}

  설정창을 열어서 권한을 획득해야 하므로, 해당 application의 해당 설정으로 이동할 수 있는 intent가 필요하다.

하단의 if문으로 정의한 Settings.canDrawOverlays가 false면 intent를 실행하고,

intent의 결과를 activityLauncher로 작업아서 권한 획득 여부에 따른 작업을 분기할 수 있다.

참고로 system alter window permission의 경우 api 29까진 해당 앱에서 간편히 클릭한번으로 설정가능하지만,

api 30 이후부턴 모든 앱이 나열되어 있는 overlay setting 창에서 앱을 찾아서 허용해주어야 한다.

 

[참

manifest : SYSTEM_ALERT_WINDOW

Intent : ACTION_MANAGE_OVERLAY_PERMISSION

Setting : Settings.canDrawOverlays(Context)

 

 

 

2. popup으로 허용이가능한 READ_PHONE_NUMBERS permission의 경우

var permissions =
	arrayOf(
		Manifest.permission.READ_PHONE_NUMBERS
	)
    
val permissionLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission()) {
	isGranted: Boolean ->
		if(!isGranted){
			Toast.makeText(this,"전화번호 읽기 권한이 없다면 앱이 정상적으로 동작하지 않습니다.", Toast.LENGTH_SHORT).show()
		} else {
			//허용시 수행할 작업 입력
		}
	}
}

for (permission in permissions){
	permissionLauncher.launch(permission)
}

 권한을 획득할 permission들을 배열로 유지해 permissionLuncher를 실행시켜 허용여부를 확인한다.

해당 퍼미션이 없다면 허용하라는 팝업창을 띄우게 되며, 있다면 바로 else구문으로 넘어가게 된다.

반응형