在Android權限(一)中,介紹了Android中的所有權限馁菜。隨著Android 6.0發(fā)布以及普及川尖,我們開發(fā)者所要應對的主要就是新版本SDK帶來的一些變化隧魄,首先關注的就是權限機制的變化筋岛。
Android6.0 權限變化
在Android 6.0版本之前娶视,只要用戶安裝完,AndroidManifest清單上申請的權限都會被系統(tǒng)默認授權睁宰,并且授權后也撤銷不了肪获。弊端就是,即使權限用戶不需要柒傻,但是也去不掉孝赫。一些惡意程序,會利用這個權限默認授權红符,進行惡意獲取用戶數(shù)據(jù)和攻擊青柄。Android6.0采用新的權限模型劫映,只有在需要權限的時候,才告知用戶是否授權刹前,是在runtime時候授權,而不是在原來安裝的時候 雌桑,同時默認情況下每次在運行時打開頁面時候喇喉,需要先檢查是否有所需要的權限申請。這樣的用戶的自主性提高很多校坑,比如用戶可以給APP賦予攝像的權限拣技,但是可以拒絕記錄設備位置的權限,就是怕位置信息上傳等等耍目。
Android6.0 權限分類
權限分為了正常權限和危險權限膏斤。
正常權限涵蓋應用需要訪問其沙盒外部數(shù)據(jù)或資源,但對用戶隱私或其他應用操作風險很小的區(qū)域邪驮。例如莫辨,設置時區(qū)的權限就是正常權限。如果應用聲明其需要正常權限毅访,系統(tǒng)會自動向應用授予該權限沮榜。如需當前正常權限的完整列表,請參閱正常權限喻粹。
危險權限涵蓋應用需要涉及用戶隱私信息的數(shù)據(jù)或資源蟆融,或者可能對用戶存儲的數(shù)據(jù)或其他應用的操作產(chǎn)生影響的區(qū)域。**例如守呜,能夠讀取用戶的聯(lián)系人屬于危險權限型酥。如果應用聲明其需要危險權限,則用戶必須明確向應用授予該權限查乒。正常權限有很多個弥喉,現(xiàn)在著重介紹一下危險權限。
危險權限和權限組
所有危險的 Android 系統(tǒng)權限都屬于權限組侣颂。如果設備運行的是 Android 6.0(API 級別 23)档桃,并且應用的 targetSdkVersion
是 23 或更高版本,則當用戶請求危險權限時系統(tǒng)會發(fā)生以下行為:
如果應用請求其清單中列出的危險權限憔晒,而應用目前在權限組中沒有任何權限藻肄,則系統(tǒng)會向用戶顯示一個對話框,描述應用要訪問的權限組拒担。對話框不描述該組內(nèi)的具體權限嘹屯。例如,如果應用請求 READ_CONTACTS
權限从撼,系統(tǒng)對話框只說明該應用需要訪問設備的聯(lián)系信息州弟。如果用戶批準钧栖,系統(tǒng)將向應用授予其請求的權限。
如果應用請求其清單中列出的危險權限婆翔,而應用在同一權限組中已有另一項危險權限拯杠,則系統(tǒng)會立即授予該權限,而無需與用戶進行任何交互啃奴。例如潭陪,如果某應用已經(jīng)請求并且被授予了 READ_CONTACTS
權限,然后它又請求 WRITE_CONTACTS
最蕾,系統(tǒng)將立即授予該權限依溯。
任何權限都可屬于一個權限組,包括正常權限和應用定義的權限瘟则。但權限組僅當權限危險時才影響用戶體驗黎炉。可以忽略正常權限的權限組醋拧。
如果設備運行的是 Android 5.1(API 級別 22)或更低版本慷嗜,并且應用的 targetSdkVersion
是 22 或更低版本,則系統(tǒng)會在安裝時要求用戶授予權限丹壕。再次強調(diào)洪添,系統(tǒng)只告訴用戶應用需要的權限組,而不告知具體權限雀费。
危險權限和權限組,如下圖:
定義和實施權限
要實施您自己的權限干奢,必須先使用一個或多個 <permission>
元素在 AndroidManifest.xml
中聲明它們。
基于6.0系統(tǒng)的開發(fā)的程序盏袄, 在打開頁面的時候忿峻,必須要考慮這個頁面是否用到需要授權的權限,頁面檢測是否已經(jīng)授權過了沒
實現(xiàn)方式:
第一步:檢測權限
// Assume thisActivity is the current activity
int permissionCheck = ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.WRITE_CALENDAR);
第二步:請求權限
// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
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.
ActivityCompat.requestPermissions(thisActivity,
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.
}
}
請求要使用的權限:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_PHONE_STATE},2);
}else {
startActivity(new Intent(this,MainActivity.class));
finish();
}
第三步:處理權限請求結(jié)果
/**
*動態(tài)權限申請后系統(tǒng)的回調(diào)方法
*/
@Override
public 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;
}
// other 'case' lines to check for other
// permissions this app might request
}
}
第四步:要注意這個方法辕羽,用戶允許或拒絕返回值的類型
/**
* 用戶第一次拒絕后逛尚,下一次,返回true刁愿,應該提示用戶為什么需要這個權限绰寞,添加說明
* 用戶第二次請求權限時,用戶拒絕了铣口,并選擇了不再提醒滤钱,返回false
* 設備的策略禁止當前應用獲取這個權限的授權,返回false
* 注意:第二次請求權限時候才有選項“不再提醒”脑题,如果用戶一直拒絕件缸,但沒有選擇不再提醒,下次請求權限時候叔遂,
* 會繼續(xù)有不再提醒的權限
*/
@Override
public boolean shouldShowRequestPermissionRationale(String permission) {
return super.shouldShowRequestPermissionRationale(permission);
}
以上就是Google官方的權限申請方法他炊,有錯請輕噴