android 6.0 permission change

Post on 16-Jan-2017

1.057 Views

Category:

Software

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Android 6.0 Permission

change

彥彬

Permission before 6.0

大部分的人應該都這樣做

Apps support 6.0

APP安裝行為

1. 6.0以下手機 + 支援6.0的APP

2. 6.0 以下手機 + 不支援6.0的APP

3. 6.0 以上手機 + 不支援 6.0 的APP

4. 6.0 以上手機 + 支援 6.0 的 APP

安裝時需要同意權限

安裝時需要同意權限

安裝時需要同意權限

安裝時不需要同意權限

Permission overview

Permission category● Normal permission● Dangerous permission

Normal Permission● 只需要在 manifest 宣告就好

● 使用者不必同意該權限

● 使用者不會知道使用了該權限

Dangerous Permission● 使用者可自行決定是否使用該權限

● 可在設定中關閉

Permission group● Dangerous permission 分成 9 組● 一次同意整組權限

Permission groupsCALENDAR

● READ_CALENDAR● WRITE_CALENDAR

CAMERA

● CAMERA

CONTACTS

● READ_CONTACTS● WRITE_CONTACTS● GET_ACCOUNTS

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

SMS

● SEND_SMS● RECEIVE_SMS● READ_SMS● RECEIVE_WAP_PUSH● RECEIVE_MMS

STORAGE

● READ_EXTERNAL_STORAGE● WRITE_EXTERNAL_STORAGE

Permission API

API 使用流程

checkSelfPermission

繼續執行

requestPermissions

PERMISSION_GRANTED

PERMISSION_DENIEDonRequest

PermissionsResultError handling

PERMISSION_GRANTED

PERMISSION_DENIED

APIsint Context#checkSelfPermission(String permission)

void Activity/Fragment#RequestPermissions(String[] permissions, int requestCode)

void Activity/Fragment#onRequestPermissionsResult(int requestCode, String[]

permissions, int[] grantResults )

boolean Activity/Fragment#shouldShowRequestPermissionRationale(String permission)

要求權限if (checkSelfPermission(Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {

// Should we show an explanation? if (shouldShowRequestPermissionRationale(Manifest.permission.READ_CONTACTS)) {

// Show an expanation to the user *asynchronously* -- don't block // this thread waiting for the user's response! After the user // sees the explanation, try again to request the permission.

} else {

// No explanation needed, we can request the permission.

requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, MY_PERMISSIONS_REQUEST_READ_CONTACTS);

// MY_PERMISSIONS_REQUEST_READ_CONTACTS is an // app-defined int constant. The callback method gets the // result of the request. }}

處理回應@Overridepublic void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case MY_PERMISSIONS_REQUEST_READ_CONTACTS: { // If request is cancelled, the result arrays are empty. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

// permission was granted, yay! Do the // contacts-related task you need to do.

} else {

// permission denied, boo! Disable the // functionality that depends on this permission. } return; } }}

處理“不要再詢問我”

shouldShowRequestPermissionRationale(permission) == false

相容性

● 需要檢查 Build.VERSION_CODE < 23● 或是使用 Support v4

Asking for permission

一般時機

● 需要時再要求(map, 定位...)● 永遠不要有預設立場,在onCreate檢查

● 發送 Intent 時也需要權限

Service?1. 一開APP 馬上要求權限

2. 需要時發出Notification3. 隨時提醒使用者

Extras

建議

● 盡量隔離外部資源

● Permission API再包裝一層

Screen overlay● 無法更改權限屬正常行為

偷偷被藏起來的權限...● Manifest.permission.WRITE_SETTINGS● Manifest.permission.CHANGE_NETWORK_STATE● Manifest.permission.SYSTEM_ALERT_WINDOW

pre23| preinstalled permissions● Android M 之後預設無法使用

● Manifest.permission.WRITE_SETTINGS 可以經由 intent ACTION_MANAGE_WRITE_SETTINGS 開啟

top related