Android/Permission

[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("수행할 수 있는 앱이 없습니다")
                }

            }

        }

    }

}