鸿蒙HarmonyOS开发:应用权限的基本概念及如何申请应用权限详细介绍

文章目录

      • 一、访问控制
      • 二、应用权限
        • 1、应用权限管控
        • 2、权限使用的基本原则
        • 3、授权方式
        • 4、权限等级
      • 三、申请应用权限
        • 1、选择申请权限的方式
        • 2、声明权限
        • 3、声明样例
        • 4、二次向用户申请授权
        • 5、具体实现示例
        • 6、效果展示
      • 四、应用权限列表
        • 1、system_grant(系统授权)
        • 2、user_grant(用户授权)
        • 3、应用权限组列表
      • 五、封装方法类

一、访问控制

默认情况下,应用只能访问有限的系统资源。但某些情况下,应用存在扩展功能的诉求,需要访问额外的系统数据(包括用户个人数据)和功能,系统也必须以明确的方式对外提供接口来共享其数据或功能。

系统通过访问控制的机制,来避免数据或功能被不当或恶意使用。当前访问控制的机制涉及多方面,包括应用沙箱、应用权限、系统控件等方案。

二、应用权限

系统根据应用的APL等级设置进程域和数据域标签,并通过访问控制机制限制应用可访问的数据范围,从而实现在机制上消减应用数据泄露的风险。

不同APL等级的应用能够申请的权限等级不同,且不同的系统资源(如:通讯录等)或系统能力(如:访问摄像头、麦克风等)受不同的应用权限保护。通过严格的分层权限保护,有效抵御恶意攻击,确保系统安全可靠。

1、应用权限管控

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

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

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

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

2、权限使用的基本原则

合理的使用场景有助于应用权限申请和使用。开发应用时权限申请需要满足如下原则:

  • 应用(包括应用引用的三方库)所需权限必须在应用的配置文件中严格按照权限开发指导逐个声明。

  • 权限申请满足最小化原则,禁止申请非必要的、已废弃的权限。应用申请过多权限,会引起用户对应用安全性的担忧以及使用体验变差,从而也会影响到应用的安装率和留存率。

  • 应用申请敏感权限时,必须填写权限使用理由字段,敏感权限通常是指与用户隐私密切相关的权限,包括地理位置、相机、麦克风、日历、健身运动、身体传感器、音乐、文件、图片视频等权限。

  • 应用敏感权限须在对应业务功能执行前动态申请,满足隐私最小化要求。

  • 用户拒绝授予某个权限后,应用与此权限无关的其他业务功能应允许正常使用。

3、授权方式

根据授权方式的不同,权限类型可分为system_grant(系统授权)和user_grant(用户授权)。

  • system_grant(系统授权)

system_grant指的是系统授权类型,在该类型的权限许可下,应用被允许访问的数据不会涉及到用户或设备的敏感信息,应用被允许执行的操作对系统或者其他应用产生的影响可控。

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

  • user_grant(用户授权)

user_grant指的是用户授权类型,在该类型的权限许可下,应用被允许访问的数据将会涉及到用户或设备的敏感信息,应用被允许执行的操作可能对系统或者其他应用产生严重的影响。

该类型权限不仅需要在安装包中申请权限,还需要在应用动态运行时,通过发送弹窗的方式请求用户授权。在用户手动允许授权后,应用才会真正获取相应权限,从而成功访问操作目标对象。

4、权限等级

为了防止应用过度索取和滥用权限,系统基于APL(Ability Privilege Level,元能力权限等级)等级,配置了不同的权限开放范围。

元能力权限等级APL指的是应用的权限申请优先级的定义,不同APL等级的应用能够申请的权限等级不同。

级别说明开放范围
normal允许应用访问超出默认规则外的普通系统资源,如配置Wi-Fi信息、调用相机拍摄等。这些系统资源的开放(包括数据和功能)对用户隐私以及其他应用带来的风险低。都能用
system_basic允许应用访问操作系统基础服务(系统提供或者预置的基础功能)相关的资源,如系统设置、身份认证等。这些系统资源的开放对用户隐私以及其他应用带来的风险较高。要签名证书
system_core涉及开放操作系统核心资源的访问操作。这部分系统资源是系统最核心的底层服务,如果遭受破坏,操作系统将无法正常运行。不开放

三、申请应用权限

1、选择申请权限的方式

