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

11_11日学习笔记

文章目录

    • @[toc]
  • 一、应用权限管控
    • 授权方式分类:
      • 1、[system_grant(系统授权)](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/permissions-for-all-V5#system_grant系统授权权限列表)
      • 2、[user_grant(用户授权)](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/permissions-for-all-V5#user_grant用户授权权限列表)
    • 配置过程:
      • 系统授权配置
      • 当应用申请user_grant权限时,需要完成以下步骤:
  • 二、定位服务(Location Kit):
    • 1.一次性获取用户当前位置
      • 获取当前位置:
      • 在获取用户当前地理位置之后,进一步通过经纬度信息反编码出具体的地理位置信息。
    • 2.持续获取用户位置的改变

一、应用权限管控

概述:

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

快影app后台播放!

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

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

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

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

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

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

授权方式分类:

1、system_grant(系统授权)

(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允许应用读写用户外部存储中的媒体文件信息

配置过程:

系统授权配置

配置文件授权:

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

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

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

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

当应用申请user_grant权限时,需要完成以下步骤:

① 在配置文件(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"
    }
  }
],

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

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

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

每次执行需要目标权限的操作时,应用都必须使用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(),list)    //list表示两个权限 --> 权限列表 ---permissionList:permissions
      if (result.authResults[0] === 0) {    //授权结果,authResults[]两个权限
        console.log('---定位相关的两个权限通过了用户授权')
      } else {    //-1表示DENIED
        console.log('---用户拒绝了定位相关的两个权限授权')
      }
    }

  }

  build() {
    Column() {
      Text('首页')
        .fontSize(30)

    }
    .height('100%')
    .width('100%')
  }
}

运行结果:

请添加图片描述

二、定位服务(Location Kit):

1.一次性获取用户当前位置

获取当前位置:

let location = await geoLocationManager.getCurrentLocation({})

请添加图片描述
请添加图片描述
原因:没有把当前位置打开
请添加图片描述
请添加图片描述

在获取用户当前地理位置之后,进一步通过经纬度信息反编码出具体的地理位置信息。

请添加图片描述
完整代码:
请添加图片描述
完整代码:

import { Permissions } from '@ohos.privacyManager'
import { abilityAccessCtrl, bundleManager } from '@kit.AbilityKit'
import { geoLocationManager } from '@kit.LocationKit'
import { JSON } from '@kit.ArkTS'

@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(),list)    //list表示两个权限 --> 权限列表 ---permissionList:permissions
      if (result.authResults[0] === 0) {    //授权结果,authResults[]两个权限
        console.log('---定位相关的两个权限通过了用户授权')
      } else {    //-1表示DENIED
        console.log('---用户拒绝了定位相关的两个权限授权')
      }
    }

  }

  build() {
    Column() {
      Text('首页')
        .fontSize(30)

      Button('1、一次性获取用户当前位置').onClick(async _=>{
        try {
          let location = await geoLocationManager.getCurrentLocation({})
          console.log('获取位置信息成功!',JSON.stringify(location))
        } catch (err) {
          console.log('获取定位信息失败!:',JSON.stringify(err))
        }

      })

      Button('1-2、一次性获取用户当前位置').onClick(async _=>{
        try {
          let loc = await geoLocationManager.getCurrentLocation()
          // 根据经纬度信息反编码出地理信息 --- 需要在真机才有效
          let request:geoLocationManager.ReverseGeoCodeRequest= {
            latitude: loc.latitude,
            longitude: loc.longitude
          }
          let list = await geoLocationManager.getAddressesFromLocation(request)

          console.log('当前坐标所表示的地理位置',JSON.stringify(list))
        } catch (err) {
          console.log('获取定位信息失败!',JSON.stringify(err))
        }
      })

      Button('2、持续获取用户位置的改变').onClick(_=> {

      })
    }
    .height('100%')
    .width('100%')
  }
}

2.持续获取用户位置的改变

