Android——許可權機制
許可權機制
Android申請許可權需要在AndroidManifest.xml中新增許可權申請,在系統低於6.0的裝置上安裝的軟體只要在AndroidManifest.xml中聲明瞭的許可權就可以擁有那些許可權。
在系統6.0之後加入了執行時許可權功能,將所有許可權分為了兩類:普通許可權和危險許可權:
- 普通許可權是指那些不會直接威脅到使用者安全和隱私的許可權,對於這部分許可權申請,只要在AndroidManifest.xml中新增許可權申請,系統會自動幫我們進行授權。
- 危險許可權則表示那些可能會觸及使用者隱私或者對裝置安全性造成影響的許可權,如獲取裝置聯絡人資訊、定位裝置的地理位置等,對於這部分許可權申請採取執行時許可權功能,除了需要在AndroidManifest.xml中新增許可權申請,還需要由使用者手動點選授權才可以。
在加入執行時許可權後,安裝時只會賦予安裝的軟體申請的普通許可權,危險許可權需要使用者在要用到的時候同意對這項許可權進行授權才會賦予該許可權,不同意則無法使用該許可權。
下表列出了Android中的危險許可權,一共9組24個許可權:
許可權組名 |
許可權名 |
作用 |
CALENDAR |
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 |
使用SIP服務 |
|
PROCESS_OUTGOING_CALLS |
查看向外呼叫期間所撥打的號碼(在API 29廢棄) |
|
SENSORS |
BOOY_SENSORS |
從感測器中訪問資料 |
SMS |
SEND_SMS |
傳送SMS訊息 |
RECEIVE_SMS |
接收SMS訊息 |
|
READ_SMS |
讀取SMS訊息 |
|
RECEIVE_WAP_PUSH |
接收WAP推送訊息 |
|
RECEIVE_MMS |
監視傳入的MMS訊息 |
|
STORAGE |
READ_EXTERNAL_STORAGE |
讀取外部儲存 |
WRITE_EXTERNAL_STORAGE |
寫到外部儲存器 |
檢視Android系統中完整的許可權列表:https://developer.android.google.cn/reference/android/Manifest.permission.html
執行時許可權申請程式碼(申請使用者聯絡人):
if (ContextCompat.checkSelfPermission(this,Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED){ ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_CONTACTS},1); }
- checkSelfPermission(Context context, String permission)方法用於確定您是否已被授予特定許可權,接收兩個引數,第一個是Context,第二個是許可權名稱,返回值有兩個,PackageManager.PERMISSION_GRANTED表示已授予,PackageManager.PERMISSION_DENIED表示未授予。
- requestPermissions(Activity activity, Array<String!> permissions, Int requestCode)方法用於請求要授予此應用程式的許可權,接收三個引數,第一個引數為Activity的例項,第二個引數是一個String陣列,裡面存放要申請的許可權名,第三個引數是請求碼,只要是唯一值就可以。
呼叫完requestPermissions()方法後,系統會彈出一個許可權申請的對話方塊,然後使用者可以選擇同意或拒絕該許可權申請,不論是哪種結果,都會回撥到onRequestPermissionsResult()方法中->
- onRequestPermissionsResult (int requestCode, String[] permissions, int[] grantResults)方法從請求許可權中回撥結果,有三個引數,前兩個引數前面有講,第三個引數儲存的是授權結果,可以在這個方法中寫授權操作之後需要的操作程式碼。