鸿蒙应用权限控制与位置服务(Location Kit)

11_11日学习笔记

一、应用权限管控

概述:

Ability Kit提供了一种允许应用访问系统资源(如:通讯录等)和系统能力(如:访问摄像头、麦克风等)的通用权限访问方式,来保护系统数据(包括用户个人数据)或功能,避免它们被不当或恶意使用。

快影app后台播放!

鸿蒙系统为每个应用提供一个tokenid(令牌),作为 应用的唯一标识。

应用权限保护的对象可以分为数据和功能:

数据 包括个人数据(如照片、通讯录、日历、位置等)、设备数据(如设备标识、相机、麦克风等)。

功能 包括设备功能(如访问摄像头/麦克风、打电话、联网等)、应用功能(如弹出悬浮窗、创建快捷方式等)。

系统采用**TokenID**作为应用的唯一标识。权限管理服务通过应用的TokenID来管理应用的AT(Access Token)信息,包括应用身份标识APP ID、子用户ID、应用分身索引信息、应用APL、应用权限授权状态等。在资源使用时,系统将通过TokenID作为唯一身份标识映射获取对应应用的权限授权状态信息,并依此进行鉴权,从而管控应用的资源访问行为。

系统支持多用户特性和应用分身特性,同一个应用在不同的子用户下和不同的应用分身下会有各自的AT,这些AT的TokenID也是不同的。

授权方式分类(面试常问):

1、system_grant(系统授权)

(module.json5)申请权限(申请简单,只需要在module.json5中申请)

应用被允许访问的数据不会涉及到用户或设备的敏感信息

(如果在应用中申请了system_grant权限,那么系统会在用户安装应用时,自动把相应权限授予给应用。)

2、user_grant(用户授权)

(module.json5)申请权限 + 运行时弹窗请求授权(申请复杂,必须用户同意)

涉及用户敏感信息

该类型权限不仅需要①在安装包中申请权限,还需要在应用动态运行时,②通过发送弹窗的方式请求用户授权。

面试题:请问那些是用户授权的权限?那些是系统授权的权限?

系统授权权限:

ohos.permission.INTERNET 允许使用网络资源
ohos.permission.KEEP_BACKGROUND_RUNNING 允许Ability在后台持续运行
ohos.permission.USE_BLUETOOTH 允许应用查看蓝牙的配置
ohos.permission.PRINT 允许应用获取打印框架的能力
ohos.permission.ACCELEROMETER 允许应用读取加速度传感器的数据
ohos.permission.VIBRATE 允许应用控制马达振动

用户授权的权限:

ohos.permission.APP_TRACKING_CONSENT 允许应用读取开放匿名设备标识符
ohos.permission.CAMERA 允许应用使用相机
ohos.permission.DISTRIBUTED_DATASYNC 允许不同设备间的数据交换
ohos.permission.APPROXIMATELY_LOCATION 允许应用获取设备模糊位置信息
ohos.permission.LOCATION 允许应用获取设备位置信息
ohos.permission.WRITE_MEDIA 允许应用读写用户外部存储中的媒体文件信息

配置过程:

请求system_grant系统授权配置

配置文件授权:

1、首先需要在项目的配置文件(module.json5)中,申请系统授予权限:

请添加图片描述
请添加图片描述

