基于 HarmonyOS 的本地音乐播放器开发实践
原创
巴拉巴拉~~ 2025-12-09 23:35:41 发布20019 浏览 535 点赞 0 收藏
本项目实现一个支持 本地音频播放、后台运行、通知栏控制 的音乐播放器,适用于手机、平板等设备。重点解决 HarmonyOS 下多媒体应用的典型痛点。
2. 技术架构
- UI 层:ArkTS + ArkUI(声明式)
- 业务层:
AVPlayer+mediaLibrary - 后台服务:
ServiceExtensionAbility - 系统交互:通知栏、媒体按钮事件
3. 关键模块实现
3.1 获取本地音频文件
typescript编辑import mediaLibrary from '@ohos.multimedia.mediaLibrary';
async function fetchLocalAudios(): Promise<mediaLibrary.SongFileInfo[]> {
const context = getContext(this as any); // 在 Ability 中获取上下文
const mediaLib = await mediaLibrary.getMediaLibrary(context);
const audioOptions: mediaLibrary.MediaAssetOptions = {
selections: mediaLibrary.MediaType.AUDIO.toString(),
uri: mediaLibrary.FileKey.URI,
order: mediaLibrary.FileKey.DISPLAY_NAME + ' ASC'
};
const result = await mediaLib.getFileAssets(audioOptions);
const songs: mediaLibrary.SongFileInfo[] = [];
for (let i = 0; i < result.length; i++) {
const asset = result[i];
const fileInfo = await asset.getSongFileInfo();
songs.push(fileInfo);
}
return songs;
}3.2 AVPlayer 播放控制(封装为 MusicPlayer 类)
typescript编辑// music_player.ts
import media from '@ohos.multimedia.media';
export class MusicPlayer {
private avPlayer: media.AVPlayer | null = null;
private currentUri: string = '';
private onPlayStateChanged?: (isPlaying: boolean) => void;
async init() {
this.avPlayer = await media.createAVPlayer();
this.avPlayer.on('playbackCompleted', () => {
console.log('Playback completed');
});
this.avPlayer.on('stateChange', (state) => {
if (state === 'playing') {
this.onPlayStateChanged?.(true);
} else if (state === 'paused') {
this.onPlayStateChanged?.(false);
}
});
}
async setDataSource(uri: string) {
if (this.currentUri === uri && this.avPlayer?.state === 'prepared') {
return; // 已加载
}
this.currentUri = uri;
await this.avPlayer?.release(); // 释放旧资源
await this.init();
this.avPlayer?.setDataSource(uri);
await this.avPlayer?.prepare();
}
play() {
this.avPlayer?.play();
}
pause() {
this.avPlayer?.pause();
}
seek(timeMs: number) {
this.avPlayer?.seek(timeMs);
}
getCurrentTime(): number {
return this.avPlayer?.currentTime ?? 0;
}
setOnPlayStateChange(callback: (isPlaying: boolean) => void) {
this.onPlayStateChanged = callback;
}
}3.3 后台服务保活(ServiceExtensionAbility)
在 module.json5 中声明:
json编辑{
"extensionAbilities": [
{
"name": "MusicPlaybackService",
"srcEntry": "./service/MusicPlaybackService.ts",
"type": "service",
"backgroundModes": ["audio"]
}
]
}服务内启动前台通知(关键):
typescript编辑// MusicPlaybackService.ts
import notification from '@ohos.notification';
async onCreate() {
// 创建前台通知,防止系统杀进程
const request = {
id: 1001,
contentTitle: '音乐播放中',
contentText: '点击返回播放器',
contentType: notification.ContentType.NOTIFICATION_CONTENT_NORMAL
};
await notification.publish(request);
}4. 性能与兼容性优化
- 内存泄漏:确保
AVPlayer.release()在页面销毁时调用 - 权限申请:需在
module.json5声明ohos.permission.READ_MEDIA和ohos.permission.MEDIA_CONTROL - 多设备适配:使用
@ohos.window判断设备类型,调整 UI 布局
5. 项目价值
该项目是 HarmonyOS 多媒体开发的“最小可行产品”(MVP),可作为模板扩展至在线音乐、播客等场景。
©本站发布的所有内容,包括但不限于文字、图片、音频、视频、图表、标志、标识、广告、商标、商号、域名、软件、程序等,除特别标明外,均来源于网络或用户投稿,版权归原作者或原出处所有。我们致力于保护原作者版权,若涉及版权问题,请及时联系我们进行处理。
分类
HarmonyOS
标签
鸿蒙
相关推荐
微信鸿蒙版 App 扫码登录手表端要求公布,手机系统需升级至 HarmonyOS 6.0.0.130 及以上版本
1361
02026 HarmonyOS Connect伙伴峰会上海站圆满结束
1656
0【我的首款鸿蒙上架应用】用鸿蒙,把旅行账单变成“电子手帐”
鸿蒙小助手
7468
0华为鸿蒙智家推出首款搭载旗舰手机级芯片的家庭主机
云端物理学家
3312
0
巴拉巴拉~~
我还没有写个人简介......
47
帖子
0
提问
99
粉丝
最新发布
纯血鸿蒙HarmonyOS NEXT学习路线——从入门到企业级开发
2025-12-23 14:37:48 发布鸿蒙ArkTS开发规范实战指南——从规范到高效编码
2025-12-23 14:37:10 发布热门推荐