目錄
一、manifest 注冊權限
二、代碼動態申請權限
三、對勾選了“不在詢問”的處理
一、manifest 注冊權限
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="xxxxxxx">
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.CAMERA"/>
................................
二、代碼動態申請權限
多個權限的處理
//需要授權的權限陣列
private String[] permissions = {
Manifest.permission.RECORD_AUDIO
, Manifest.permission.READ_EXTERNAL_STORAGE
, Manifest.permission.WRITE_EXTERNAL_STORAGE
, Manifest.permission.CAMERA
};
//未被授權的權限集合
private List<String> refusedList;
權限判斷
//當前設備的系統版本>=23
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
for (String permission : permissions) {
if (ContextCompat.checkSelfPermission(getApplication(), permission)
== PackageManager.PERMISSION_DENIED) {
if (refusedList == null)
refusedList = new ArrayList<>();
refusedList.add(permission);
}
}
//當前設備系統版本<23 直接初始化
} else {
init();
}
//沒有被拒絕授權的權限 直接初始化
if (refusedList == null || refusedList.size() == 0) {
init();
} else {
//請求權限
ActivityCompat.requestPermissions(this, refusedList.toArray(new String[0]), REQUEST_CODE);
}
權限申請的結果處理
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull @NotNull String[] permissions, @NonNull @NotNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
//清空
refusedList.clear();
if (requestCode == REQUEST_CODE) {
for (int i = 0; i < grantResults.length; i++) {
if (grantResults[i] == PackageManager.PERMISSION_DENIED) {
refusedList.add(permissions[i]);
}
}
}
if (refusedList.size() == 0)
init();
else
ActivityCompat.requestPermissions(this, refusedList.toArray(new String[0]), REQUEST_CODE);
}
三、對勾選了“不在詢問”的處理
如果用戶勾選了“不在詢問”的處理
refusedList.clear();
//首次授權判斷
if (requestCode == REQUEST_CODE) {
for (int i = 0; i < grantResults.length; i++) {
if (grantResults[i] == PackageManager.PERMISSION_DENIED) {
refusedList.add(permissions[i]);
}
}
}
//再次授權判斷
if (requestCode == REQUEST_CODE_02) {
for (int i = 0; i < grantResults.length; i++) {
if (grantResults[i] == PackageManager.PERMISSION_DENIED) {
refusedList.add(permissions[i]);
if (!ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[i])) {
AlertDialog dialog;
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("有必須權限未被授權,這將影響APP的使用,請手動授權!");
builder.setPositiveButton("確認", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
//跳轉到應用手動授權
Intent intent = new Intent();
intent.setAction(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.parse("package:" + MainActivity.this.getPackageName()));
startActivity(intent);
}
});
builder.setNegativeButton("退出", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
System.exit(0);
}
});
dialog = builder.create();
dialog.setCancelable(false);
dialog.show();
return;
}
}
}
}
if (refusedList.size() == 0) {
init();
} else {
ActivityCompat.requestPermissions(this, refusedList.toArray(new String[0]), REQUEST_CODE_02);
}
}
注意:
houldShowRequestPermissionRationale方法回傳值分幾種情況:
- 第一次請求該權限,回傳false,
- 請求過該權限并被用戶拒絕,回傳true,
- 請求過該權限,但用戶拒絕的時候勾選不再提醒,回傳false,
上面的代碼只是例子是存在bug的,僅供參考!
如果感覺對您有意義,就給博主一些鼓勵(點贊、關注、收藏),如果有錯誤歡迎大家評論提出,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/356128.html
標籤:其他
