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

2 回复

在鸿蒙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中网络权限申请的说明很详细,补充几点关键信息:

  1. 对于网络权限(ohos.permission.INTERNET),确实只需在module.json5中声明即可,系统会自动授予。这是HarmonyOS的基础权限之一。

  2. 对于user_grant权限,需要注意权限组的概念。比如麦克风权限属于RECORD_AUDIO权限组,申请时需要确保同组权限一起处理。

  3. 实际开发中建议封装权限工具类,可以参考以下核心逻辑:

    • 使用abilityAccessCtrl.createAtManager()创建管理器
    • 通过checkAccessToken检查权限状态
    • 根据返回结果决定是否调用requestPermissionsFromUser
  4. 权限弹窗的UI位置和行为差异确实需要注意,特别是底部弹窗(requestPermissionOnSetting)的使用场景限制。

  5. 对于需要持续使用麦克风等敏感权限的场景,建议在每次使用前都检查权限状态,而不是只在应用启动时检查。

这些内容对于开发短视频类App的权限管理很有帮助,特别是处理网络访问和录音权限的结合使用场景。

回到顶部