基于 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_MEDIAohos.permission.MEDIA_CONTROL
  • 多设备适配:使用 @ohos.window 判断设备类型,调整 UI 布局

5. 项目价值

该项目是 HarmonyOS 多媒体开发的“最小可行产品”(MVP),可作为模板扩展至在线音乐、播客等场景。


©本站发布的所有内容,包括但不限于文字、图片、音频、视频、图表、标志、标识、广告、商标、商号、域名、软件、程序等,除特别标明外,均来源于网络或用户投稿,版权归原作者或原出处所有。我们致力于保护原作者版权,若涉及版权问题,请及时联系我们进行处理。
分类
HarmonyOS