HarmonyOS 鸿蒙Next音频应用开发流程
HarmonyOS 鸿蒙Next音频应用开发流程
音频应用开发流程
一、需要使用到的系统Kit
- Media Kit : 用于播放音频
- BackgroundTasks Kit:用于设置长时任务,保证引用切入后台时继续播放
- AVSession Kit:保证应用中的音频能通过播控中心控制各种操作
二、使用Media Kit 里的AVPlayer播放音频,具体步骤如下:
- 创建实例createAVPlayer(),AVPlayer初始化idle状态。
- 设置业务需要的监听事件,搭配全流程场景使用。支持的监听事件包括:
事件类型 | 说明 |
stateChange | 必要事件,监听播放器的state属性改变。 |
error | 必要事件,监听播放器的错误信息。 |
durationUpdate | 用于进度条,监听进度条长度,刷新资源时长。 |
timeUpdate | 用于进度条,监听进度条当前位置,刷新当前时间。 |
seekDone | 响应API调用,监听seek()请求完成情况。 当使用seek()跳转到指定播放位置后,如果seek操作成功,将上报该事件。 |
speedDone | 响应API调用,监听setSpeed()请求完成情况。 当使用setSpeed()设置播放倍速后,如果setSpeed操作成功,将上报该事件。 |
volumeChange | 响应API调用,监听setVolume()请求完成情况。 当使用setVolume()调节播放音量后,如果setVolume操作成功,将上报该事件。 |
bufferingUpdate | 用于网络播放,监听网络播放缓冲信息,用于上报缓冲百分比以及缓存播放进度。 |
audioInterrupt | 监听音频焦点切换信息,搭配属性audioInterruptMode使用。 如果当前设备存在多个音频正在播放,音频焦点被切换(即播放其他媒体如通话等)时将上报该事件,应用可以及时处理。 |
- 设置资源:设置属性url,AVPlayer进入initialized状态。
说明
下面代码示例中的url仅作示意使用,开发者需根据实际情况,确认资源有效性并设置:
-
- 如果使用本地资源播放,必须确认资源文件可用,并使用应用沙箱路径访问对应资源,参考获取应用文件路径。应用沙箱的介绍及如何向应用沙箱推送文件,请参考文件管理。
- 如果使用网络播放路径,需声明权限:ohos.permission.INTERNET。
- 如果使用ResourceManager.getRawFd打开HAP资源文件描述符,使用方法可参考ResourceManager API参考。
- 需要使用支持的播放格式与协议。
此外,如果需要设置音频渲染信息,则只允许在initialized状态下,第一次调用prepare()之前设置,以便音频渲染器信息在之后生效。若媒体源包含视频,则usage默认值为STREAM_USAGE_MOVIE,否则usage默认值为STREAM_USAGE_MUSIC。rendererFlags默认值为0。若默认usage不满足需求,则须主动配置audio.AudioRendererInfo。
- 准备播放:调用prepare(),AVPlayer进入prepared状态,此时可以获取duration,设置音量。
- 音频播控:播放play(),暂停pause(),跳转seek(),停止stop() 等操作。
- (可选)更换资源:调用reset()重置资源,AVPlayer重新进入idle状态,允许更换资源url。
- 退出播放:调用release()销毁实例,AVPlayer进入released状态,退出播放。
三、设置后台长时任务
- 需要申请ohos.permission.KEEP_BACKGROUND_RUNNING权限,配置方式请参见声明权限。
- 声明后台模式类型。
在module.json5配置文件中为需要使用长时任务的UIAbility声明相应的长时任务类型(配置文件中填写长时任务类型的配置项)。
-
- “module”: {
- “abilities”: [
- {
- “backgroundModes”: [
- // 长时任务类型的配置项
- “audioRecording”
- ]
- }
- ],
- …
- }
- 导入模块。
长时任务相关的模块为@ohos.resourceschedule.backgroundTaskManager和@ohos.app.ability.wantAgent,其余模块按实际需要导入。
-
- import { backgroundTaskManager } from ‘@kit.BackgroundTasksKit’;
- import { AbilityConstant, UIAbility, Want } from ‘@kit.AbilityKit’;
- import { window } from ‘@kit.ArkUI’;
- import { rpc } from ‘@kit.IPCKit’
- import { BusinessError } from ‘@kit.BasicServicesKit’;
- import { wantAgent, WantAgent } from ‘@kit.AbilityKit’;
- 申请和取消长时任务。
- 在Stage模型中,长时任务支持设备本应用申请,也支持跨设备或跨应用申请,跨设备或跨应用仅对系统应用开放。
设备本应用申请长时任务示例代码如下:
-
- @Entry
- @Component
- struct Index {
- @State message: string = ‘ContinuousTask’;
- // 通过getContext方法,来获取page所在的UIAbility上下文。
- private context: Context = getContext(this);
- startContinuousTask() {
- let wantAgentInfo: wantAgent.WantAgentInfo = {
- // 点击通知后,将要执行的动作列表
- // 添加需要被拉起应用的bundleName和abilityName
- wants: [
- {
- bundleName: “com.example.myapplication”,
- abilityName: “MainAbility”
- }
- ],
- // 指定点击通知栏消息后的动作是拉起ability
- actionType: wantAgent.OperationType.START_ABILITY,
- // 使用者自定义的一个私有值
- requestCode: 0,
- // 点击通知后,动作执行属性
- actionFlags: [wantAgent.WantAgentFlags.UPDATE_PRESENT_FLAG]
- };
- // 通过wantAgent模块下getWantAgent方法获取WantAgent对象
- wantAgent.getWantAgent(wantAgentInfo).then((wantAgentObj: WantAgent) => {
- backgroundTaskManager.startBackgroundRunning(this.context,
- backgroundTaskManager.BackgroundMode.AUDIO_RECORDING, wantAgentObj).then(() => {
- // 此处执行具体的长时任务逻辑,如放音等。
- console.info(
Succeeded in operationing startBackgroundRunning.
); - }).catch((err: BusinessError) => {
- console.error(
Failed to operation startBackgroundRunning. Code is </span><span style="color: black;padding: 0.0cm;">${err.code}</span><span style="color: rgb(104,153,50);padding: 0.0cm;">, message is </span><span style="color: black;padding: 0.0cm;">${err.message}</span><span style="color: rgb(104,153,50);padding: 0.0cm;">
); - });
- });
- }
- stopContinuousTask() {
- backgroundTaskManager.stopBackgroundRunning(this.context).then(() => {
- console.info(
Succeeded in operationing stopBackgroundRunning.
); - }).catch((err: BusinessError) => {
- console.error(
Failed to operation stopBackgroundRunning. Code is </span><span style="color: black;padding: 0.0cm;">${err.code}</span><span style="color: rgb(104,153,50);padding: 0.0cm;">, message is </span><span style="color: black;padding: 0.0cm;">${err.message}</span><span style="color: rgb(104,153,50);padding: 0.0cm;">
); - });
- }
- build() {
- Row() {
- Column() {
- Text(“Index”)
- .fontSize(50)
- .fontWeight(FontWeight.Bold)
- Button() {
- Text(‘申请长时任务’).fontSize(25).fontWeight(FontWeight.Bold)
- }
- .type(ButtonType.Capsule)
- .margin({ top: 10 })
- .backgroundColor(’#0D9FFB’)
- .width(250)
- .height(40)
- .onClick(() => {
- // 通过按钮申请长时任务
- this.startContinuousTask();
- })
- Button() {
- Text(‘取消长时任务’).fontSize(25).fontWeight(FontWeight.Bold)
- }
- .type(ButtonType.Capsule)
- .margin({ top: 10 })
- .backgroundColor(’#0D9FFB’)
- .width(250)
- .height(40)
- .onClick(() => {
- // 此处结束具体的长时任务的执行
- // 通过按钮取消长时任务
- this.stopContinuousTask();
- })
- }
- .width(‘100%’)
- }
- .height(‘100%’)
- }
- }
四、使用AVSession Kit 保证自己的应用进入播控中心
- 确定应用需要创建的会话类型,创建对应的会话,不同类型决定了播控中心展示的控制模板样式。
- 按需创建后台任务。
- 设置必要的元数据(Metadata),以在播控中心展示响应的信息,包括不限于:当前媒体的ID(assetId),上一首媒体的ID(previousAssetId),下一首媒体的ID(nextAssetId),标题(title),专辑作者(author),专辑名称(album),词作者(writer),媒体时长(duration)等属性。
- 设置播放相关的状态,包括不限于:当前媒体的播放状态(state)、播放位置(position)、播放倍速(speed)、缓冲时间(bufferedTime)、循环模式(loopMode)、是否收藏(isFavorite)、正在播放的媒体Id(activeItemId)、自定义媒体数据(extras)等属性。
- 按需注册不同的控制命令,包括不限于:播放/暂停、上下一首、快进快退、收藏、循环模式、进度条。
- 应用退出或者无对应业务时,注销会话。
更多关于HarmonyOS 鸿蒙Next音频应用开发流程的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
更多关于HarmonyOS 鸿蒙Next音频应用开发流程的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
HarmonyOS 鸿蒙Next音频应用开发流程主要包括以下几个步骤:
-
环境准备:首先,确保你已经安装了HarmonyOS SDK和DevEco Studio开发工具。这些工具是开发HarmonyOS应用的基础,提供了编译、调试等功能。
-
创建项目:在DevEco Studio中,选择创建一个新的HarmonyOS项目,并选择音频应用开发模板(如果提供)。根据项目需求配置项目名称、包名等信息。
-
配置权限:在
config.json
文件中,添加音频相关的权限配置,例如录制音频、播放音频等。这是确保应用能够正常访问音频硬件的前提。 -
编写代码:利用HarmonyOS提供的API进行音频功能的开发。例如,使用
media.audio
模块中的API进行音频录制和播放。根据需求实现音频的采集、处理、播放等功能。 -
测试与调试:在DevEco Studio中运行应用,进行音频功能的测试。确保应用能够正确录制和播放音频,且音质符合要求。
-
打包与发布:完成测试后,使用DevEco Studio将应用打包成HAP或APP格式,并根据HarmonyOS应用市场的发布流程进行发布。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。