-
[Permission] 전반적인 권한 처리 로직Android/Permission 2021. 10. 22. 15:59
이전 포스팅에서는 사용자가 권한 허용, 거부,다시 묻지않음 거부시
shouldShowRequestPermissionRationale의 Boolean값이 어떻게 변하는지
안드로이드 버전에 따라 다이얼로그가 어떤식으로 출력되는지 등등에 대해서 알아보았다.
2021.10.21 - [Android/Permission] - [Android] 권한 체크, 획득
이번 포스팅에서는 다시 묻지 않음 거부시 사용자를 앱의 설정 액티비티로 유도하는 코드와 실제적으로 권한 처리하는 코드를 만들어본다.
안드로이드 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("수행할 수 있는 앱이 없습니다") } } } } }
'Android > Permission' 카테고리의 다른 글
[Permission] 외부저장소 WRITE 획득하면 READ도 같이 획득 (0) 2021.10.29 [Permission] 권한 체크, 획득 (0) 2021.10.21