本文章基于SDK(API Version 5)进行开发
权限分类
权限的grantMode是system_grant(非敏感权限),则权限会在当应用安装的时候被自动授予。
权限的grantMode是user_grant(敏感权限),则必须经用户手动授权(用户在弹框中授权或进入权限设置界面授权)才可使用。用户会看到reason字段中填写的理由,来帮助用户决定是否给予授权。
权限申请
开发者需要在config.json文件中的“reqPermissions”字段中声明所需要的权限。
{
"module": {
"reqPermissions": [
{
//必须,填写需要使用的权限名称。
"name":"ohos.permission.CAMERA",
//可选,当申请的权限为user_grant权限时此字段必填。描述申请权限的原因,目前reason参数对应的功能没有实现,但是华为建议填写
"reason":"$string:permreason_camera",
//可选,当申请的权限为user_grant权限时此字段必填。描述权限使用的场景和时机。场景类型有:ability、when(调用时机)。可配置多个ability。目前usedScene参数对应的功能没有实现,但是华为建议填写
"usedScene":
{
"ability": ["com.mycamera.Ability","com.mycamera.AbilityBackground"],
"when":"always"
}
},{
...
}
]
}
}
请求权限
if (verifySelfPermission("ohos.permission.CAMERA") != IBundleManager.PERMISSION_GRANTED) {
// 应用未被授予权限
if (canRequestPermission("ohos.permission.CAMERA")) {
// 是否可以申请弹框授权(首次申请或者用户未选择禁止且不再提示)
requestPermissionsFromUser(new String[] {"ohos.permission.CAMERA" } ,1111);
}else {
//上次申请权限时用户选择“禁止后不再提示”
// 显示应用需要权限的理由,提示用户进入设置授权
}
}else {
// 权限已被授予
}
//在Ability中的onRequestPermissionsFromUserResult权限申请进行回调
@Override
public void onRequestPermissionsFromUserResult(int requestCode, String[] permissions,int[] grantResults) {
switch (requestCode) {
case 1111: {
// 匹配requestPermissions的requestCode
if (grantResults.length >0
&& grantResults[0] == IBundleManager.PERMISSION_GRANTED) {
// 权限被授予
// 注意:因时间差导致接口权限检查时有无权限,所以对那些因无权限而抛异常的接口进行异常捕获处理
}else {
// 权限被拒绝
}
}
}
}
网友评论