鸿蒙开发之用户隐私权限申请

一、简介

鸿蒙开发过程中可用于请求的权限一共有两种: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要正确,否则不跳转

相关推荐

  1. 鸿蒙开发用户隐私权限申请

    2023-12-18 09:38:02       37 阅读
  2. HarmonyOS —— 仿 XPermission 鸿蒙权限申请工具类

    2023-12-18 09:38:02       16 阅读
  3. 【Unity】动态申请权限

    2023-12-18 09:38:02       63 阅读
  4. Android权限申请

    2023-12-18 09:38:02       38 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-18 09:38:02       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-18 09:38:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-18 09:38:02       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-18 09:38:02       20 阅读

热门阅读

  1. AcWing802. 区间和思路

    2023-12-18 09:38:02       41 阅读
  2. ES6之对象新增的方法

    2023-12-18 09:38:02       40 阅读
  3. IDEA中如何使用Vue

    2023-12-18 09:38:02       39 阅读
  4. 全志V3s之NFS连接ubuntu22.04

    2023-12-18 09:38:02       42 阅读
  5. conda channel的镜像设置

    2023-12-18 09:38:02       33 阅读
  6. 力扣面试150题 | 15.三数之和

    2023-12-18 09:38:02       41 阅读