HarmonyOS-权限管理

打印 上一主题 下一主题

主题 859|帖子 859|积分 2587

一. 权限分类

 1. system_grant

system_grant 为体系授权,无需询问用户,常用的权限包罗网络请求、获取网络信息、获取wifi信息、获取传感器数据等。
  1. /* system_grant(系统授权)*/
  2.   static readonly INTERNET = 'ohos.permission.INTERNET' // 网路请求
  3.   static readonly GET_NETWORK_INFO = 'ohos.permission.GET_NETWORK_INFO' // 网络信息-读
  4.   static readonly GET_WIFI_INFO = 'ohos.permission.GET_WIFI_INFO' // WIFI信息-读
  5.   static readonly GYROSCOPE = 'ohos.permission.GYROSCOPE' // 陀螺仪传感器
  6.   static readonly ACCELEROMETER = 'ohos.permission.ACCELEROMETER' // 加速度传感器
复制代码
2. user_grant

user_grant 是必要用户授权的权限,常用的权限包罗定位、相机、麦克风、日历、文件读写等。
  1. /* user_grant(用户授权)*/
  2.   static readonly LOCATION = 'ohos.permission.LOCATION' // 定位-精确
  3.   static readonly APPROXIMATELY_LOCATION = 'ohos.permission.APPROXIMATELY_LOCATION' // 定位-模糊
  4.   static readonly LOCATION_IN_BACKGROUND = 'ohos.permission.LOCATION_IN_BACKGROUND' // 定位-后台
  5.   static readonly CAMERA = 'ohos.permission.CAMERA' // 相机
  6.   static readonly MICROPHONE = 'ohos.permission.MICROPHONE' // 麦克风
  7.   static readonly READ_CONTACTS = 'ohos.permission.READ_CONTACTS' // 通讯录-读
  8.   static readonly WRITE_CONTACTS = 'ohos.permission.WRITE_CONTACTS' // 通讯录-写
  9.   static readonly READ_CALENDAR = 'ohos.permission.READ_CALENDAR' // 日历-读
  10.   static readonly WRITE_CALENDAR = 'ohos.permission.WRITE_CALENDAR' // 日历-写
  11.   static readonly WRITE_IMAGEVIDEO = 'ohos.permission.WRITE_IMAGEVIDEO' // 图片视频-写
  12.   static readonly READ_IMAGEVIDEO = 'ohos.permission.READ_IMAGEVIDEO' // 图片视频-读
  13.   static readonly MEDIA_LOCATION = 'ohos.permission.MEDIA_LOCATION' // 多媒体-本地
  14.   static readonly WRITE_AUDIO = 'ohos.permission.WRITE_AUDIO' // 音频-写
  15.   static readonly READ_AUDIO = 'ohos.permission.READ_AUDIO' // 音频-读
  16.   static readonly READ_MEDIA = 'ohos.permission.READ_MEDIA' // 文件-读
  17.   static readonly WRITE_MEDIA = 'ohos.permission.WRITE_MEDIA' // 文件-写
  18.   static readonly APP_TRACKING_CONSENT = 'ohos.permission.APP_TRACKING_CONSENT' // 广告标识符
  19.   static readonly DISTRIBUTED_DATASYNC = 'ohos.permission.DISTRIBUTED_DATASYNC' // 多设备协同
  20.   static readonly ACCESS_BLUETOOTH = 'ohos.permission.ACCESS_BLUETOOTH' // 使用蓝牙能力
  21.   static readonly READ_PASTEBOARD = 'ohos.permission.READ_PASTEBOARD' // 剪贴板
  22.   static readonly READ_HEALTH_DATA = 'ohos.permission.READ_HEALTH_DATA' // 健康数据
  23.   static readonly ACTIVITY_MOTION = 'ohos.permission.ACTIVITY_MOTION' // 健身运动
复制代码
二. 权限声明 

1. system_grant

在应用 entry 模块的 module.json5 中添加权限声明。
  1. "requestPermissions": [
  2.   {
  3.     "name": "ohos.permission.INTERNET"
  4.   }, {
  5.     "name": "ohos.permission.GET_NETWORK_INFO"
  6.   }, {
  7.     "name": "ohos.permission.GET_WIFI_INFO"
  8.   }
  9. ]
复制代码
 2. user_grant

