HarmonyOS 鸿蒙Next音频应用开发流程

发布于 1周前 作者 bupafengyu 来自 鸿蒙OS

HarmonyOS 鸿蒙Next音频应用开发流程

音频应用开发流程

一、需要使用到的系统Kit

  1. Media Kit : 用于播放音频
  2. BackgroundTasks Kit:用于设置长时任务,保证引用切入后台时继续播放
  3. AVSession Kit:保证应用中的音频能通过播控中心控制各种操作

二、使用Media Kit 里的AVPlayer播放音频,具体步骤如下:

  1. 创建实例createAVPlayer(),AVPlayer初始化idle状态。
  2. 设置业务需要的监听事件,搭配全流程场景使用。支持的监听事件包括:

事件类型

说明

stateChange

必要事件,监听播放器的state属性改变。

error

必要事件,监听播放器的错误信息。

durationUpdate

用于进度条,监听进度条长度,刷新资源时长。

timeUpdate

用于进度条,监听进度条当前位置,刷新当前时间。

seekDone

响应API调用,监听seek()请求完成情况。

当使用seek()跳转到指定播放位置后,如果seek操作成功,将上报该事件。

speedDone

响应API调用,监听setSpeed()请求完成情况。

当使用setSpeed()设置播放倍速后,如果setSpeed操作成功,将上报该事件。

volumeChange

响应API调用,监听setVolume()请求完成情况。

当使用setVolume()调节播放音量后,如果setVolume操作成功,将上报该事件。

bufferingUpdate

用于网络播放,监听网络播放缓冲信息,用于上报缓冲百分比以及缓存播放进度。

audioInterrupt

监听音频焦点切换信息,搭配属性audioInterruptMode使用。

如果当前设备存在多个音频正在播放,音频焦点被切换(即播放其他媒体如通话等)时将上报该事件,应用可以及时处理。

  1. 设置资源:设置属性url,AVPlayer进入initialized状态。

说明

下面代码示例中的url仅作示意使用,开发者需根据实际情况,确认资源有效性并设置:

此外,如果需要设置音频渲染信息,则只允许在initialized状态下,第一次调用prepare()之前设置,以便音频渲染器信息在之后生效。若媒体源包含视频,则usage默认值为STREAM_USAGE_MOVIE,否则usage默认值为STREAM_USAGE_MUSIC。rendererFlags默认值为0。若默认usage不满足需求,则须主动配置audio.AudioRendererInfo

  1. 准备播放:调用prepare(),AVPlayer进入prepared状态,此时可以获取duration,设置音量。
  2. 音频播控:播放play(),暂停pause(),跳转seek(),停止stop() 等操作。
  3. (可选)更换资源:调用reset()重置资源,AVPlayer重新进入idle状态,允许更换资源url。
  4. 退出播放:调用release()销毁实例,AVPlayer进入released状态,退出播放。

三、设置后台长时任务

  1. 需要申请ohos.permission.KEEP_BACKGROUND_RUNNING权限,配置方式请参见声明权限
  2. 声明后台模式类型。

在module.json5配置文件中为需要使用长时任务的UIAbility声明相应的长时任务类型(配置文件中填写长时任务类型的配置项)。

    1.  “module”: {
    2.      “abilities”: [
    3.          {
    4.              “backgroundModes”: [
    5.               // 长时任务类型的配置项
    6.              “audioRecording”
    7.              ]
    8.          }
    9.      ],
    10.      …
    11.  }
  1. 导入模块。

长时任务相关的模块为@ohos.resourceschedule.backgroundTaskManager和@ohos.app.ability.wantAgent,其余模块按实际需要导入。

    1.  import { backgroundTaskManager } from ‘@kit.BackgroundTasksKit’;
    2.  import { AbilityConstant, UIAbility, Want } from ‘@kit.AbilityKit’;
    3.  import { window } from ‘@kit.ArkUI’;
    4.  import { rpc } from ‘@kit.IPCKit’
    5.  import { BusinessError } from ‘@kit.BasicServicesKit’;
    6.  import { wantAgent, WantAgent } from ‘@kit.AbilityKit’;
  1. 申请和取消长时任务。
    • 在Stage模型中,长时任务支持设备本应用申请,也支持跨设备或跨应用申请,跨设备或跨应用仅对系统应用开放。

