HarmonyOS 鸿蒙Next“仿抖音快手”App开发技术分享(五)申请网络访问权限
HarmonyOS 鸿蒙Next“仿抖音快手”App开发技术分享(五)申请网络访问权限
上一节我们利用滑块组件实现了多张图片的左右轮播特效,在此基础上可以实现多个短视频的上下轮播特效。那么要想正常播放网络视频,还得让App提前获得网络授权才行。鸿蒙系统提供了一种允许应用访问系统资源(例如通讯录)和系统能力(例如访问摄像头、麦克风等)的通用权限访问方式,以此避免系统数据和系统功能被不当使用。
根据授权方式的不同,鸿蒙App的权限类型可分为system_grant(系统授权)和user_grant(用户授权)。如果App声明了system_grant权限,那么系统会在安装App时,会自动把相应权限授予给该应用。但是对于user_grant权限来说,不仅需要App事先声明权限,还要在应用运行时,以弹窗方式请求用户授权。只有用户确认授权,应用才会获得相应权限,从而正常操作相关能力。
system_grant的授权方式比较简单,而user_grant的授权方式比较复杂。就网络访问权限而言,它属于system_grant权限,具体的授权步骤说明如下:
打开App模块的配置文件module.json5,给module节点添加下面的网络权限声明配置:
"requestPermissions":[
{
"name" : "ohos.permission.INTERNET"
}
]
注意requestPermissions节点跟着权限数组,可配置一个或者多个权限,比如ohos.permission.INTERNET表示访问网络权限。由于INTERNET属于系统授权,安全等级比较低,因此只要在module.json5中添加声明就行了,系统会在安装App时自动分配网络权限。
如果是申请user_grant权限,比如麦克风权限,那么不光添加权限声明配置,还要在ETS代码中添加权限检查和权限授予代码,具体的授权步骤说明如下:
1、给module节点添加权限声明配置
对user_grant权限而言,requestPermissions节点不仅要声明权限的名称(name字段),还要声明申请的原因(reason字段),以及该权限的使用场景(usedScene)字段。
其中原因文本要配置到resources/base/element/string.json中,然后以“$string:文本字段名称”的形式引用到reason字段。比如先给string.json补充下面的字符串配置:
{
"name": "Microphone_reason",
"value": "麦克风权限"
}
再打开module.json5,在权限声明的name后面添加以下一行reason配置:
"reason": "$string:Microphone_reason",
至于使用场景的usedScene对象,要求在when字段指定该权限的调用时机,时机类型有两种,分别是inuse(使用时)、always(始终),通常填inuse即可。
综合上述的配置说明,给App申请麦克风权限时,要在module.json5文件的module节点添加下面完整的权限声明语句:
"requestPermissions":[
{
"name" : "ohos.permission.MICROPHONE", // 权限名称
"reason": "$string:Microphone_reason", // 申请原因
"usedScene": { // 使用场景
"when":"inuse" // 在使用时授权
}
}
]
2、在ETS代码中处理动态授权
打开App模块的入口代码EntryAbility.ets,先在文件开头添加下面的导包语句:
import { abilityAccessCtrl, Permissions } from '@kit.AbilityKit'
再到onWindowStageCreate方法内部调用下面代码,创建授权管理器AtManager:
let atManager = abilityAccessCtrl.createAtManager()
然后通过授权管理器提供的下列方法,分别执行权限的检查、授权等操作。
- checkAccessToken:校验应用是否授予了指定权限。第一个参数为目标应用的身份标识,可通过context.applicationInfo.accessTokenId获取。第二个参数为待检查的权限名称数组。
- requestPermissionsFromUser:请求拉起权限设置弹框。如果用户拒绝授权,那么调用该接口将无法再次拉起弹框,需要用户在系统设置中手动授予权限;或者在代码中调用requestPermissionOnSetting,请求再次拉起权限设置弹框,从而引导用户正确授权。
- requestPermissionOnSetting:请求再次拉起权限设置弹框。
综合上述的配置修改和代码完善,编译运行鸿蒙App,看到权限请求弹窗如下图所示,点击弹窗右下角的允许按钮,即可给App授予录音权限。
requestPermissionsFromUser和requestPermissionOnSetting两个方法的区别有以下几点:
- requestPermissionOnSetting必须在requestPermissionsFromUser之后调用。
- requestPermissionsFromUser的权限参数可以为不同类型的权限组成,而requestPermissionOnSetting的权限参数必须来自同一个权限组。
- requestPermissionsFromUser的权限弹窗位于屏幕中央,requestPermissionOnSetting的权限弹窗位于屏幕下方。
由于应用可能请求多个来自不同权限组的权限,用户也可能只允许部分授权,那么如果应用又需要完整的权限授权的话,有关动态授权的代码就要考虑下列三个问题:
- 当前是否为首次请求授权弹窗。为了避免骚扰用户,首次弹窗之后,无论用户是否允许授权,应用都不能马上再次请求授权。只有等用户下次打开应用之后,才能调用requestPermissionOnSetting请求再次弹窗授权。
- 对每个请求的权限都调用checkAccessToken接口,从而找到未获得授权的权限列表。
- 对于未获得授权的权限列表,又要依次调用requestPermissionOnSetting接口,逐个请求再次弹窗授权。不可对权限列表一次性调用requestPermissionOnSetting,因为该接口要求权限参数必须位于同一个权限组。
上述三个动态授权问题的解决代码有些复杂,具体的处理逻辑参见《鸿蒙开发实战:从零基础到App上线》随书源码的utils/PermissionUtil.ets,这里不再赘述。
下一篇文章会介绍如何使用网络请求库http来调用网络上的http接口。
更多关于HarmonyOS 鸿蒙Next“仿抖音快手”App开发技术分享(五)申请网络访问权限的实战教程也可以访问 https://www.itying.com/category-93-b0.html
在鸿蒙Next中申请网络访问权限需要修改module.json5
配置文件。在"module"
字段下添加"requestPermissions"
节点,包含"name":"ohos.permission.INTERNET"
和"reason"
字段。示例代码如下:
"requestPermissions": [
{
"name": "ohos.permission.INTERNET",
"reason": "用于视频流加载和内容更新"
}
]
配置完成后,应用即可正常发起网络请求。该权限属于normal级别,无需用户手动授权。
更多关于HarmonyOS 鸿蒙Next“仿抖音快手”App开发技术分享(五)申请网络访问权限的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
关于HarmonyOS Next中网络权限申请的说明很详细,补充几点关键信息:
-
对于网络权限(
ohos.permission.INTERNET
),确实只需在module.json5
中声明即可,系统会自动授予。这是HarmonyOS的基础权限之一。 -
对于
user_grant
权限,需要注意权限组的概念。比如麦克风权限属于RECORD_AUDIO
权限组,申请时需要确保同组权限一起处理。 -
实际开发中建议封装权限工具类,可以参考以下核心逻辑:
- 使用
abilityAccessCtrl.createAtManager()
创建管理器 - 通过
checkAccessToken
检查权限状态 - 根据返回结果决定是否调用
requestPermissionsFromUser
- 使用
-
权限弹窗的UI位置和行为差异确实需要注意,特别是底部弹窗(
requestPermissionOnSetting
)的使用场景限制。 -
对于需要持续使用麦克风等敏感权限的场景,建议在每次使用前都检查权限状态,而不是只在应用启动时检查。
这些内容对于开发短视频类App的权限管理很有帮助,特别是处理网络访问和录音权限的结合使用场景。