HarmonyOS App开发
------鸿蒙音乐播放机应用App开发
1 鸿蒙音乐播放器应用App概述
本文介绍使用ArkTS语言实现鸿蒙音乐播放器,主要包括音乐获取和音乐播放功能:获取本地音乐通过AVPlayer进行音乐播放。
2 获取本地音乐
2.1 准备资源文件
在resources下面的rawfile文件夹里放置MP3音乐文件作为本例的音乐素材,如图所示:

2.2 创建音乐文件接口
在Index.ets文件中,创建音乐文件接口Song,用来表示音乐的信息,代码如下:
|-----------------------------------------------------------------------------------------------------------------------------|
| export default interface Song { id: number; // 索引 title: string; // 标题 author: string // 作者 path: string; // 文件路径 } |
2. 3 定义音乐数组
定义音乐数组songArray,代码如下:
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| // 资源放在resources目录下的rawfile文件夹中 const SONGS: Song[] = [ { id: 1, title: '我的好兄弟', author: '小沈阳', path: '我的好兄弟.mp3' }, { id: 2, title: '胆小鬼', author: '梁咏琪', path: '胆小鬼.mp3' }, { id: 3, title: '还有我', author: '任贤齐', path: '还有我.mp3' }] |
3 音乐播放控制
3.1 构建AVPlayer实例对象
在Index.ets文件中,使用AVPlayer前需要在onPageShow()中构建一个AVPlayer实例对象,并为AVPlayer实例绑定状态随机变化回调函数。
|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| import { common } from '@kit.AbilityKit'; import { media } from '@kit.MediaKit'; @Entry @Component struct Index { private avPlayer: media.AVPlayer | null = null ; private isPlaying: boolean = false ; @State playerState: string = '暂停' @State selectedSong: Song = { id: -1, title: '', author: '', path: '' }; async onPageShow() { // 创建avPlayer实例对象 this .avPlayer = await media.createAVPlayer(); // 创建状态机变化回调函数 this .setAVPlayerCallback(); console.info('播放器准备完成') } setAVPlayerCallback() { if (this .avPlayer !== null ) { this .avPlayer.on('error', (err) => { console.error(`播放器发生错误,错误码:{err.code}, 错误信息:{err.message}`); this .avPlayer?.reset(); }); this .avPlayer.on('stateChange', async (state, reason) => { switch (state) { case 'initialized': console.info('资源初始化完成'); this .avPlayer?.prepare(); break ; case 'prepared': console.info('资源准备完成'); this .avPlayer?.play(); break ; case 'completed': console.info('播放完成'); this .avPlayer?.stop(); break ; } }); } } } |
3.2 切换音乐
切换音乐后,使用资源管理接口获取打包在HAP内的媒体资源文件并通过fdSrc属性进行播放,avPlayer.fdSrc会重新赋值新的音乐文件。
|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| import { common } from '@kit.AbilityKit'; // 以下为使用资源管理接口获取打包在HAP内的媒体资源文件并通过fdSrc属性进行播放 async changeSong(song: Song) { if (this .avPlayer !== null ) { this .avPlayer?.reset() // 创建状态机变化回调函数 this .setAVPlayerCallback(); // 通过UIAbilityContext的resourceManager成员的getRawFd接口获取媒体资源播放地址 // 返回类型为{fd,offset,length},fd为HAP包fd地址,offset为媒体资源偏移量,length为播放长度 let context = getContext(this ) as common.UIAbilityContext; let fileDescriptor = await context.resourceManager.getRawFd(song.path); // 为fdSrc赋值触发initialized状态机上报 this .avPlayer.fdSrc = fileDescriptor; } } |
3 .3 创建播放器界面
创建播放器界面,Index.ets代码如下:
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| private avPlayer: media.AVPlayer | null = null ; private isPlaying: boolean = false ; @State playerState: string = '暂停' @State selectedSong: Song = { id: -1, title: '', author: '', path: '' }; build() { Column() { Row() { Row() { Text('音乐播放器') .fontColor(Color.White).fontSize(32) }.margin({ left: 20 }) }.backgroundColor(Color.Green).height('8%').width('100%') Column() { List() { ForEach(SONGS, (song: Song) => { ListItem() { Row() { Button({ type: ButtonType.Normal }) { Row() { Text(song.id + '') .fontSize(32) Column() { Text(song.title).fontSize(20).fontWeight(700) Text(song.author).fontSize(14) }.alignItems(HorizontalAlign.Start) .margin({ left: 20 }) }.justifyContent(FlexAlign.Start) .width('90%') } .backgroundColor(Color.White) .width("100%") .height(50) .margin({ top: 10 }) .onClick(() => { this .playerState = '暂停'; this .isPlaying = true ; this .onPageShow(); this .changeSong(song); this .selectedSong = song; }) } } }) }.width('100%') }.height('84%') Row() { Row() { if (this .selectedSong.id == -1) { Text('点击歌曲开始播放') .fontSize(20).fontColor(Color.White) } else { Column() { Text(this .selectedSong.title) .fontSize(20).fontColor(Color.White) }.width('70%').alignItems(HorizontalAlign.Start) Column() { Button({ type: ButtonType.Normal, stateEffect: true }) { Text(this .playerState) .fontSize(20).fontColor(Color.White) } .borderRadius(8) .height(26) .width(70) .backgroundColor(Color.Orange) .onClick(() => { if (this .avPlayer !== null && this .isPlaying == true ) { this .avPlayer.pause() this .playerState = '继续' this .isPlaying = false } else { this .avPlayer?.play() this .playerState = '暂停' this .isPlaying = true } }) }.width('20%') } }.width('99%').margin({ left: 15 }) }.backgroundColor(Color.Green).height('8%').width('100%') }.height('100%').width('100%') } |
上述界面主题分为以下3部分:
(1)应用标题
(2)音乐列表:采用List和Listltem组件实现。只要选中音乐列表中的音乐条目,就会自动进行播放。
(3)音乐控制器:用于控制所选中的音乐的播放或者暂停。
3.4 运行
运行应用,可以看到音乐播放器运行效果,如图所示:

选中音乐列表里面的任意音乐条目,则会执行播放,效果如图所示:

单击"暂停"按钮来执行音乐播放的暂停,效果如图所示:

4.小结
本文介绍了多媒体开发,内容包括音频、视频、图片等的开发。这里通过一个实战案例介绍音乐播放器的实现过程。