如果APP運行在Android 6.0或以上版本的手機,並且target sdk>=23,那麼在使用一些相對敏感的權限時,需要徵求用戶的許可。比如讀寫sdcard,攝像,聯繫人信息等。
android 6.0發佈幾個月之後,升級率很低,很少應用會使用sdk23編譯項目,如果要編譯,就必須瞭解request權限的一些事。
一,Android 6.0 運行時權限
Android 6.0不僅UI改進很多,體驗也不錯哦。仿照iOS權限做法,在原有的AndroidManifest.xml聲明權限的基礎上,新增了運行時權限動態檢測,以下權限都是dangerous permissions ,需要在運行時判斷:
1. 身體傳感器
2. 日曆 攝像頭
3. 通訊錄
4. 地理位置
5. 麥克風
6. 電話
7. 短信
8. 存儲空間
運行時權限處理
PS:targetSdkVersion小於23的應用默認授予了所申請的所有權限,所以如果你以前的APP設置的targetSdkVersion低於23,也能正常使用。等於或者大於23,則必須 request permission,否則會崩潰閃退。
二,聲明目標SDK版本
我們需要在build.gradle中聲明targetSdkVersion爲23.
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
applicationId "com.youapp"
minSdkVersion 14
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
三,檢查並request權限
我們需要在用到權限的地方,檢查是否已經擁有權限,比如讀寫外置SD卡的權限,我們在寫入之前檢查是否有權限,沒有則申請權限,for exsample:
private void requestContactPermission() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) {
//申請 WRITE_CONTACTS 權限
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_CONTACTS},
REQUEST_CODE_WRITE_CONTACTS);
}
}
四,用戶許可與否的回調處理。
權限申請後,用戶選擇後,可能allow,可能deny。回調onRequestPermissionsResult方法, 該方法類似於onActivityResult。如果是fragment,最好是使用父fragment,但不是使用ActivityCompat。建議使用getParentFragment().requestPermissions方法。
兼容庫support-v4中的方法有:
ContextCompat.checkSelfPermission()
ActivityCompat.requestPermissions()
ActivityCompat.OnRequestPermissionsResultCallback
ActivityCompat.shouldShowRequestPermissionRationale()
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
handleGrantResults(requestCode,grantResults);
}
五,根據requestCode和grantResults(授權結果)做相應的處理。
private void handleGrantResults(int requestCode, int[] grantResults) {
if (requestCode == WRITE_EXTERNAL_STORAGE_REQUEST_CODE) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Permission Granted 獲得權限後執行xxx
} else {
// Permission Denied 拒絕後xx的操作。
}
}
}
六,用戶拒絕了怎麼處理?
如果用戶拒絕了一次,後面再申請,會出現不再提醒的選項,再次拒絕,你的app不作後續處理,就嗝屁了。功能肯定受限,沒法用了。 這時候怎麼辦呢?用戶的行爲我們不清楚,得預防一下。
我們檢測下是否拒絕了兩次或以上,DIY給個提示。比如申請寫聯繫人的權限。
private void handleContactPermission() {
if (Integer.parseInt(Build.VERSION.SDK)>=23) {
int hasWriteContactsPermission = checkSelfPermission(Manifest.permission.WRITE_CONTACTS);
if (hasWriteContactsPermission != PackageManager.PERMISSION_GRANTED) {
if (!shouldShowRequestPermissionRationale(Manifest.permission.WRITE_CONTACTS)) {
showMessageOKCancel("You need to allow access to Contacts",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
requestContactPermission();//確定後申請權限。
}
});
return;
}
requestContactPermission();//沒有權限的話,申請。
}
}
github已經有一些封裝好的permissionUtil,大家可以下載學習。不足之處,後續完善。
Dusan,291902259,杜工。
轉載而來,博主之原文:http://blog.csdn.net/dzsw0117/article/details/51212612