動態一次獲取多種android6.0以上的許可權
阿新 • • 發佈:2018-11-05
原文地址:https://blog.csdn.net/qq_27634797/article/details/76617334
android6.0及以上版本區分了:普通許可權和危險許可權。普通許可權可以直接在清單檔案裡面申請, 危險許可權不僅要在清單檔案裡面申請,還要在程式碼裡面動態獲取。如果你僅僅動態獲取了, 沒有在清單檔案裡面申明,在你返回的回撥方法裡面會被拒絕給許可權。 我這裡的思路就是,先判斷版本號是否大於android6.0, 然後判斷你的操作需要的許可權哪些是沒有給的,沒有給的就去動態獲取,給了的就不用 接著,彈出對話方塊提示使用者,需要這些許可權的原因,讓使用者去選擇,是否給該許可權 最後,系統也會彈出一個對話方塊,讓使用者去確認,是否給許可權。 注意:如果這裡,我們自己的對話方塊,使用者選擇了是,然後沒有彈系統的對話方塊讓使用者去選擇, 就直接被拒絕了,那就是前面我說過的,在清單檔案裡面沒有註冊該許可權。 這裡,我以拍照為例。呼叫方式如下:
String[] permission = {Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE};//需要的許可權
String title = "相機許可權不可用";
String content = "由於上傳照片需要獲取相機相關許可權,獲取相簿功能;\n否則,您將無法正常使用相機功能";
initPermission(permission,title,content);
1、首先:判斷版本號是否大於android6.0,for迴圈判斷哪些需要獲取的許可權
/**
* 初始化使用者許可權
* @param permissions 需要的許可權
* @param title 我們自己對話方塊的標題
* @param content 我們自己對話方塊的內容
*/
public void initPermission(String[] permissions, String title, String content) {
// 版本判斷。當手機系統大於 23 時,才有必要去判斷許可權是否獲取
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
List<String> permissionList = new ArrayList<>();
for (int i = 0; i < permissions.length; i++) {//for迴圈把需要授權的許可權都新增進來
if (ContextCompat.checkSelfPermission(context, permissions[i]) != PackageManager.PERMISSION_GRANTED) { //未授權就進行授權
permissionList.add(permissions[i]);
}
}
//如果permissionList是空的,說明沒有許可權需要授權,什麼都不做,該幹嘛幹嘛,否則就發起授權請求
if (!permissionList.isEmpty()) {
showDialogTipUserRequestPermission(permissionList, title, content);
}
}
}
2、彈出對話方塊,讓使用者選擇是否給許可權
// 提示使用者該請求許可權的彈出框
private void showDialogTipUserRequestPermission(final List<String> permissionList, String title, String content) {
new android.support.v7.app.AlertDialog.Builder(this)
.setTitle(title)
.setMessage(content)
.setPositiveButton("立即開啟", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
startRequestPermission(permissionList);
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
}).setCancelable(false).show();
}
3、提交許可權的請求
// 開始提交請求許可權
private void startRequestPermission(List<String> permissionList) {
if (!permissionList.isEmpty()) {//不為空就進行授權申請
String[] permissions = permissionList.toArray(new String[permissionList.size()]);
ActivityCompat.requestPermissions(this, permissions, permissionsRequestCode);
}
}
4、回撥方法
// 使用者許可權 申請 的回撥方法
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == permissionsRequestCode) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (grantResults.length > 0) {//安全寫法,如果小於0,肯定會出錯了
for (int i = 0; i < grantResults.length; i++) {
int grantResult = grantResults[i];
switch (grantResult){
case PackageManager.PERMISSION_GRANTED://同意授權0
break;
case PackageManager.PERMISSION_DENIED://拒絕授權-1
Utils.ShowToast(context,permissions[i]+"許可權獲取失敗");
finish();
break;
}
}
}
}
}
}
這個回撥裡面的grantResults,就是該許可權返回的code碼。我這裡是一次獲取多個許可權,
用的for迴圈,如果你只用申請一個,就不需要for迴圈,只用比較一次即可。
demo就不用上傳了,把這裡的程式碼拷貝過去就可以直接用了。放到你的基類裡面。
需要的時候呼叫就可以了。