权限相关开发,在HarmonyOS开发文档里面,是放在安全这一章节,见官方文档,如下图
权限申请,分为一般权限申请和动态权限申请,我们下面分别来介绍
一般权限申请
开发者需要在config.json文件中的“reqPermissions”字段中声明所需要的权限。config.json所在位置如下图
image-20211012065409164.png
找到config.json文件,然后在里面增加“reqPermissions”字段;如下图
image-20211012071641144.png
“reqPermissions”字段对应的value值,是一个数组, 里面可以多个对象, 每一个对象描述了一个权限.
动态权限申请
-
在config.json文件中声明所需要的权限。
-
使用ohos.app.Context.verifySelfPermission接口查询应用是否已被授予该权限。
- 如果已被授予权限,可以结束权限申请流程。
- 如果未被授予权限,继续执行下一步。
-
使用canRequestPermission查询是否可动态申请。
- 如果不可动态申请,说明已被用户或系统永久禁止授权,可以结束权限申请流程。
- 如果可动态申请,使用requestPermissionFromUser动态申请权限。
if (verifySelfPermission("ohos.permission.CAMERA") != IBundleManager.PERMISSION_GRANTED) {
// 应用未被授予权限
if (canRequestPermission("ohos.permission.CAMERA")) {
// 是否可以申请弹框授权(首次申请或者用户未选择禁止且不再提示)
requestPermissionsFromUser(
new String[] { "ohos.permission.CAMERA" } , MY_PERMISSIONS_REQUEST_CAMERA);
} else {
// 显示应用需要权限的理由,提示用户进入设置授权
}
} else {
// 权限已被授予
}
- 通过重写ohos.aafwk.ability.Ability的回调函数onRequestPermissionsFromUserResult接收授予结果,但这个方法一定要写Ability里面,才能接收授予结果, 如果写在AbilitySlice里面,是收不到结果的。
@Override
public void onRequestPermissionsFromUserResult (int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_CAMERA: {
// 匹配requestPermissions的requestCode
if (grantResults.length > 0
&& grantResults[0] == IBundleManager.PERMISSION_GRANTED) {
// 权限被授予
// 注意:因时间差导致接口权限检查时有无权限,所以对那些因无权限而抛异常的接口进行异常捕获处理
} else {
// 权限被拒绝
}
return;
}
}
}
具体来看我们的实例,封装一个方法,在onStart()中调用 一下,
private void requestPermissions() {
String[] permissions = {SystemPermission.CAMERA,SystemPermission.LOCATION};
ArrayList<String> needCheckPermissions = new ArrayList<>();
for (String permission : permissions) {
if (verifySelfPermission(permission) != IBundleManager.PERMISSION_GRANTED && canRequestPermission(permission)) {
needCheckPermissions.add(permission);
}
}
String[] needPermissions = needCheckPermissions.toArray(new String[0]);
requestPermissionsFromUser(needPermissions, 100);
}
image-20211012071149507.png
运行的效果如下:
33.gif
ability里面的代码如下
@Override
public void onRequestPermissionsFromUserResult (int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case 100: {
// 匹配requestPermissions的requestCode
if (grantResults.length > 0
&& grantResults[0] == IBundleManager.PERMISSION_GRANTED) {
// 权限被授予
// 注意:因时间差导致接口权限检查时有无权限,所以对那些因无权限而抛异常的接口进行异常捕获处理
Utils.log("权限被授予");
} else {
Utils.log(String.valueOf(grantResults[0]));
// 权限被拒绝
Utils.log("权限被拒绝");
}
return;
}
}
}
结尾
看到这里的小伙们,或者觉得文章对你有点帮助的话,请点赞加关注喽,您的反馈就是我们前进的动力。后续会分享更多关于鸿蒙开发(HarmonyOS)的干货。谢谢~~
网友评论