반응형
Greensky0026
삽질러의 대환장 공사판
Greensky0026
전체 방문자
오늘
어제
  • 분류 전체보기 (241)
    • Language (56)
      • JAVA (13)
      • Swift (38)
      • Kotlin (4)
      • Dart (0)
      • PHP (0)
      • JavaScript (1)
    • IDE & Framework (92)
      • Spring (10)
      • Android (48)
      • iOS (8)
      • NodeJS (1)
      • CodeIgniter (3)
      • Flutter (1)
      • 분류중 (18)
    • Infra (8)
    • Database (12)
    • VCS (4)
    • Debug Log (34)
      • java (7)
      • swift (3)
      • Android (9)
      • Web (7)
      • 삽질기 (7)
    • Others (19)
      • 코딩테스트 풀이 (0)
      • IT 이야기 (18)
    • 쉼터 (2)
    • 개발공부 (14)
      • Network (1)
      • 자료구조와 알고리즘 (2)
      • Code design (8)
      • ETC (1)
      • 아카이브 (1)

블로그 메뉴

    공지사항

    • 프로그래머스 코딩 테스트 관련글 비공개 처리

    인기 글

    태그

    • xcode
    • swfit
    • ios
    • kotlin
    • 개발
    • Java
    • IT
    • JSP
    • swift
    • 구축
    • Android
    • 예제
    • 프로그래머스
    • map
    • level1
    • 코딩테스트
    • reduce
    • 프로그래밍
    • 공부
    • 타입

    최근 댓글

    최근 글

    티스토리

    hELLO · Designed By 정상우.
    Greensky0026

    삽질러의 대환장 공사판

    [Kotlin]ActivityForResult 및 checkSelfPerission 을 permissionLauncher로 대체하기
    IDE & Framework/Android

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

    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구문으로 넘어가게 된다.

    반응형
    저작자표시 비영리 변경금지 (새창열림)

    'IDE & Framework > Android' 카테고리의 다른 글

    [JAVA] Base64 incoding, decoding  (0) 2022.01.06
    [Kotlin] InCallService로 Default Dialer 개발하기  (4) 2021.12.19
    [Kotlin] Fragment (2) - 기초 예제  (0) 2021.12.19
    [Kotlin] Fragment (1) - Introduce  (0) 2021.12.12
    [Kotlin] WorkManager 사용해보기  (0) 2021.11.09
      'IDE & Framework/Android' 카테고리의 다른 글
      • [JAVA] Base64 incoding, decoding
      • [Kotlin] InCallService로 Default Dialer 개발하기
      • [Kotlin] Fragment (2) - 기초 예제
      • [Kotlin] Fragment (1) - Introduce
      Greensky0026
      Greensky0026
      점이 모여 선이 된다. 내 삽질도 언젠간 거대한 지하 도시가 되겠지!

      티스토리툴바