런타임 퍼미션 요청
매니페스트 설정파일 내에 퍼미션 추가 이외에
안드로이드 6.0 버전 이상에서 앱이 제대로 실행되기 위해서는 추가 작업이 필요한 퍼미션들이 많이 있음.
그 중 한 가지가 위험(danger)퍼미션임.
[앱이 실행 중일 떄 승인을 요청해야 하는 퍼미션의 개요 알아보기]
○ 퍼미션의 종류
- 보통 퍼미션 : 앱이 설치되는 시점에서 사용자의 승인을 받음
- 위험 퍼미션 : 보통 퍼미션 + 앱이 실행될 때에도 최초 한 번 사용자의 승인을 받음(=런타임 퍼미션)
=> 보통 퍼미션과 위험 퍼미션은 매니페스트 파일에 선언해야 함.
○ 위험 퍼미션(사용자의 사생활 침해 방지 하기 위해 안전 장치를 추가한 것)
퍼미션 그룹 |
퍼미션 |
Calendar |
READ_CALENDAR, WRITE_CALENDAR |
Camera |
CAMERA |
Contacts |
READ_CONTACTS, WRITE_CONTACTS, GET_ACCOUNTS |
Location |
ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION |
Microphone |
RECORED_AUDIO |
Phone |
READ_PHONE_STATE, CALL_PHONE, READ_CALL_LOG, WRITE_CALL_LOG, ADD_VICEMAIL, USER_SIP, PROCESS_OUTGOING_CALLS |
Sensors |
BODY_SENSORS |
SMS |
SEND_SMS, RECEIVE_SMS, READ_SMS, RECEIVE_WAP_PUSH, RECEIVE_MMS |
Storage |
READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE |
○ 퍼미션 확인
퍼미션을 사용하기 앞서, 해당 퍼미션이 승인되었는지 먼저 확인 해야함.
= ContextCompat 클래스의 checkSelfPermission() 메서드를 호출 + 현재 액티비티의 참조와 요청하는 퍼미션을 인자로 전달.
그러면 이 메서드에서 해당 퍼미션의 승인 여부를 확인한 후, 정숫값이 PackageManager.PERMISSION_GRANTED 또는 PackageManager.PERMISSION_DENIED를 반환
○ 런타임 시에 퍼미션 요청하기
- 런타임 시의 퍼미션 요청은 ActivityCompat 클래스의 requestPermissions() 메서드를 호출하여 처리.
이 메서드가 호출될 때는 퍼미션 요청이 비동기 작업으로 처리되고, 그 작업이 끝나면 onRequestPermissionsResult() 메서드가 호출됨.
- requestPermissions() 메서드는 세 개의 인자를 받음.(현재 액티비티의 참조, 요청 퍼미션의 식별자, 요청 코드)
○ 퍼미션 요청 이유 제공하기
- 요청 대화상자가 사용자에게 보이기 전(해당 퍼미션을 이전에 거절한 적이 있을 때)에 별도의 대화상자에 퍼미션 요청 설명을 포함시켜 보여주기 :
ActivityCompat 클래스의 shouldShowRequestPermissionRationale() 메서드로 식별
※ 안드로이드 6.0 이전 버전에서는 퍼미션 요청 시 메니페스트 파일에만 추가하면 되었음
->
안드로이드 6.0 이상 버전에서도 퍼미션 요청 시 6.0 이전 버전에서와 동일하지만 런타임 시에도 퍼미션 요청을 해야 함.