ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Permission] 전반적인 권한 처리 로직
    Android/Permission 2021. 10. 22. 15:59

    이전 포스팅에서는 사용자가 권한 허용, 거부,다시 묻지않음 거부시

    shouldShowRequestPermissionRationale의 Boolean값이 어떻게 변하는지

    안드로이드 버전에 따라 다이얼로그가 어떤식으로 출력되는지 등등에 대해서 알아보았다.

    2021.10.21 - [Android/Permission] - [Android] 권한 체크, 획득

     

    이번 포스팅에서는 다시 묻지 않음 거부시 사용자를 앱의 설정 액티비티로 유도하는 코드와 실제적으로 권한 처리하는 코드를 만들어본다.

     

    액비티비 코드(Kotlin).txt
    0.01MB

     

     

     

    안드로이드 11 테스트

     

     


    단순 테스트 용도로 사용될 권한 외부저장소 쓰기

     

    ---매니페스트


    ---레이아웃 버튼( 전반적인 권한 처리)


    ---액티비티 

     

    • 로그와 토스트


    • 코드가 복잡해져 권한 체크, 권한 설명필요, 권한 요청 메서드로 나눴다

    권한 요청시 리퀘스트 코드와 테스트할 권한 

     

    인자에 처리할 권한을 넘겨준다


    • 권한 승인시 관련작업 수행 / 권한 거부시 사용자에게 설명(다이얼로그)

    각 다이얼로그 작업을 각 토스트 작업으로 변경하였다.


    • SharedPreferences로 첫 권한 요청 상태 저장

    shouldShowRequestPermissionRationale은 다시 묻지 않음 거부시에만 false가 아니라

    앱을 첫 설치하고 권한 요청이 한번도 일어나지 않은경우에도 false 상태로 초기화 되어있다.

    다시 묻지 않음 거부시에만 false라고 착각하여 shouldShowRequestPermissionRationale이 false일때

    사용자를 앱 설정으로 보내는 코드를 넣으면 앱 첫 설치시 권한요청대신 사용자를 앱 설정 화면으로 보내버림

     

    Sharedpreferences를 통해 권한요청이 한번도 없었나를 저장하여 이 값으로 체크한다.

    FIRST_REQUEST 키를 통해 판별


    • onRequestPermissionResult 콜백 메서드

     requestPermissions 에 대한 콜백 (시스템 다이얼로그를 사용할 수 있을때)

    사용자의 권한 승인, 거부상태에 따른 앱 동작 수행


    • startActivityForResult deprecated-> registerActivityForResult 사용

    다시 묻지 않음 거부인 경우 사용자를 앱 설정 액티비티로 유도해야한다. 

    사용자가 앱으로 다시 돌아올때 권한 체크를 할 수 있도록 startActivityForResult를 사용하였다

    [Android] StartActivityForResult Deprecated

    여기서 준비시켜놓은 mActivityResultLauncher를 다시묻지 않음 거부상태일때 launch메서드를 통해 앱 설정 액티비티를 호출한다(밑에서 다룸)

    여기의 onActivityResult는 사용자가 앱 설정화면에 갔다 돌아올때만 받는 콜백이다.

    (시스템 권한 다이얼로그 콜백과는 별개)


    • processPermission - 전반적인 권한 처리 메서드

    앱 설정으로 보내는 Intent 액션

    [Android] 설정 앱 관련 인텐트 Activity Action 몇가지

    private fun processPermission() {
    
        if (check(mPermission)) {
            //권한이 승인되어 있음
            work()
        } else {
            //권한이 거부되어 있음
            if (needExplain(mPermission)) {
                //true- > 권한 요청 메서드를 그대로 사용할 수 있음
                request(mPermission)
            } else {
    
                if (mPref.getString("FIRST_REQUEST", "noValue") == "true") {
                    //false 이면서 첫권한 요청(true)일 때 -> requestPermissions 사용가능
                    log("첫 권한 요청시에는 예외로 false")
                    request(mPermission)
    
                    //다음 앱 실행부터는 else 문만 실행시키기 위해 false 로 변경
                    mPref.edit().putString("FIRST_REQUEST", "false").apply()
    
                } else {
                    //false 이면서 다시묻지 않음 거부상태일 때 -> requestPermissions 사용불가
                    //-> 사용자를 권한 설정 액티비티로 보내야함
    
                    //-> 권한 설명과 함께 허용으로 변경하라는 커스텀 다이얼로그 생성, 준비
                    //-> 사용자가 다이얼로그의 확인을 클릭했다고 가정
                    //-> 토스트로 대체
                    toast("앱 설정에서...주세요(다이얼로그 확인 눌렀다고 가정)")
                    //이 부분은 다이얼로그로 바뀌면 전체적인 코드가 변경되어야 할 수도있다.
                    val intent =
                        Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
                    intent.data = Uri.parse("package:$packageName")
    
                    try {
                        mActivityResultLauncher.launch(intent)
                        //기존의 startActivityForResult(intent)에 해당
                    } catch (e: ActivityNotFoundException) {
                        log("수행할 수 있는 앱이 없습니다")
                    }
    
                }
    
            }
    
        }
    
    }

     

     

    댓글

Designed by Tistory.