应用在访问数据或者执行操作时,需要评估该行为是否需要应用具备相关的权限。如果确认需要目标权限,则需要在应用安装包中申请目标权限。

每一个权限的权限等级、授权方式不同,申请权限的方式也不同,开发者在申请权限前,需要先根据以下流程判断应用能否申请目标权限。

在这里插入图片描述

  • system_grant(系统授权)

如果目标权限是system_grant类型,开发者在进行权限申请后,系统会在安装应用时自动为其进行权限预授予,开发者不需要做其他操作即可使用权限。

  • user_grant(用户授权)

在应用需要获取user_grant权限时,请完成以下步骤:

1、在配置文件中,声明应用需要请求的权限。

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

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

4、检查用户的授权结果,确认用户已授权才可以进行下一步操作。

2、声明权限

应用在申请权限时,需要在项目的配置文件中,逐个声明需要的权限,否则应用将无法获取授权。

应用需要在module.json5配置文件的requestPermissions标签中声明权限。

属性含义数据类型是否必填取值范围
name需要使用的权限名称。字符串必填需为系统已定义的权限,取值范围请参考应用权限列表。
reason申请权限的原因。字符串选填该字段用于应用上架校验,当申请的权限为user_grant权限时必填,并且需要进行多语种适配。使用string类资源引用。格式为$string: ***。
usedScene权限使用的场景。包括abilities和when两个子项。
-abilities:使用权限的UIAbility或者ExtensionAbility组件的名称。
- when:调用时机。
对象必填当申请的权限为user_grant权限时建议填写。
3、声明样例

// module.json5

