鸿蒙开发过程中可用于请求的权限一共有两种:normal和system_basic。以下内容摘自官网:
normal权限
normal 权限允许应用访问超出默认规则外的普通系统资源。这些系统资源的开放(包括数据和功能)对用户隐私以及其他应用带来的风险很小。
该类型的权限仅向APL等级为normal及以上的应用开放。
system_basic权限
system_basic权限允许应用访问操作系统基础服务相关的资源。这部分系统基础服务属于系统提供或者预置的基础功能,比如系统设置、身份认证等。这些系统资源的开放对用户隐私以及其他应用带来的风险较大。
该类型的权限仅向APL等级为system_basic及以上的应用开放。
system_core权限
system_core权限涉及到开放操作系统核心资源的访问操作。这部分系统资源是系统最核心的底层服务,如果遭受破坏,操作系统将无法正常运行。
鉴于该类型权限对系统的影响程度非常大,目前暂不向任何三方应用开放。
以用户的MICROPHONE麦克风权限为例
我们在使用麦克风之前需要先查看用户权限,然后,如果没有开启需要跳转系统设置页面,引导用户开启权限。
import abilityAccessCtrl, { Permissions } from '@ohos.abilityAccessCtrl';
import bundleManager from '@ohos.bundle.bundleManager';
import common from '@ohos.app.ability.common';
@Entry
@Component
struct PermissionTest {
build() {
Column() {
Text('check permission')
.width(200)
.height(200)
.backgroundColor(Color.Orange)
.onClick(() => {
//检测权限状态
checkPermissions()
})
}
.backgroundColor(Color.Red)
.width('100%')
.height('100%')
}
}
/*
* 获取accessToken
* */
async function checkAccessToken(permission: Permissions): Promise<abilityAccessCtrl.GrantStatus> {
let atManager = abilityAccessCtrl.createAtManager()
let grantStatus :abilityAccessCtrl.GrantStatus
//获取accessTkenID
let tokenId: number
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 (err) {
console.log('get BundleInfo For self failed '+err.code + 'message='+err.message)
}
//检验是否授权
try {
grantStatus = await atManager.checkAccessToken(tokenId,permission)
} catch (err) {
console.log('checkAccessToken failed'+err.code + 'message='+err.message)
}
return grantStatus
}
/*
* 检查权限状态
* */
async function checkPermissions():Promise<void> {
const permissions: Array<Permissions> = ['ohos.permission.MICROPHONE']
let grantStatus: abilityAccessCtrl.GrantStatus = await checkAccessToken(permissions[0])
if (grantStatus === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
console.log('permission has requeired')
} else {
console.log('need request permission')
//请求权限
requestPermission()
}
}
/*
* 请求权限
* */
function requestPermission() {
let context = getContext(this) as common.UIAbilityContext
let atManger = abilityAccessCtrl.createAtManager()
let permissions: Array<Permissions> = ['ohos.permission.MICROPHONE']
atManger.requestPermissionsFromUser(context,permissions).then((data) => {
let grantStatus: Array<number> = data.authResults
let grantPermissions: Array<string> = data.permissions
let length: number = grantStatus.length
console.log('user permissoned length' + JSON.stringify(grantPermissions)+length)
for(let i = 0; i<length; i++) {
if (grantStatus[i] === 0) {
console.log('user has agreed permissoned')
} else {
console.log('user has disagree permissoned')
openPermissionSettings()
return
}
}
}).catch((err) =>{
console.log('requestPermissionFromUserfailed'+err.code + 'message='+err.message)
})
}
/*
* 跳转到权限设置页面
* */
function openPermissionSettings() {
let context = getContext(this) as common.UIAbilityContext
let wantInfo = {
action: 'action.settings.app.info',
parameters: {
settingsParamBundleName: 'com.example.myapplication'
}
}
context.startAbility(wantInfo).then(() => {
console.log('open setting page')
}).catch((err) => {
console.log('open setting page failed')
})
}
1、需要在module.json5文件中配置权限申请
{
'name': 'ohos.permission.MICROPHONE',
'usedScene' : {
"when": "inuse"
}
}
2、如果需要引导跳转系统的设置页面,注意bundleName要正确,否则不跳转