鸿蒙NEXT开发【音频播放类应用交互场景实践】媒体开发

概述

对于音频播放类应用,除了歌曲播控的基础能力外,各种交互场景的设计也对用户体验有着重要的影响。本文以音乐播放器应用为例,从应用与用户、播放设备以及其他应用的交互三方面入手,分别对典型使用场景给出示例方案,为应用带来灵活多样、符合用户直觉的交互体验。

1

场景分析

根据当前HarmonyOS APP开发过程中遇到的实际音频类应用业务场景,总结提炼出如下典型场景,设计其交互功能与方案以供参考:

场景分类 典型场景 场景描述
与用户交互 播控中心操控 无需进入应用直接通过播控中心操控歌曲状态
后台播放音乐 应用位于后台长时间持续播放音乐
与音频播放设备交互 播放设备的状态发生改变 新设备可用、旧设备不可用、用户切换设备场景的适配方案
响应播放设备的指令 蓝牙耳机控制应用播放状态
用户主动切换播放设备 通过投播组件选择播放设备
与其他应用交互 与其他应用音频冲突 被其他音频打断、与其他音频并发

与用户交互

播控中心控制音乐状态

在应用接入播控中心后,用户可以直接通过播控中心修改音频播放状态,如暂停/播放、下一首、切换播放模式、拖动进度条等,应用内的音频信息和状态也会同步显示在播控中心界面上,使得用户与应用的交互更加灵活易用。同时与播控中心交互使用的AVSession还管控着应用的后台播放能力,因此对于音乐类应用一般推荐接入播控中心

应用与播控中心交互的过程如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由图可见,应用的接入流程可以主要分为三个部分:创建AVSession、监听播控中心通知以及向播控中心上报应用状态,以下分别给出具体实现:

  1. 应用创建媒体会话

    在应用的音频渲染器初始化的时候创建并激活AVSession,将此会话用作应用与播控中心交互的媒介,音乐类应用选择创建audio类型的AVSession,不同类型的AVSession对应不同的播控中心样式

import { avSession } from '@kit.AVSessionKit';
// ...
export class AVSessionController {
  private context: common.UIAbilityContext | undefined = undefined;
  private AVSession: avSession.AVSession | undefined = undefined;
  private songList: SongItem[] = [];
  private musicIndex: number | undefined = undefined;
  private audioRendererController: AudioRendererController | undefined = undefined;
  // ...
  private async initAVSession() {
    this.context = AppStorage.get('context');
    if (!this.context) {
      Logger.info(TAG, `session create failed : conext is undefined`);
      return;
    }
    this.audioRendererController = AppStorage.get('audioRendererController');
    if (!this.audioRendererController) {
      Logger.info(TAG, `session create failed : audioRendererController is undefined`);
      return;
    }
    this.AVSession = await avSession.createAVSession(this.context, "PLAY_AUDIO", 'audio');
    await this.AVSession.activate();
    // ...
  }
  // ...
}
  1. 注册播控中心通知回调

    当用户在锁屏或者其他界面时希望通过播控中心控制应用的播放状态,比如播放、暂停、下一首等,应用需要设置监听回调来对播控中心的通知做出对应的调整,只有设置了回调,播控中心侧的按钮才会亮起来,否则按钮将会置灰。

// 监听播控中心的各种通知如播放、暂停、下一首、调整进度,调用应用对应的方法响应该通知
async setListenerForMesFromController() {
  if (!this.AVSession) {
    return;
  }
  this.AVSession.on('play', this.playCall);
  this.AVSession.on('pause', this.pauseCall);
  this.AVSession.on('playNext', this.playNextCall);
  this.AVSession.on('playPrevious', this.playPreviousCall);
  this.AVSession.on('seek', this.seekCall);
  this.AVSession.on('setLoopMode', this.setLoopModeCall);
  this.AVSession.on('toggleFavorite', this.toggleFavoriteCall);
}

适配时需要注意播控中心点击循环模式图标后,应用在回调中只会收到当前播控中心的图标状态,因此开发者需要在业务代码中自己管理状态切换顺序(如:单曲循环->顺序播放->随机播放->单曲循环),根据收到的当前状态指定要切换到的下一个状态。

// 响应播控中心点击循环模式图标通知
private setLoopModeCall: (loopMode: avSession.LoopMode) => void = (loopMode: avSession.LoopMode) => {
  Logger.info(TAG, `on loopMode , do loopMode task`);
  if (!this.audioRendererController) {
    Logger.error(TAG, 'audioRendererController is undefined in setLoopModeCall');
    return;
  }
  switch (loopMode) {
    case avSession.LoopMode.LOOP_MODE_SINGLE:
      this.audioRendererController.setPlayModel(MusicPlayMode.ORDER);
      break;
    case avSession.LoopMode.LOOP_MODE_SEQUENCE:
      this.audioRendererController.setPlayModel(MusicPlayMode.RANDOM);
      break;
    case avSession.LoopMode.LOOP_MODE_SHUFFLE:
      this.audioRendererController.setPlayModel(MusicPlayMode.SINGLE_CYCLE);
      break;
    default:
      break;
  }
  this.setPlayModeToAVSession();
  this.setPlayModeToControlArea();
}

应用如果已切换到后台,用户点击播控中心,将由播控中心负责拉起应用。应用需要配置参数来选择拉起的应用和页面,并通过setLaunchAbility()方法配置给媒体会话。

private setLaunchAbility() {
  if (!this.context) {
    return;
### 鸿蒙开发所需全套工具和资源 #### 工具链与集成开发环境 (IDE) 对于鸿蒙(HarmonyOS NEXT)的开发者来说,官方推荐使用DevEco Studio作为主要的集成开发环境。该IDE集成了丰富的功能来支持从编码、编译、调试直到发布的整个流程[^1]。 #### 编程语言和支持库 - **ArkTS**: 这是一种专门为HarmonyOS设计的语言,旨在简化跨设备的应用程序编写过程。 - **ArkUI框架**: 提供了一系列用于构建用户界面的组件和服务接口。 - **Stage模型**: 支持更灵活的任务调度机制,有助于提高应用程序性能。 - **Napi组件**: 实现JavaScript和其他原生API之间的高效交互[^2]。 #### 多平台适配能力 为了满足不同硬件平台上的一致体验需求,HarmonyOS提供了强大的多端部署解决方案。这使得同一个应用可以在手机、平板电脑乃至智能家居产品上无缝运行,并保持一致的功能性和用户体验。 #### 分布式特性 通过内置的支持,开发者可以轻松创建分布式的应用程序,利用多个终端间的协同工作实现更加复杂的服务场景。比如,在家庭环境中连接各种IoT设备形成一个统一的操作网络。 #### 媒体处理和技术 涵盖了广泛的媒体处理选项,包括但不限于音频播放控制、视频流传输以及基于WebGL的游戏图形渲染等功能模块。这些都极大地扩展了可开发的内容范围。 #### 学习材料与社区支持 除了上述的技术细节外,还有大量的在线教程、文档指南甚至是实际项目的案例研究可供参考学习。特别是针对初学者而言,可以通过参与官方论坛交流获得及时的帮助和支持[^3]。 ```bash # 安装必要的依赖项并启动模拟器 $ dev_eco install dependencies $ dev_eco emulator start ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值