{"module" : {"requestPermissions":[// 网络请求{"name": "ohos.permission.INTERNET"},// 相机{"name": "ohos.permission.CAMERA","reason": '$string:permission_reason_camera',"usedScene": {}},]}
}
4、二次向用户申请授权

当应用通过requestPermissionsFromUser()拉起弹框请求用户授权时,用户拒绝授权。应用将无法再次通过requestPermissionsFromUser拉起弹框,需要用户在系统应用“设置”的界面中,手动授予权限。

在“设置”应用中的路径:

路径一:设置 > 隐私和安全 > 权限类型(如麦克风) > 具体应用
路径二:设置 > 应用和元服务 > 某个应用

应用也可以通过调用requestPermissionOnSetting(),直接拉起权限设置弹框,引导用户授予权限。

5、具体实现示例

以申请使用麦克风权限为例进行说明。

在UI中向用户申请授权。

调用requestPermissionsFromUser()方法后,应用程序将等待用户授权的结果。如果用户授权,则可以继续访问目标操作。如果用户拒绝授权,则需要提示用户必须授权才能访问当前页面的功能,并引导用户到系统应用“设置”中打开相应的权限。

应用也可以通过调用requestPermissionOnSetting(),直接拉起权限设置弹框,引导用户授予权限。

import { abilityAccessCtrl, common, Permissions, bundleManager } from '@kit.AbilityKit'
import { promptAction } from '@kit.ArkUI';const context = getContext(this) as common.UIAbilityContext;@Entry
@Component
struct PermissionPage {// 打开系统设置的权限管理页openPermissionSettingsPage() {const BundleFlag = bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION// 获取 bundle 包信息const bundleInfo = bundleManager.getBundleInfoForSelfSync(BundleFlag)// 通过 startAbility 打开 系统设置 页context.startAbility({bundleName: 'com.huawei.hmos.settings', // 固定写法CV:设置页的包名abilityName: 'com.huawei.hmos.settings.MainAbility', // 固定写法CV:设置页的 ability 名uri: 'application_info_entry', // 固定写法CV:打开 设置->应用和元服务parameters: {// 应用包名可通过 bundleManager 动态获取pushParams: bundleInfo.name}})}// 申请麦克风授权async requestMicrophone() {const permissions: Array<Permissions> = ['ohos.permission.MICROPHONE'];// 1. 创建应用权限管理器const atManager = abilityAccessCtrl.createAtManager()// 2. 向用户申请 user_grant 权限(温馨提示:首次申请时会弹窗,后续申请则不会再出现弹窗)const requestResult = await atManager.requestPermissionsFromUser(context, // 应用上下文permissions   // 参数:权限列表(数组)zou)const isAuth = requestResult.authResults.every(item => item === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)// 如果点击拒绝,则弹窗引导去设置页开启if (!isAuth) {promptAction.showDialog({alignment: DialogAlignment.Center,title: '温馨提示',message: "开启后才能录制加密视频和音频",buttons: [{ text: '取消', color: '#89939c' },{ text: '去设置', color: '#0a59f7' },]}).then((res) => {// 用户点击了去设置if (res.index === 1) {// 通过代码打开当前应用的设置页this.openPermissionSettingsPage()}})}}build() {Column() {Button('申请麦克风授权').onClick(() => {this.requestMicrophone()})}.padding(20).height('100%').width('100%')}
}
6、效果展示

在这里插入图片描述

如果用户拒绝授权,通过调用requestPermissionOnSetting(),直接拉起权限设置弹框,引导用户授予权限。

在这里插入图片描述

四、应用权限列表

1、system_grant(系统授权)

更多请参见官网《对所有应用开放》

ohos.permission.USE_BLUETOOTH
允许应用查看蓝牙的配置。

ohos.permission.GET_BUNDLE_INFO
允许查询应用的基本信息。

ohos.permission.PREPARE_APP_TERMINATE
允许应用关闭前执行自定义的预关闭动作。

ohos.permission.PRINT
允许应用获取打印框架的能力。

ohos.permission.DISCOVER_BLUETOOTH
允许应用配置本地蓝牙,查找远端设备且与之配对连接。

ohos.permission.ACCELEROMETER
允许应用读取加速度传感器的数据。

ohos.permission.ACCESS_BIOMETRIC
允许应用使用生物特征识别能力进行身份认证。

ohos.permission.ACCESS_NOTIFICATION_POLICY
在本设备上允许应用访问通知策略。
仅当控制铃声从静音到非静音时,需要申请该权限。

ohos.permission.GET_NETWORK_INFO
允许应用获取数据网络信息。

ohos.permission.GET_WIFI_INFO
允许应用获取Wi-Fi信息。

ohos.permission.GYROSCOPE
允许应用读取陀螺仪传感器的数据。

ohos.permission.INTERNET
允许使用Internet网络。

ohos.permission.KEEP_BACKGROUND_RUNNING
允许Service Ability在后台持续运行。

ohos.permission.NFC_CARD_EMULATION
允许应用实现卡模拟功能。

ohos.permission.NFC_TAG
允许应用读写Tag卡片。

ohos.permission.PRIVACY_WINDOW
允许应用将窗口设置为隐私窗口,禁止截屏录屏

ohos.permission.PUBLISH_AGENT_REMINDER
允许该应用使用后台代理提醒。

ohos.permission.SET_WIFI_INFO
允许应用配置Wi-Fi设备。

ohos.permission.VIBRATE
允许应用控制马达振动。

ohos.permission.CAMERA
允许应用使用相机。

更多请参见官网《对所有应用开放》

2、user_grant(用户授权)

更多请参见官网《受限开放权限》

ohos.permission.READ_AUDIO
允许读取用户公共目录的音频文件。

ohos.permission.WRITE_AUDIO
允许修改用户公共目录的音频文件。

ohos.permission.READ_IMAGEVIDEO
允许读取用户公共目录的图片或视频文件。

ohos.permission.WRITE_IMAGEVIDEO
允许修改用户公共目录的图片或视频文件。

ohos.permission.SHORT_TERM_WRITE_IMAGEVIDEO
允许应用保存图片、视频到用户公共目录。应用获取此权限后,最长可获得30分钟的短时授权,来保存图片/视频。

ohos.permission.READ_CONTACTS
允许应用读取联系人数据。

ohos.permission.WRITE_CONTACTS
允许应用添加、移除或更改联系人数据。

ohos.permission.SYSTEM_FLOAT_WINDOW
允许应用使用全局悬浮窗的能力。

ohos.permission.READ_PASTEBOARD
允许应用读取剪贴板。

更多请参见官网《受限开放权限》

3、应用权限组列表
  • 在申请目标权限前,建议开发者先阅读应用权限管控概述-权限组和子权限,了解相关概念,再合理申请对应的权限组。

  • 当应用请求权限时,同一个权限组的权限将会在一个弹窗内一起请求用户授权,用户同意授权后,权限组内权限将被统一授权。地理位置、通讯录、通话记录、电话、信息、日历权限组除外。

  • 当前系统支持的权限组如下所示,各子权限的含义请查阅应用权限列表。

更多请参见官网《应用权限组列表》

位置
ohos.permission.LOCATION_IN_BACKGROUND
ohos.permission.LOCATION
ohos.permission.APPROXIMATELY_LOCATION

相机
ohos.permission.CAMERA

麦克风
ohos.permission.MICROPHONE

通讯录
ohos.permission.READ_CONTACTS
ohos.permission.WRITE_CONTACTS

日历
ohos.permission.READ_CALENDAR
ohos.permission.WRITE_CALENDAR

图片和视频
ohos.permission.WRITE_IMAGEVIDEO
ohos.permission.READ_IMAGEVIDEO
ohos.permission.MEDIA_LOCATION

音乐和音频
ohos.permission.WRITE_AUDIO
ohos.permission.READ_AUDIO

文件夹
ohos.permission.READ_WRITE_DOWNLOAD_DIRECTORY
ohos.permission.READ_WRITE_DOCUMENTS_DIRECTORY

更多请参见官网《应用权限组列表》

五、封装方法类

检查是否授权,申请授权,打开系统设置的权限管理页,逻辑都是相同的,我们通过 class 把功能进行封装整合,方便复用。

//PermissionManager.ets

import { abilityAccessCtrl, bundleManager, common, Permissions } from '@kit.AbilityKit';class PermissionManager {/*** 检查是否授权* @param permissions 权限列表* @returns 返回授权结果*/checkPermissions(permissions: Permissions[]) {// 1. 创建应用权限管理器const atManager = abilityAccessCtrl.createAtManager()// 2. 获取 bundle 包信息,Sync 写法const bundleFlag = bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATIONconst bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleFlag)// 3. 提取 tokenIDconst tokenID = bundleInfo.appInfo.accessTokenId// 4. 检测是否授权,Sync 写法,遍历权限组(数组)const grantStatus = permissions.map(item => atManager.checkAccessTokenSync(tokenID, item))// 5. 返回权限数组的检测结果return grantStatus.every(result => result === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)}/*** 申请授权(首次弹窗申请)* @param permissions 权限列表* @returns 返回授权结果,授权成功为 Promise.resolve(), 拒绝授权为 Promise.reject()*/async requestPermissions(permissions: Permissions[]) {// 1. 创建应用权限管理器const atManager = abilityAccessCtrl.createAtManager()// 2. 向用户申请 user_grant 权限(温馨提示:首次申请时会弹窗,后续申请则不会再出现弹窗)const requestResult = await atManager.requestPermissionsFromUser(getContext(), // 应用上下文permissions   // 参数:权限列表(数组))// 3. 通过 every 检查权限是否都成功授权const isAuth = requestResult.authResults.every(item => item === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)// 4. 返回授权结果// Promise.resolve()   返回 Promise 成功,await 后续代码,正常执行// Promise.reject()    返回 Promise 错误,await 后续代码,不被执行,Promise.reject() 的结果可被 catch 捕获return isAuth === true ? Promise.resolve(true) : Promise.reject(false)}/*** 打开系统设置的权限管理页*/openPermissionSettingsPage() {// 1. 获取应用上下文,并通过 as 断言收窄类型为 UIAbilityContext,否则 context 默认类型无法调用 startAbility 方法const context = getContext() as common.UIAbilityContext// 2. 获取 bundle 包信息const bundleFlag = bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATIONconst bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleFlag)// 3. 通过 startAbility 打开 系统设置 页context.startAbility({bundleName: 'com.huawei.hmos.settings', // 固定写法:设置页的包名abilityName: 'com.huawei.hmos.settings.MainAbility', // 固定写法:设置页的 ability 名uri: 'application_info_entry', // 固定写法:打开 设置->应用和元服务parameters: {// 通过 bundleManager 获取应用包名pushParams: bundleInfo.name}})}
}// 导出 permissionManager
export const permissionManager = new PermissionManager()

使用示例

// 1、检查是否已开启某些权限
permissionManager.checkPermissions(['ohos.permission.READ_IMAGEVIDEO', 'ohos.permission.WRITE_IMAGEVIDEO'])// 2、申请开启某些权限
try {permissionManager.requestPermissions(['ohos.permission.MICROPHONE'])// 允许
} catch (error) {// 禁止 -> 可以引导用户打开设置页手动开启权限
}// 3、通过代码打开当前应用的设置页
permissionManager.openPermissionSettingsPage()

注意:需要申请的权限要提前在 module.json5 中添加权限

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 KVM 在 Xubuntu 上创建 Windows 10 虚拟机

目录 前言说明注意准备 iso官网思博主(嘻嘻)拖动到虚拟机里面启动 virt-manager创建虚拟机选择本地安装介质选择 iso配置 内存 和 CPU选择 创建的虚拟机 保存的位置启动虚拟机看到熟悉的 Win10界面点击现在安装点击我没有产品密钥选择 Win10 专业工作站版勾选接受许可条款选择自…

前端中的拖拽知识

概述 本文主要介绍前端中拖拽相关的知识以及如何在 vue3 工程里实现拖拽指令。 前端中的拖拽 前端中的拖拽功能是一种交互设计,允许用户通过鼠标或触摸操作移动页面上的元素到不同的位置。这一功能的实现涉及 HTML、CSS 和 JavaScript 的综合运用。 HTML元素拖拽 拖拽元素…

MySQL增删改进阶

目录 1.数据库约束 1.1约束类型 1.2 not null约束 1.3 unique&#xff1a;唯一约束 1.4 default&#xff1a;默认约束 1.5 primary key&#xff1a;主键约束 1.6 foreign key:外键约束 1.7 check约束&#xff08;了解&#xff09; 2.表的设计 3.新增&#xff08;进阶&…

C++【内存管理】(超详细讲解C++内存管理以及new与delete的使用和原理)

文章目录 1.C/C内存分布2.C语言中动态内存管理方式3.C内存管理方式3.1 new/delete操作内置类型3. 2new/delete操作自定义类型 4. operator new与operator delete函数&#xff08;重点&#xff09;5. new和delete的实现原理5.1 内置类型5.2 自定义类型5.2.1 自定义类型调用new[]…

基于Q学习迷宫寻路问题

迷宫由一个二维数组 self.maze 表示&#xff0c;其中&#xff1a; 0 表示可以行走的空白区域&#xff0c;1 表示障碍物&#xff0c;2 表示迷宫的起始位置&#xff0c;3 表示迷宫的目标位置。 动作定义了智能体可以执行的动作集合&#xff0c;在这个迷宫问题中&#xff0c;动…

最大输出功率的计算(直流电源)

本内容仅计算直流电源的最大输出功率​。 方法1&#xff1a; 图1 电源电路 根据欧姆定律列写电流公式&#xff0c;其中&#xff0c;U和r是常数&#xff0c;R为变量。 电阻R上消耗的功率&#xff1a;&#xff0c;代入上面的式子&#xff0c;可得&#xff1a; &#xff0c;故…

5、JavaScript(二) 对象+DOM

17.对象 1、对象&#xff1a;⽤来存储多个数据的 是由多个键值对/key value对组成的 ⽤来描述⼀个事物的 相当于多个变量的集合 2、格式 &#xff1a;{key:value,key:value} 键/值对 属性名&#xff1a;属性值 3、对象的属性值是不限制数据类型的&#xff0c;甚至还可以是对…

【第二十二课】空间自分析——实例分析

一、前言 案例描述&#xff1a;现有全国 31个省市的矢量地图以及相关年份GDP 属性数据&#xff0c; 通过空间自相关分析我国省域经济的空间格局变化。 1、全局Morans I方法 &#xff08;1&#xff09;加载全国省域图层&#xff0c;并与相关年份GDP属性数据进行连接操作。 &…

Apache Seata Raft模式配置中心

本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 Apache Seata Raft模式配置中心 title: Seata Raft模式配置中心 author: 蒋奕晨-清华大学&…

【计算机网络】HTTP报文详解,HTTPS基于HTTP做了哪些改进?(面试经典题)

HTTP协议基本报文格式 在计算机网络中&#xff0c;HTTP&#xff08;超文本传输协议&#xff09;是应用层的一种协议&#xff0c;用于客户端&#xff08;通常是浏览器&#xff09;和服务器之间的通信。HTTP报文分为请求报文和响应报文&#xff0c;以下是它们的基本格式。 1. H…

【R语言】gadm全球行政区划数据库

我R语言不熟、也不是学GIS的。仅用于记录。 文章目录 一、gadm 数据库简介二、R 语言示例三、sf 包的函数 一、gadm 数据库简介 GADM&#xff08;全称Database of Global Administrative Areas&#xff09;是一个高精度的全球行政区划数据库&#xff0c;它包含了全球所有国家和…

cs木马图形化界面出现问题处理

一个月多月没用cs木马了&#xff0c;发现打开客户端之后显示不出图形化界面&#xff0c;且出现下面这样的报错。 、 最后发现是java版本的问题&#xff0c;kali的java自动更新了。把原来的openjdk11改到了openjdk23。 解决方法&#xff1a; 输入&#xff1a; sudo update-…

vue的动态组件 keep-alive

1. 什么是动态组件 动态组件指的是 动态切换组件的显示与隐藏 2. 如何实现动态组件渲染 vue提供了一个内置的<component>组件&#xff0c;专门用来实现动态组件的渲染。 作用&#xff1a;组件的占位符is的值表示要渲染的组件 示例代码如下&#xff1a; Left.vue的代…

2024版AI大模型转行入门全攻略,零基础入门到精通,收藏这一篇就够了

引言 随着人工智能和大模型&#xff08;如GPT-4、BERT等&#xff09;技术的快速发展&#xff0c;越来越多的专业人士希望转行进入这一领域。大模型开发涉及复杂的技术体系和多样的应用场景&#xff0c;对从业者的知识和能力提出了较高要求。本文将详细解析转行大模型开发所需的…

1.C++经典实例-计算两个数的最大公约数

用户输入两个数字&#xff0c;然后通过程序计算出这两个数字的最大公约数&#xff1a; 最大公约数&#xff08;greatest common divisor&#xff0c;简写为 gcd &#xff1b;或highest common factor&#xff0c;简写为hcf)&#xff0c;指某几个整数共有因子中最大的一个 #in…

RHCE——例行性工作

准备工作 [rootlocalhost ~]# cat /etc/yum.repos.d/aliyun.repo [ali-app] nameali-app baseurlhttps://mirrors.aliyun.com/centos-stream/9-stream/AppStream/x86_64/os/ gpgcheck0[ali-base] nameali-base baseurlhttps://mirrors.aliyun.com/centos-stream/9-stream/Base…

探索YOLO v11:3D人工智能的RGB-D视觉革命

哈喽&#xff0c;各位OAK中国的朋友们! 大家好我是张伯生 今天&#xff0c;我想给大家演示一下最新发布的Yolo V11神经网络 下面我将演示的一个程序是&#xff1a;同时在我们的OAK相机上跑Yolo V11和RGB-D&#xff0c;也就是彩色相机和深度图的一个叠加的一个效果 RGB-D和Yo…

C++标准模板库--vector

vector 介绍 vector&#xff08;向量&#xff09;是一种序列容器&#xff0c;表示为可以改变大小的数组。vector中的元素使用连续的存储位置&#xff0c;这意味着也可以使用指向其元素的常规指针偏移量来访问任意元素&#xff0c;且与数组一样高效。但与数组不同的是&#xff…

网络空间安全之一个WH的超前沿全栈技术深入学习之路(一:渗透测试行业术语扫盲)作者——LJS

欢迎各位彦祖与热巴畅游本人专栏与博客 你的三连是我最大的动力 以下图片仅代表专栏特色 [点击箭头指向的专栏名即可闪现] 专栏跑道一 ➡️网络空间安全——全栈前沿技术持续深入学习 专栏跑道二➡️ 24 Network Security -LJS ​ ​ ​ 专栏跑道三 ➡️ MYSQL REDIS Advanc…

线性系统性能分析方法3——频率特性分析法(频域分析法)

一种图解的分析方法&#xff0c;不必直接求解系统输出的时域表达式&#xff0c;不需要求解系统的闭环特征根&#xff0c;具有较多的优点。如&#xff1a; ①根据系统的开环频率特性揭示闭环系统的动态性能和稳态性能&#xff0c;得到定性和定量的结论&#xff0c;可以简单迅速…