请添加图片描述


    "requestPermissions": [ //      ①向系统申请  ‘系统授予权限’
      {
    
        "name": "ohos.permission.INTERNET" ,   //互联网访问权限(系统权限)
      },
      {
    
        "name": "ohos.permission.KEEP_BACKGROUND_RUNNING" //后台运行(系统权限),应用在后台可以继续运行
      }
    ], ```

(前应用模块向用户申请各种权限(系统授予+用户授予))

当应用申请user_grant权限时:

1、申请权限

① 在配置文件(module.json5)中,声明应用需要请求的权限。

请添加图片描述

请添加图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/4e47317452464e08814e2678734cdfd4.png#pic_center

"requestPermissions": [
  //②向用户申请  “用户授予权限”
  {
   
    "name": "ohos.permission.APPROXIMATELY_LOCATION",		 //模糊定位
    "reason": '$string:Location_Reason',		//申请当前权限的原因说明
    "usedScene": {
   												//申请的权限具体使用场景说明
      "when": "always",										//何时使用该权限!    inuse在使用中,always总是
      "abilities": ["EntryAbility"]					//哪些组件需要使用该权限
    }
  },
  {
   
    "name": "ohos.permission.LOCATION", //精准定位
    "reason": '$string:Location_Reason',
    "usedScene": {
   
      "abilities": ["EntryAbility"],
      "when": "always"
    }
  }
],

② 将应用中需要申请权限的目标对象与对应目标权限进行关联,让用户明确地知道,哪些操作需要用户向应用授予指定的权限。

2、 运行时弹窗请求授权

③ 运行应用时,在用户触发访问操作目标对象时应该调用接口,精准触发动态授权弹框。该接口的内部会检查当前用户是否已经授权应用所需的权限,如果当前用户尚未授予应用所需的权限,该接口会拉起动态授权弹框,向用户请求授权。

④ 检查用户的授权结果,确认用户已授权才可以进行下一步操作。
在这里插入图片描述

每次执行需要目标权限的操作时,应用都必须使用checkAccessToken()函数检查自己是否已经具有该权限每次访问受目标权限保护的接口之前,都需要使用requestPermissionsFromUser()接口请求相应的权限

页面现实时,弹出 “ 定位授权对话框

创建onpageShow()方法

//页面现实时,弹出 “ 定位授权对话框 ”
onPageShow() {
   
  
}

请添加图片描述

1、声明需要用户授权的权限列表 请添加图片描述
注意:如果想要精确定位,则必须先进行模糊定位

2、检查之前是否对这些权限授权过 请添加图片描述

3、如果之前从未授权过,则弹出“授权请求对话框” 请添加图片描述

完整代码:

请添加图片描述

import {
    Permissions } from '@ohos.privacyManager'
import {
    abilityAccessCtrl, bundleManager } from '@kit.AbilityKit'

@Entry
@Component
struct Index {
   

  //页面现实时,弹出 “ 定位授权对话框 ”
  async onPageShow() {
   
    // 1、声明需要用户授权的权限列表
    let list:Permissions[] = [
      "ohos.permission.APPROXIMATELY_LOCATION", //模糊定位
      "ohos.permission.LOCATION"                //精确定位 ---》用精确定位,必须要有模糊定位为前提!
    ]
    // 2、检查之前是否对这些权限进行过授权   TokenID => AccessManager => AccessToken => 过往的授权记录
    let bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)    //得到资源报信息
    let tokenID = bundleInfo.appInfo.accessTokenId //从资源包信息中获取  权限令牌编号

    let acsMgr = abilityAccessCtrl.createAtManager()    //AT表示AccessToken
    let grantStatus0 = acsMgr.checkAccessTokenSync(tokenID,list[0])   //检查访问令牌,返回值是授权状态
    let grantStatus1 = acsMgr.checkAccessTokenSync(tokenID,list[1])   //检查访问令牌,返回值是授权状态

    // 3、如果之前从未授权过,则弹出请求对话框
    // console.log('--授权状态:',grantStatus0)
    if (grantStatus0 === abilityAccessCtrl.GrantStatus.PERMISSION_DENIED) {
      //-1表示尚未授权过DENIED,0表示已经授权
      let result = await acsMgr.requestPermissionsFromUser(getContext()
对于如何安装和配置Location服务或组件的问题,这通常涉及到特定平台或者软件包的具体设置。以下是针对不同场景下的一般指导原则: ### 对于华为设备中的location source命令配置 - **确定需求** 定义需要配置的服务类型以及预期的行为。 - **查阅文档** 参考官方提供的`locationsource-S300, S500, S1700, S2700, S5700, S6700 V200R021C00, C01 命令参考`以了解具体版本支持的特性及限制。 - **进入系统视图** 登录到设备并通过CLI界面输入`system-view`切换至系统视图模式。 - **执行配置命令** ```shell location source { ip-address | interface-type interface-number } ``` - **保存配置** 使用`save`命令确保所做的更改被持久化存储。 - **验证配置** 发送测试数据包来确认新设定是否按预期工作。 ### 对于HarmonyOS应用开发中使用Location Kit的情况 - **准备环境** 设置好HarmonyOS SDK和其他必要的开发资源。 - **请求权限** 应用启动时应该检查是否有足够的位置权限;如果没有,则需通过API向用户提出申请。 - **集成Location Kit API** 根据官方指引将Location Kit整合进项目里,并实现所需功能逻辑。 - **处理回调响应** 编写代码段来接收来自系统的定位更新通知或其他交互事件的结果反馈。 请注意,具体的实施细节会依据所使用的操作系统、框架或者其他技术栈而有所不同。建议始终参照最新的官方手册和技术说明来进行准确的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白羊@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值