Button('2、持续获取用户位置的改变').onClick(_=>{
        let request:geoLocationManager.ContinuousLocationRequest = {
          interval:2 , //每次获取定位的时间间隔,单位:秒   默认值是1
          locationScenario:geoLocationManager.UserActivityScenario.SPORT    //定位应用场景    默认值是NAVIGATION导航
        }
        // geoLocationManager.on('locationChange',request,(loc)=>{
        //   console.log(new Date()+'用户的位置改变了:', JSON.stringify(loc))
        // })

        geoLocationManager.on('locationChange',request,this.f1)
      })
Button('3、停止持续获取用户位置的改变').onClick(_=>{
        // geoLocationManager.off('locationChange')    //停止“定位改变”所有的监听函数
        geoLocationManager.off('locationChange',this.f1)    //提示:off()方法的第二个参数表示停止哪一个“定位改变“监听函数
      })

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/918222.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu 18 EDK2 环境编译

视频:在全新的Ubuntu上从零搭建UEFI的EDK2开发环境 开始:git clone https://github.com/tianocore/edk2.git 开始编译BaseTools前先更新一下子模块:git submodule update --init ,然后:make -C BaseTools/ 问题1&a…

网络安全SQL初步注入2

六.报错注入 mysql函数 updatexml(1,xpath语法,0) xpath语法常用concat拼接 例如: concat(07e,(查询语句),07e) select table_name from information_schema.tables limit 0,1 七.宽字节注入(如果后台数据库的编码为GBK) url编码:为了防止提交的数据和url中的一些有特殊意…

Git 搭建远程仓库、在 IDEA 工具中的配置和使用

Git的概念、安装、操作与分支管理和图形化界面TortoiseGit(小乌龟 )的安装与使用-CSDN博客 目录 一、远程仓库 1)在github上创建仓库 2)在gitee上创建项目 3)如何将远程的项目clone 到本地 4)公司自己…

自然语言处理技术之细粒度实体识别

