在鸿蒙原生开发中,我们normal级别的证书能够使用的权限分为系统授权权限和用户授权权限
其中系统授权权限只需要在模块的module.json5中requestPermissions中添加name就可以了,不需要reason等信息描述,但用户授权就需要reason和使用方式,同时在使用时还需要向用户弹框申请;下面时定位权限和网络权限的申请
“requestPermissions”: [
{ “name”: “ohos.permission.LOCATION”,
“reason”: “KaTeX parse error: Expected 'EOF', got '}' at position 130: …lways"
}
}̲,
{ "name": "…string:permissionsReason”,
“usedScene”: {
“abilities”: [
“EntryAbility”
],
“when”:“always”
}
},
{
“name”: “ohos.permission.INTERNET”,
}
]
无论是用户授权的权限还是系统授权的权限,我们再使用相应api接口时,都需要检查以下是否申请了权限,不然有异常的
export async function checkPermissionGrant(permission: Permissions): Promise<abilityAccessCtrl.GrantStatus> {
return new Promise(async (resolve, reject) => {
let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
let grantStatus: abilityAccessCtrl.GrantStatus = abilityAccessCtrl.GrantStatus.PERMISSION_DENIED;
// 获取应用程序的accessTokenID
let tokenId: number = 0;
try {
let bundleInfo: bundleManager.BundleInfo = await bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);
let appInfo: bundleManager.ApplicationInfo = bundleInfo.appInfo;
tokenId = appInfo.accessTokenId;
} catch (error) {
const err: BusinessError = error as BusinessError;
CSLogger.info(TAG, `Failed to get bundle info for self. Code is ${err.code}, message is ${err.message}`);
}
// 校验应用是否被授予权限
try {
grantStatus = await atManager.checkAccessToken(tokenId, permission);
} catch (error) {
const err: BusinessError = error as BusinessError;
CSLogger.info(TAG, `Failed to check access token. Code is ${err.code}, message is ${err.message}`);
}
resolve(grantStatus);
});
}
export async function checkPermissions(permissions: Permissions, callback?: Callback): Promise {
return new Promise(async (resolve, reject) => {
// 获取权限状态
checkPermissionGrant(permissions).then((grantStatus: abilityAccessCtrl.GrantStatus) => {
let isGrantStatus: boolean = (grantStatus === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED);
if (!isGrantStatus) {
// 申请权限
CSLogger.info(TAG, ${permissions} Permission false
);
resolve(false);
} else {
// 已经授权,可以继续访问目标操作
CSLogger.info(TAG, ${permissions} Permission true
);
resolve(true);
}
})
});
}
检查完权限后,如果是用户授权的权限还需要用户弹框申请
export function reqPermissionsFromUser(permissions: Array, context: common.UIAbilityContext): Promise {
return new Promise(async (resolve, reject) => {
let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
// requestPermissionsFromUser会判断权限的授权状态来决定是否唤起弹窗
await atManager.requestPermissionsFromUser(context, permissions).then((data) => {
CSLogger.info(TAG, requestPermissionsFromUser data:${JSON.stringify(data)}
);
let grantStatus: Array<number> = data.authResults;
let length: number = grantStatus.length;
for (let i = 0; i < length; i++) {
if (grantStatus[i] === 0) {
// 用户授权,可以继续访问目标操作
CSLogger.info(TAG, `LOCATION req true, APPROXIMATELY_LOCATION req true`);
resolve(0);
} else {
// 用户拒绝授权,提示用户必须授权才能访问当前页面的功能,并引导用户到系统设置中打开相应的权限
CSLogger.info(TAG, `请到系统应用“设置”中打开相应的权限。路径:设置 > 隐私 > 权限管理 > 应用 > 目标应用`);
let err: BusinessError = {
message: `用户拒绝授权`,
code: 401,
name: `用户拒绝授权`
}
reject(err);
return;
}
}
}).catch((err: BusinessError) => {
CSLogger.info(TAG, `Failed to request permissions from user. Code is ${err.code}, message is ${err.message}`);
reject(err);
})
});
}
----------------- end ---------------
后面会继续补充不足之处。