设备本应用申请长时任务示例代码如下:

    1.  @Entry
    2.  @Component
    3.  struct Index {
    4.    @State message: string = ‘ContinuousTask’;
    5.   // 通过getContext方法,来获取page所在的UIAbility上下文。
    6.    private context: Context = getContext(this);
    7.    startContinuousTask() {
    8.      let wantAgentInfo: wantAgent.WantAgentInfo = {
    9.        // 点击通知后,将要执行的动作列表
    10.        // 添加需要被拉起应用的bundleName和abilityName
    11.        wants: [
    12.          {
    13.            bundleName: “com.example.myapplication”,
    14.            abilityName: “MainAbility”
    15.          }
    16.        ],
    17.        // 指定点击通知栏消息后的动作是拉起ability
    18.        actionType: wantAgent.OperationType.START_ABILITY,
    19.        // 使用者自定义的一个私有值
    20.        requestCode: 0,
    21.        // 点击通知后,动作执行属性
    22.        actionFlags: [wantAgent.WantAgentFlags.UPDATE_PRESENT_FLAG]
    23.      };
    24.      // 通过wantAgent模块下getWantAgent方法获取WantAgent对象
    25.      wantAgent.getWantAgent(wantAgentInfo).then((wantAgentObj: WantAgent) => {
    26.        backgroundTaskManager.startBackgroundRunning(this.context,
    27.          backgroundTaskManager.BackgroundMode.AUDIO_RECORDING, wantAgentObj).then(() => {
    28.          // 此处执行具体的长时任务逻辑,如放音等。
    29.          console.info(Succeeded in operationing startBackgroundRunning.);
    30.        }).catch((err: BusinessError) => {
    31.          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;">);
    32.        });
    33.      });
    34.    }
    35.    stopContinuousTask() {
    36.       backgroundTaskManager.stopBackgroundRunning(this.context).then(() => {
    37.         console.info(Succeeded in operationing stopBackgroundRunning.);
    38.       }).catch((err: BusinessError) => {
    39.         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;">);
    40.       });
    41.    }
    42.    build() {
    43.      Row() {
    44.        Column() {
    45.          Text(“Index”)
    46.            .fontSize(50)
    47.            .fontWeight(FontWeight.Bold)
    48.         Button() {
    49.            Text(申请长时任务’).fontSize(25).fontWeight(FontWeight.Bold)
    50.          }
    51.          .type(ButtonType.Capsule)
    52.          .margin({ top: 10 })
    53.          .backgroundColor(’#0D9FFB’)
    54.          .width(250)
    55.          .height(40)
    56.          .onClick(() => {
    57.            // 通过按钮申请长时任务
    58.            this.startContinuousTask();
    59.          })
    60.          Button() {
    61.            Text(取消长时任务’).fontSize(25).fontWeight(FontWeight.Bold)
    62.          }
    63.          .type(ButtonType.Capsule)
    64.          .margin({ top: 10 })
    65.          .backgroundColor(’#0D9FFB’)
    66.          .width(250)
    67.          .height(40)
    68.          .onClick(() => {
    69.            // 此处结束具体的长时任务的执行
    70.            // 通过按钮取消长时任务
    71.            this.stopContinuousTask();
    72.          })
    73.        }
    74.        .width(‘100%’)
    75.      }
    76.      .height(‘100%’)
    77.    }
    78.  }

四、使用AVSession Kit 保证自己的应用进入播控中心

  1. 确定应用需要创建的会话类型,创建对应的会话,不同类型决定了播控中心展示的控制模板样式。
  2. 按需创建后台任务
  3. 设置必要的元数据(Metadata,以在播控中心展示响应的信息,包括不限于:当前媒体的ID(assetId),上一首媒体的ID(previousAssetId),下一首媒体的ID(nextAssetId),标题(title),专辑作者(author),专辑名称(album),词作者(writer),媒体时长(duration)等属性。
  4. 设置播放相关的状态,包括不限于:当前媒体的播放状态(state)、播放位置(position)、播放倍速(speed)、缓冲时间(bufferedTime)、循环模式(loopMode)、是否收藏(isFavorite)、正在播放的媒体Id(activeItemId)、自定义媒体数据(extras)等属性。
  5. 按需注册不同的控制命令,包括不限于:播放/暂停、上下一首、快进快退、收藏、循环模式、进度条。
  6. 应用退出或者无对应业务时,注销会话。


更多关于HarmonyOS 鸿蒙Next音频应用开发流程的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS 鸿蒙Next音频应用开发流程的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


HarmonyOS 鸿蒙Next音频应用开发流程主要包括以下几个步骤:

  1. 环境准备:首先,确保你已经安装了HarmonyOS SDK和DevEco Studio开发工具。这些工具是开发HarmonyOS应用的基础,提供了编译、调试等功能。

  2. 创建项目:在DevEco Studio中,选择创建一个新的HarmonyOS项目,并选择音频应用开发模板(如果提供)。根据项目需求配置项目名称、包名等信息。

  3. 配置权限:在config.json文件中,添加音频相关的权限配置,例如录制音频、播放音频等。这是确保应用能够正常访问音频硬件的前提。

  4. 编写代码:利用HarmonyOS提供的API进行音频功能的开发。例如,使用media.audio模块中的API进行音频录制和播放。根据需求实现音频的采集、处理、播放等功能。

  5. 测试与调试:在DevEco Studio中运行应用,进行音频功能的测试。确保应用能够正确录制和播放音频,且音质符合要求。

  6. 打包与发布:完成测试后,使用DevEco Studio将应用打包成HAP或APP格式,并根据HarmonyOS应用市场的发布流程进行发布。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。

回到顶部