转载自获取多个动态权限
android6.0及以上版本区分了:普通权限和危险权限。普通权限可以直接在清单文件里面申请,
危险权限不仅要在清单文件里面申请,还要在代码里面动态获取。如果你仅仅动态获取了,
没有在清单文件里面申明,在你返回的回调方法里面会被拒绝给权限。
我这里的思路就是,先判断版本号是否大于android6.0,
然后判断你的操作需要的权限哪些是没有给的,没有给的就去动态获取,给了的就不用
接着,弹出对话框提示用户,需要这些权限的原因,让用户去选择,是否给该权限
最后,系统也会弹出一个对话框,让用户去确认,是否给权限。
注意:如果这里,我们自己的对话框,用户选择了是,然后没有弹系统的对话框让用户去选择,
就直接被拒绝了,那就是前面我说过的,在清单文件里面没有注册该权限。
这里,我以拍照为例。调用方式如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
String[] permission = {Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE};//需要的权限
String title = "相机权限不可用";
String content = "由于上传照片需要获取相机相关权限,获取相册功能;\n否则,您将无法正常使用相机功能";
initPermission(permission,title,content);
- 1
- 2
- 3
- 4
1、首先:判断版本号是否大于android6.0,for循环判断哪些需要获取的权限
- 1
- 2
/**
* 初始化用户权限
* @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);
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
2、弹出对话框,让用户选择是否给权限
- 1
- 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();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
3、提交权限的请求
- 1
- 2
// 开始提交请求权限
private void startRequestPermission(List<String> permissionList) {
if (!permissionList.isEmpty()) {//不为空就进行授权申请
String[] permissions = permissionList.toArray(new String[permissionList.size()]);
ActivityCompat.requestPermissions(this, permissions, permissionsRequestCode);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
4、回调方法
- 1
- 2
// 用户权限 申请 的回调方法
@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;
}
}
}
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
这个回调里面的grantResults,就是该权限返回的code码。我这里是一次获取多个权限,
用的for循环,如果你只用申请一个,就不需要for循环,只用比较一次即可。
demo就不用上传了,把这里的代码拷贝过去就可以直接用了。放到你的基类里面。
需要的时候调用就可以了。
- 1
- 2
- 3
- 4
- 5
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/markdown_views-ea0013b516.css">
</div>
android6.0及以上版本区分了:普通权限和危险权限。普通权限可以直接在清单文件里面申请,
危险权限不仅要在清单文件里面申请,还要在代码里面动态获取。如果你仅仅动态获取了,
没有在清单文件里面申明,在你返回的回调方法里面会被拒绝给权限。
我这里的思路就是,先判断版本号是否大于android6.0,
然后判断你的操作需要的权限哪些是没有给的,没有给的就去动态获取,给了的就不用
接着,弹出对话框提示用户,需要这些权限的原因,让用户去选择,是否给该权限
最后,系统也会弹出一个对话框,让用户去确认,是否给权限。
注意:如果这里,我们自己的对话框,用户选择了是,然后没有弹系统的对话框让用户去选择,
就直接被拒绝了,那就是前面我说过的,在清单文件里面没有注册该权限。
这里,我以拍照为例。调用方式如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
String[] permission = {Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE};//需要的权限
String title = "相机权限不可用";
String content = "由于上传照片需要获取相机相关权限,获取相册功能;\n否则,您将无法正常使用相机功能";
initPermission(permission,title,content);
- 1
- 2
- 3
- 4
1、首先:判断版本号是否大于android6.0,for循环判断哪些需要获取的权限
- 1
- 2
/**
* 初始化用户权限
* @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);
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
2、弹出对话框,让用户选择是否给权限
- 1
- 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();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
3、提交权限的请求
- 1
- 2
// 开始提交请求权限
private void startRequestPermission(List<String> permissionList) {
if (!permissionList.isEmpty()) {//不为空就进行授权申请
String[] permissions = permissionList.toArray(new String[permissionList.size()]);
ActivityCompat.requestPermissions(this, permissions, permissionsRequestCode);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
4、回调方法
- 1
- 2
// 用户权限 申请 的回调方法
@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;
}
}
}
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
这个回调里面的grantResults,就是该权限返回的code码。我这里是一次获取多个权限,
用的for循环,如果你只用申请一个,就不需要for循环,只用比较一次即可。
demo就不用上传了,把这里的代码拷贝过去就可以直接用了。放到你的基类里面。
需要的时候调用就可以了。
- 1
- 2
- 3
- 4
- 5
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/markdown_views-ea0013b516.css">
</div>