细粒度实体识别(Fine-Grained Named Entity Recognition, FG-NER) 1. 概述 细粒度实体识别是自然语言处理(NLP)领域中的一个重要研究方向,其目标是从文本中识别出更加具体和详细的实体类型。相比于传统的实体识别(NER),细粒度实体识别不仅关注常见的实体类别(如 人名…

k8s 1.28.2 集群部署 docker registry 接入 MinIO 存储

文章目录 [toc]docker registry 部署生成 htpasswd 文件生成 secret 文件 生成 registry 配置文件创建 service创建 statefulset创建 ingress验证 docker registry docker registry 监控docker registry ui docker registry dockerfile docker registry 配置文件 S3 storage dr…

为什么要使用Ansible实现Linux管理自动化?

自动化和Linux系统管理 多年来,大多数系统管理和基础架构管理都依赖于通过图形或命令行用户界面执行的手动任务。系统管理员通常使用清单、其他文档或记忆的例程来执行标准任务。 这种方法容易出错。系统管理员很容易跳过某个步骤或在某个步骤上犯错误。验证这些步…

一文了解Android的核心系统服务

在 Android 系统中,核心系统服务(Core System Services)是应用和系统功能正常运行的基石。它们负责提供系统级的资源和操作支持,包含了从启动设备、管理进程到提供应用基础组件的方方面面。以下是 Android 中一些重要的核心系统服…

MATLAB向量元素的引用

我们定义一个向量后,如果想引用的话,可以通过索引 i n d ind ind来实现。 注意:MATLAB中向量的开始索引是1,与许多编程语言不同。 例如: 如果想引用多个的话,可以用索引 i n d ind ind来提取多个位置 例如…

让空间计算触手可及,VR手套何以点石成金?

引言 如何让一位母亲与她去世的小女儿“重逢”?韩国MBC电视台《I Met You》节目实现了一个“不可能”心愿。 在空旷的绿幕中,母亲Jang Ji-sung透过VR头显,看到了三年前因白血病去世的女儿Nayeon。当她伸出双手,居然能摸到女儿的…

paramiko 库实现的暴力破解 SSH 密码

import paramiko import optparse import threading import time from threading import Thread, BoundedSemaphore# 用paramiko暴力破解SSH密码 # 最大并发连接尝试的数量,可根据实际情况调整,适当减小可降低对目标服务器的压力以及减少多线程同步问题出…

用 Python 从零开始创建神经网络(五):损失函数(Loss Functions)计算网络误差

用损失函数(Loss Functions)计算网络误差 引言1. 分类交叉熵损失(Categorical Cross-Entropy Loss)2. 分类交叉熵损失类(The Categorical Cross-Entropy Loss Class)展示到目前为止的所有代码3. 准确率计算…

RabbitMQ的工作队列在Spring Boot中实现(详解常⽤的⼯作模式)

上文着重介绍RabbitMQ 七种工作模式介绍RabbitMQ 七种工作模式介绍_rabbitmq 工作模式-CSDN博客 本篇讲解如何在Spring环境下进⾏RabbitMQ的开发.(只演⽰部分常⽤的⼯作模式) 目录 引⼊依赖 一.工作队列模式 二.Publish/Subscribe(发布订阅模式) …

QWen2.5学习

配置环境 pip install transformers 记得更新一下:typing_extensions pip install --upgrade typing_extensions 安装modelscope modelscope/modelscope: ModelScope: bring the notion of Model-as-a-Service to life. 下载这个仓库的代码上传到服务器解压 推…

如何使用正则表达式验证域名

下面是一篇关于如何使用正则表达式验证域名的教程。 如何使用正则表达式验证域名 简介 域名是互联网上网站的地址,每个域名由多个标签(label)组成,标签之间用点 . 分隔。域名规则有很多细节,但基本要求是&#xff1a…

【MySQL】MySQL数据库入门:构建你的数据基石

🍑个人主页:Jupiter. 🚀 所属专栏:MySQL初阶探索:构建数据库基础 欢迎大家点赞收藏评论😊 目录 🦅数据库基础🐀什么是数据库🐏主流数据库🦆MySQL数据库的基本…

微信小程序之路由跳转传数据及接收

跳转并传id或者对象 1.home/index.wxml <!--点击goto方法 将spu_id传过去--> <view class"item" bind:tap"goto" data-id"{{item.spu_id}}"> 结果: 2.home/index.js goto(event){// 路由跳转页面,并把id传传过去//获取商品idlet i…

杰控通过 OPCproxy 获取数据发送到服务器

把数据从 杰控 取出来发到服务器 前提你在杰控中已经有变量了&#xff08;wincc 也适用&#xff09; 打开你的opcproxy 软件包 opcvarFile 添加变量 写文件就写到 了 opcproxy.ini中 这个文件里就是会读取到的数据 然后 opcproxy.exe发送到桌面快捷方式再考回来 &#…

【Mysql】Mysql函数(上)

1、概述 在Mysql中&#xff0c;为了提高代码重用性和隐藏实现细节&#xff0c;Mysql提供了很多函数。函数可以理解为封装好的模块代码。 2、分类 在Mysql中&#xff0c;函数非常多&#xff0c;主要可以分为以下几类&#xff1a; &#xff08;1&#xff09;聚合函数 &#xf…

MIT6.5840 Lab 1: MapReduce(6.824)

结果 介绍 在本实验中&#xff0c;您将构建一个MapReduce系统。您将实现一个调用应用程序Map和Reduce函数并处理文件读写的工作进程&#xff0c;以及一个将任务分发给工作进程并处理失败的工作进程的协调进程。您将构建类似于MapReduce论文的东西。&#xff08;注意&#xff1a…

关于mysql中的锁

mysql中包含的锁分为&#xff1a; 一、全局锁 二、表锁 三、行锁 一、全局锁 全局锁的力度是最大的&#xff0c;全局锁对整个数据库实例加锁&#xff0c;加锁后整个实例就处于只读状态&#xff0c;后续的DML的写语句&#xff0c;DDL语句&#xff0c;已经更新操作的事务提交语句…