在应用 entry 模块的 module.json5 中添加权限声明。
  1. "requestPermissions": [
  2.   {
  3.     "name": "ohos.permission.LOCATION",
  4.     "reason": "$string:PERMISSION_LOCATION",
  5.     "usedScene": {
  6.       "abilities": [
  7.         "EntryAbility"
  8.       ],
  9.       "when":"inuse"
  10.      }
  11.   },
  12.   {
  13.     "name": "ohos.permission.APP_TRACKING_CONSENT",
  14.     "reason": "$string:PERMISSION_TRACKING_CONSENT",
  15.     "usedScene": {
  16.       "abilities": [
  17.         "EntryAbility"
  18.       ],
  19.       "when":"inuse"
  20.      }
  21.   }
  22. ]
复制代码
三. 权限应用 

1. system_grant

使用该类权限不必要弹窗让用户授权,只必要判断一下该权限在应用中是否声明。
  1. import { abilityAccessCtrl, bundleManager, PermissionRequestResult, Permissions, Want } from '@kit.AbilityKit';
  2. export class PermissionManager {
  3.   async checkPermissions(): void {
  4.     const bundleInfo: bundleManager.BundleInfo = await bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
  5.     const tokenId = bundleInfo.appInfo.accessTokenId
  6.     const atManager = abilityAccessCtrl.createAtManager()
  7.     const state = atManager.checkAccessTokenSync(tokenId, 'ohos.permission.INTERNET')
  8.     if (state === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
  9.       console.log('网络请求可用')
  10.     } else {
  11.       console.log('网络请求不可用')
  12.     }
  13.   }
  14. }
复制代码
2. user_grant

使用该类权限必要先判断用户是否授权,先由用户授权之后再使用该类权限相干的本领。
  1. import { abilityAccessCtrl, bundleManager, PermissionRequestResult, Permissions, common } from '@kit.AbilityKit';
  2. export class PermissionManager {
  3.   async checkPermissions(): Promise<void> {
  4.     const bundleInfo: bundleManager.BundleInfo = await bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
  5.     const tokenId = bundleInfo.appInfo.accessTokenId
  6.     const atManager = abilityAccessCtrl.createAtManager()
  7.     const state = atManager.checkAccessTokenSync(tokenId, 'ohos.permission.LOCATION')
  8.     if (state === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
  9.       console.log('定位权限已开启')
  10.     } else {
  11.       const context = AppStorage.get('ability_context') as common.UIAbilityContext // 在EntryAbility中存储AbilityContext
  12.       const result: PermissionRequestResult = await atManager.requestPermissionsFromUser(context, ['ohos.permission.LOCATION', 'ohos.permission.APPROXIMATELY_LOCATION'])
  13.       const authResults: Array<number> = result.authResults
  14.       const grantStatus: boolean = (authResults[0] === 0)
  15.       if (grantStatus) {
  16.         console.log('定位权限已开启')
  17.       } else {
  18.         console.log('定位权限未开启')
  19.       }      
  20.     }
  21.   }
  22. }
复制代码
3. notification

推送关照的权限是基于 notificationMananger 服务实现,不同于 system_agent 和 user_agent。
  1. import notificationManager from '@ohos.notificationManager';
  2. export class PermissionManager {
  3.   async checkNotificationPermissions(): Promise<void> {
  4.     let grantStatus = await notificationManager.isNotificationEnabled()
  5.     if (!grantStatus) {
  6.       await notificationManager.requestEnableNotification()
  7.       grantStatus = await notificationManager.isNotificationEnabled()
  8.       if (!grantStatus) {
  9.         console.log('通知权限未开启')
  10.       } else {
  11.         console.log('通知权限已开启')
  12.       }
  13.     } else {
  14.         console.log('通知权限已开启')
  15.     }
  16.   }
  17. }
复制代码
4. 跳转到APP设置页

  1. import bundleManager from '@ohos.bundle.bundleManager';
  2. import { common, Want } from '@kit.AbilityKit';
  3. import { BusinessError } from '@kit.BasicServicesKit';
  4. export class PermissionManager {
  5.   async gotoSetting(): Promise<void> {
  6.     const bundleFlags = bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION
  7.     const bundleParam = bundleManager.getBundleInfoForSelfSync(bundleFlags)
  8.     const bundleId = bundleParam.name
  9.     let wantInfo: Want = {
  10.       bundleName: 'com.huawei.hmos.settings',
  11.       abilityName: 'com.huawei.hmos.settings.MainAbility',
  12.       uri: 'application_info_entry',
  13.       parameters: {
  14.         pushParams: bundleId
  15.       }
  16.     }
  17.     const context = AppStorage.get('ability_context') as common.UIAbilityContext // 在EntryAbility中存储AbilityContext
  18.     context.startAbility(wantInfo).catch((error: BusinessError) => {
  19.       console.error(`startAbility-error: ${JSON.stringify(error)}`)
  20.     })
  21.   }
  22. }
复制代码
源码参考: harmonyos-permission

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

篮之新喜

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表