[android] M os Runtime Permission 에 대한 이야기
https://medium.com/ribot-labs/exploring-the-new-android-permissions-model-ba1d5d6c0610
Permission Group
-
permission 들이 groupping 이 된다.
Calendar
Camera
Microphone
Phone
Contacts
Location
Sensors
SMS
Storage
-
위의 groupping 된 것들의 child 의 permission 을 얻을 때 group level 로 얻는다.
-
Calendar
READ_CALENDAR
WRITE_CALENDAR
-
Camera
CAMERA
-
Contacts
READ_CONTACTS
WRITE_CONTACTS
READ_PROFILE
WRITE_PROFILE
-
Location
ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION
-
Microphone
RECORD_AUDIO
-
Phone
READ_PHONE_STATE
CALL_PHONE
READ_CALL_LOG
WRITE_CALL_LOG
ADD_VOICEMAIL
USE_SIP
PROCESS_OUTGOING_CALLS
-
Sensors
BODY_SENSORS
USE_FINGERPRINT
-
SMS
SEND_SMS
RECEIVE_SMS
READ_SMS
RECEIVE_WAP_PUSH
RECEIVE_MMS
READ_CELL_BROADCASTS
-
Storage
READ_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE
-
internet permission 을 비롯한 다른 permission 들은 PROTECTION_NORMAL 로 분류되어
permission 승락을 요청하지 않고도 manifest 에 등록되어 있다면 사용 가능하다
Runtime Permission
-
이제 Google Play Store 에서 Install 버튼을 누르면 permission 확인을 받지 않고 실제로 install 을 수행한다.
-
checkSelfPermission 을 수행하면 system 이 우리가 필요한 permission 을 획득했는지 확인을 해준다.
return 값을 int 로 PERMISSION_GRANTED 혹은 PERMISSION_DENIED 이다.
-
requestPermissions 를 수행하면 permission 이 있는지 여부 & 다시보지 않기 체크 여부에 따라 dialog(실제로는 Activity) 가 뜨던지 onRequestPermissionsResult 가 바로 호출되던지 한다.
-
shouldShowRequestPermissionRationale() 함수를 통해서 이전에 permission 을 요청했었고, "never ask again" 으로 deny 되었는지 확인이 가능하다.
-
다시 보지 않기 항목은 1회 거절을 한 후에 다시 permission 을 요청했을 때부터 등장한다.
-
다시 보지 않기를 선택하며 deny 를 선택하면 앱 내에서는 permission 을 받을 수 있는 방법이 없다.
유저가 직접 setting 에 가서 permission 을 on 시켜주는 방법밖에 없다.
-
여러개의 permission 을 한번에 요청하는 것도 가능하다.
보통 권장되지 않지만, 앱 처음 시작점에서 permission 이 필수일 때는 권장되는 바이다.
dialog 자체는 동일하지만 1 / 2 와 같이 몇개의 permission 에 대한 요청을 봐야 하는지 indicator 가 나온다.
Permission 요청하기
-
checkSelfPermission() 을 통해 우리 앱이 이미 permission 을 가지고 있는지 확인할 수 있다.
만약 없다면 requestPermissions 를 통해 permission 을 요청할 수 있다.
static final int REQUEST_LOCATION = 1503;
String locationPermission = Manifest.permission.ACCESS_FINE_LOCATION;
int hasPermission = checkSelfPermission(locationPermission);
String[] permissions = new String[]{ locationPermission };
if ( hasPermission != PackageManager.PERMISSION_GRANTED ){
requestPermission(permissions, REQUEST_LOCATION);
} else{
...
}
-
requestPermissions() 를 호출하면 dialog 가 display 된다.
선택결과는 onRequestPermissionResult() 로 전달된다.
@Override
public void onRequestPermissionResult( int requestCode, String[] permissions, int[] grantResult){
switch( requestCode ){
case REQUEST_LOCATION:
if ( grandResult[0] == PackageManager.PERMISSION_GRANTED){
...
} else{
...
}
break;
}
}
M 전용 Permission 정의하기 @ manifest
-
M 전용으로 permission 을 정의할 수도 있다.
<uses-permission-sdk-m android:name=“android.permission.ACCESS_FINE_LOCATION”/>
세팅에서 permission toggling 하기
-
permission 종류별로 어떤 앱에서 사용하는지를 확인하여 toggle 할 수도 있고,
app 마다 어떤 permission 을 사용하는지 확인하여 toggle 할 수도 있다.
-
M version 이전으로 빌드된 녀석들도 permission 을 사용하면 이 setting 창에 뜬다.
그러나 그런 app 들은 권한에 대한 request 를 할 수 없기 때문에
permission 을 off 로 해지할 때 다른녀석과는 달리 경고메시지가 나오면서 한 번 더 confirm 을 받는다.
Pre-M Apps
-
pre M app 들은 기존과 같이 다운로드 할 떄 permission 에 대한 accept dialog 를 띄워준다.
accept 를 하면 자동으로 전부 grant 된다.
하지만 추후 setting 에 가서 permission 을 해지한다거나 하면 권한을 사용하는 곳에서 의도치 않은 동작을 할 수 있다.
예를 들어 권한 없이
연락처를 요청하면 cursor 에 내용물이 없다던지,
location 을 요청하면 fail 이 난다던지,
연락처 저장을 하면 실제 저장은 안 되면서 저장된 것처럼 나온다던지,
Best Practices
-
User 가 permission 에 대해 이해를 할 수 있도록 도와주라 ( 충분하고 임펙트 있는 설명으로 )
앱 구동시가 좋은 타이밍이다.
-
필요할 때에 permission 을 요청하라.
-
여러개의 permission 을 한번에 요청하는 것은 피해라.
필수권한일 경우에만 처음에 앱 시작할 때 여러개 요청하는 방향으로 진행하라.
-
유저가 permission 에 동의해주었을 때 적합한 feedback 을 주어라.
-
Intent 를 날려서 처리할 수 있는 일들은 permission 을 얻지 말고 그녀석들을 활용하라.
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[android] targetSdk & compileSdk (0) | 2017.08.27 |
---|---|
[android] Default Dialer 가 되면 자동으로 grant 하는 permission (0) | 2017.08.26 |
[android] Notification 에 meta data 를 추가하자 (0) | 2017.08.24 |
[Android] 새로운 Dex Compiler 가 나온다네용 (0) | 2017.08.13 |
[android] Kiosk mode app 을 만들자! (0) | 2017.08.07 |
댓글