鸿蒙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
更多请参见官网《应用权限组列表》
相关文章:

鸿蒙HarmonyOS开发:应用权限的基本概念及如何申请应用权限详细介绍
文章目录 一、访问控制二、应用权限1、应用权限管控2、权限使用的基本原则3、授权方式4、权限等级 三、申请应用权限1、选择申请权限的方式2、声明权限3、声明样例4、二次向用户申请授权5、具体实现示例6、效果展示 四、应用权限列表1、system_grant(系统授权&#…...

mac 桌面版docker no space left on device
报错信息 docker pull镜像时报: failed to register layer: Error processing tar file(exit status 1): write /home/admin/oceanbase_bak/bin/observer: no space left on device 解决 增加 docker 虚拟磁盘大小。 调整完点击重启即可。...

基于CIM的街镇基层治理统一指挥平台建设方案
1 项目概述 1.1 建设背景 社区作为人民生活的重要区域,往往需要对社区内人员、房屋、基本设施、日常业务进行规范管理,以保证其正常运行,但是传统的社区治理方式已不能满足新时代社会发展的要求,如人工采集录入信息、人员现场巡逻等,这些工作方式不仅工作量大,而且效率…...

PostgreSQL学习笔记三:数据类型和运算符
数据类型和运算符 PostgreSQL 支持多种数据类型和运算符,以下是一些常见的数据类型和运算符的概述: 数据类型 基本数据类型 整数类型: SMALLINT:2 字节,范围 -32,768 到 32,767。INTEGER:4 字节࿰…...

ROS理论与实践学习笔记——6 ROS机器人导航(仿真)
在 ROS 中,机器人导航(Navigation)是由多个功能包组合而成的系统,统称为导航功能包集(navigation stack)。它提供了一个全面的框架,使得移动机器人能够自主导航到指定目标点,同时避开…...

uniapp开发微信小程序,button的open-type=“share“ 分享给个人跳转到首页问题
当使用button标签带上open-type"share"属性,点击之后可分享当前页面给微信好友,但是分享之后朋友点开跳转到了首页问题。 需要使用 onShareAppMessage 函数 export default {onShareAppMessage(res) {if (res.from button) {// 来自页面内分…...

【jQuery】 jQuery基础及选择器介绍(基本选择器 层次选择器 属性选择器 过滤选择器)
文章目录 jQuery基础1. 优势2. 版本3. 基本语法4. 选择器基本选择器层次选择器属性选择器过滤选择器基本过滤选择器可见性过滤选择器 注意事项 jQuery基础 jQuery 是一个功能强大且易于使用的 JavaScript 库,它极大地简化了前端开发的工作。无论是 DOM 操作、事件处…...

网站在对抗机器人攻击的斗争中失败了
95% 的高级机器人攻击都未被发现,这一发现表明当前的检测和缓解策略存在缺陷。 这表明,虽然一些组织可能拥有基本的防御能力,但他们没有足够的能力应对更复杂的攻击。 例如利用人工智能和机器学习来模仿人类行为的攻击。 这些统计数据强调…...

Centos7 搭建logstash
下载并安装公共签名密钥: sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch 创建一个名为 /etc/yum.repos.d/logstash.repo 的文件,并添加以下内容: [logstash-7.x] nameElastic repository for 7.x packages baseu…...

面试题:Redis(五)
1. 面试题 面试问 记录对集合中的数据进行统计 在移动应用中,需要统计每天的新增用户数和第2天的留存用户数; 在电商网站的商品评论中,需要统计评论列表中的最新评论; 在签到打卡中,需要统计一个月内连续打卡的用户数&…...

LeetCode18.四数之和
题目链接:18. 四数之和 - 力扣(LeetCode) 这道题是在三数之和上改编出来的,在写这道题之前可以尝试以下三数之和(15. 三数之和 - 力扣(LeetCode)); 1.常规解法…...

jmeter出参保存到文件,保存失败解决
1、添加JSON提取 2、添加beanshell FileWriter writer new FileWriter("C:/Users/xxx/Desktop/signUrl.csv", true); writer.write(vars.get("company_name")"\t"vars.get("signUrl")"\n"); writer.close(); 写文件的两个…...

黑龙江网络安全等级保护办理机制
黑龙江的网络安全等级保护机制根据《网络安全法》和相关法规要求,信息系统按照安全等级从低到高分为五级,分别为一般、重要、非常重要、特别重要和特别敏感。不同等级的信息系统必须实施相应的安全措施,以确保系统免受内外部威胁,…...

小红的行列式构造
链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 题目描述 小红希望你构造一个3阶行列式,满足每个元素的绝对值不小于1,且行列式的值等于xxx。你能帮帮她吗? 输入描述: 一个整数xxx −100≤x≤100 输出描…...

pyflink过滤kafka数据
from pyflink.table import (TableEnvironment, EnvironmentSettings)# 输入、输出、过滤条件 columns_in [ ... ]columns_out [ ... ] filter_condition "name 蒋介石 and sex 男"# 创建执行环境t_env TableEnvironment.create(EnvironmentSettings.in_stream…...

Webpack 完整指南
🌈个人主页:前端青山 🔥系列专栏:Webpack篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来webpack篇专栏内容:webpack介绍 目录 介绍 一、webpack 1.1、webpack是什么 1.2 webpack五个核心配置 1.…...

如何在 Ubuntu20.04 安装FTP Server vsftpd
1.安装: sudo apt-get install vsftpd 2.启动 sudo service vsftpd start //启动 sudo service vsftpd stop //停止 sudo service vsftpd restart //重新启动 3.打开配置文件 sudo nano /etc/vsftpd.conf 4.配置:限制在指定目录&…...

基于FPGA的DDS信号发生器(图文并茂+深度原理解析)
篇幅有限,本文详细源文件已打包 至个人主页资源,需要自取...... 前言 DDS(直接数字合成)技术是先进的频率合成手段,在数字信号处理与硬件实现领域作用关键。它因低成本、低功耗、高分辨率以及快速转换时间等优点备受认可。 本文着重探究基于 FPGA 的简易 DDS 信号发生器设…...

QT:绘制事件和定时器
1.绘制时针 xx.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimer> #include<QPainter> #include <QTime>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpubl…...

【算法——递归回溯】
这个东西还是很重要的,直接决定了你的动态规划章节的学习深度 78. 子集 方法1: vector<vector<int>>V; void dfs(vector<int> v,vector<int> nums,int index) {if(indexnums.size()) V.push_back(v);else{v.push_back(nums[i…...

手机在网状态接口的使用和注意事项
手机在网状态接口是用于查询手机号码在运营商数据库中的实时状态的工具,这种接口在互联网金融、贷款、租赁、保险等相关行业中尤为重要,因为它可以帮助这些行业进行更有效的风控审核。以下是对手机在网状态接口的详细介绍: 一、手机在网状态…...

WebGl 使用uniform变量动态修改点的颜色
在WebGL中,uniform变量用于在顶点着色器和片元着色器之间传递全局状态信息,这些信息在渲染过程中不会随着顶点的变化而变化。uniform变量可以用来设置变换矩阵、光照参数、材料属性等。由于它们在整个渲染过程中共享,因此可以被所有使用该着色…...

Leetcode 划分字母区间
题目要求: 将字符串 s 划分成尽量多的片段,保证每个片段中出现的字母不会出现在其他片段中。 具体解释如下: 尽量多的片段:题目要求的是在划分过程中,我们要尽量让划分的片段数量最大化,而不是最少化。每…...

可编辑div遇到的那些事
在日常开发中有时可能会遇到input 或 textarea 不能满足的开发场景,比如多行输入的情况下,textarea 的右下角icon 无法去除, 所以此时可以使用div 设置可编辑状态,完成功能开发,在开发的过程中仍会遇到一下问题。 1,如…...

什麼是高速HTTP代理?
高速HTTP代理是一種用於加速和優化互聯網連接的技術。它通過在用戶和目標網站之間充當仲介伺服器,幫助用戶快速訪問網路資源。HTTP代理不僅可以提高訪問速度,還能提供一定程度的隱私保護和安全性。 高速HTTP代理的工作原理 HTTP代理伺服器位於用戶設備…...

三子棋(C 语言)
目录 一、游戏设计的整体思路二、各个步骤的代码实现1. 菜单及循环选择的实现2. 棋盘的初始化和显示3. 轮流下棋及结果判断实现4. 结果判断实现 三、所有代码四、总结 一、游戏设计的整体思路 (1)提供一个菜单让玩家选择人机对战、玩家对战或者退出游戏…...

HWS赛题 入门 MIPS Pwn-Mplogin(MIPS_shellcode)
解题所涉知识点: 泄露或修改内存数据: 堆地址:栈地址:栈上数据的连带输出(Stack Leak) && Stack溢出覆盖内存libc地址:BSS段地址: 劫持程序执行流程:[[MIPS_ROP]] 获得shell或flag&am…...

纯血鸿蒙启动公测,爱加密鸿蒙加固平台发布,助力鸿蒙应用安全运营!
鸿蒙系统打破了移动操作系统两极格局,实现操作系统核心技术的自主可控、安全可靠,在神州大地上掀起一波科技革新的浪潮,HarmonyOS NEXT成为大型企业必须要布局的应用系统之一。 HarmonyOS NEXT于10月8日正式开启公测,距离面向全体…...

MySQL中 truncate、drop和delete的区别
MySQL中 truncate、drop和delete区别 truncate 执行速度快,删除所有数据,但是保留表结构不记录日志事务不安全,不能回滚可重置自增主键计数器 drop 执行速度较快,删除整张表数据和结构不记录日志事务不安全,不能回…...

什么开放式耳机值得买?开放式耳机推荐排行榜!
长时间佩戴传统入耳式耳机有时可能会影响耳道健康,鉴于此,转而选择不入耳设计的开放式耳机就成了不少人的新倾向,它们有助于减少细菌滋生和耳道闷热的烦恼。为了帮助大家找到合适的选项,下面我将列举一些市面上口碑不错的开放式耳…...