從 Android 6.0(API 級別 23)開始系統出來的時候,google對android權限管理機制做了一些修改。部分權限改成運行時申請了,而不是像之前權限全部是在安裝的時候就全部給列出來了,用戶安裝成功后申請的那些權限就給全部同意了,后期使用的時候就不需要去關系權限的問題了。
正常權限
- 正常權限不會直接給用戶隱私權帶來風險。如果您的應用在其清單中列出了正常權限,系統將自動授予該權限
危險權限
- 危險權限指那些可能涉及到用戶隱私的操作,在清單中聲明后,還需要用戶手動來授予是否此權限。
重點方法
checkSelfPermission(context,permission);
檢查權限是否存在
返回值 0=授予 -1=未授予requestPermissions(activity,permissions,requestCode)
請求權限, permissions[]允許接收一個權限組進行一次多個權限請求。shouldShowRequestPermissionRationale(context,permission);
判斷用戶是否勾選過不在提醒
返回值 拒絕過權限返回true 勾選了不提醒返回falseonRequestPermissionsResult()
操作權限后的返回結果
清單文件聲明權限
androidManifest中申請的權限,只是一個申明不代表擁有了權限。Android 5.1(API 級別 22)或更低版本,會在安裝時候申請權限項目,如果不同意應用將會無法安裝。
Android 6.0(API 級別 23)或更高版本,則運行時向用戶請求權限。用戶可隨時調用權限,因此應用在每次運行時均需檢查自身是否具備所需的權限。
<uses-permission android:name="android.permission.WRITE_CALENDAR"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
代碼
public static int MY_PERMISSIONS_REQUEST_READ_CONTACTS = 98;
private String[] mNecessaryPermissio = new String[]{Manifest.permission.RECORD_AUDIO, Manifest.permission.CAMERA};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//檢查權限
int permission = ContextCompat.checkSelfPermission(this, mNecessaryPermissio[1]);
if (PackageManager.PERMISSION_GRANTED != permission) {
//請求權限
ActivityCompat.requestPermissions(this, new String[]{mNecessaryPermissio[1]}, MY_PERMISSIONS_REQUEST_READ_CONTACTS);
if (!ActivityCompat.shouldShowRequestPermissionRationale(this, mNecessaryPermissio[1])) {
Log.i(TAG, "用戶勾選不在提醒,需要跳轉設置頁面授予權限!");
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (isPermissionGranted(this, permissions)) {
Log.i(TAG, "所有權限成功獲取!");
} else if (!shouldShowPermisionExplanation(this, permissions)) {
Log.i(TAG, "有權限被禁止請求,需要進入設置頁面!");
} else {
Log.i(TAG, "權限未獲取成功!");
}
}
//判斷一組權限是否有未授予的
public static boolean isPermissionGranted(Context context, String permissions[]) {
boolean granted = true;
for (String permission : permissions) {
granted = granted && (ActivityCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED);
}
return granted;
}
//判斷一組權限是否有未勾選拒絕
public static boolean shouldShowPermisionExplanation(Activity activity, String permissions[]) {
boolean shouldShowExplanation = false;
for (String permission : permissions) {
shouldShowExplanation |= ActivityCompat.shouldShowRequestPermissionRationale(activity, permission);
}
return shouldShowExplanation;
}
總結
把項目中需要用的動態權限可以放到一個權限數組里面,啟動應用的時候統一請求一下,如果用戶拒絕了某項權限,在操作相應權限的地方也需要在請求一次權限。如果有用戶勾選了不在提醒建議彈出一個自定義彈出告知用戶為什么需要用此權限,然后跳轉到設置頁面打開權限。