본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[android] M os Runtime Permission 에 대한 이야기

by 돼지왕 왕돼지 2017. 8. 25.
반응형

 [android] M os Runtime Permission 에 대한 이야기


https://medium.com/ribot-labs/exploring-the-new-android-permissions-model-ba1d5d6c0610

access_coarse_location, access_fine_location, ADD_VOICEMAIL, Android, Best Practices, BODY_SENSORS, Calendar, CALL_PHONE, camera, checkSelfPermission, confirm, Contacts, cursor, Dialog, fail, feedback, Google Play Store, Grant, group level, groupping, Indicator, intent, internet permission, Location, M 전용 Permission 정의하기, mafniest, Microphone, mos, never ask again, onRequestPermissionsResult, permission, permission activity, permission dialog, Permission Group, Permission 요청하기, permission 획득 여부 조회, PERMISSION_DENIED, PERMISSION_GRANTED, Phone, pre m build, Pre-M Apps, PROCESS_OUTGOING_CALLS, PROTECTION_NORMAL, READ_CALENDAR, READ_CALL_LOG, READ_CELL_BROADCASTS, READ_CONTACTS, READ_EXTERNAL_STORAGE, READ_PHONE_STATE, READ_PROFILE, READ_SMS, RECEIVE_MMS, RECEIVE_SMS, RECEIVE_WAP_PUSH, RECORD_AUDIO, requestPermissions, runtime permission, SEND_SMS, Sensors, setting, shouldShowRequestPermissionRationale, SMS, Storage, uses-permission-sdk-m, USE_FINGERPRINT, USE_SIP, WRITE_CALENDAR, WRITE_CALL_LOG, WRITE_CONTACTS, WRITE_EXTERNAL_STORAGE, WRITE_PROFILE, [android] M os Runtime Permission 에 대한 이야기, 경고, 노출 조건, 다시 보지 않기, 설명, 여러개 permission 한번에 요청하기, 여러개의 permission 한번에 요청, 자동 grant, 필수 권한, 필요할 때 요청


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 을 얻지 말고 그녀석들을 활용하라.




반응형

댓글