Flutter for OpenHarmony 本地音乐播放器APP

Flutter for OpenHarmony 本地音乐播放器APP

开源鸿蒙跨平台社区:https://gitee.com/openharmony-sig/flutter_flutter


📖 项目概述

现在市面上音乐APP广告泛滥、强制开会员、后台偷跑流量、复杂臃肿!🙄 很多鸿蒙用户只想简简单单播放手机本地音乐,不需要直播、推荐、充值弹窗!传统音乐软件痛点非常明显:

  • 广告繁多:开屏广告、弹窗广告、推送广告,严重干扰听歌体验

  • 强制联网:哪怕播放本地歌曲也要联网校验、加载推荐

  • 占用过大:安装包几百兆,低配鸿蒙手机卡顿发烫

  • 权限过度:索要通讯录、定位等无关权限,隐私不安全

今天带大家从零开发一款纯净无广告、轻量化本地音乐播放器✨!基于 Flutter for OpenHarmony 开发,只专注本地音乐扫描、播放、收藏、歌单,极简UI、超低功耗,完美适配鸿蒙手机、平板、智慧屏,无任何多余流氓功能!


🎯 核心功能

功能模块 具体能力 体验亮点
🎵 本地音乐扫描 全盘扫描音频文件、自动分类筛选、过滤无效音频 一键导入全部歌曲,无需手动添加!
▶️ 多功能播放 顺序/单曲/随机播放、进度拖拽、音量调节 手势操作丝滑,贴合鸿蒙原生交互!
❤️ 收藏歌单 歌曲收藏、自定义歌单、批量添加歌曲 个性化管理,打造专属音乐库!
🌙 系统适配 深浅色模式、锁屏播放、后台保活播放 熄屏也能切歌,适配鸿蒙系统规则!

💡 第三方库选择理由(OpenHarmony 专属适配)

🎧 audioplayers_ohos --- 鸿蒙专属音频播放库

OpenHarmony 适配优势

  • 🔊 对接鸿蒙原生音频服务,后台保活播放,切应用不中断音乐

  • ⚡ 解码效率极高,无损音乐、高清音频流畅解析无杂音

  • 🔋 功耗优化,播放状态下极低耗电,适合长时间听歌

  • 🎛️ 适配鸿蒙音量键、耳机线控,原生操控逻辑一致

📂 on_audio_query --- 本地音频扫描库

OpenHarmony 适配优势

  • 📁 适配鸿蒙沙箱文件权限,安全扫描本地音频文件

  • ⚙️ 自动过滤短视频杂音、录音文件,只保留正规音乐

  • 🖼️ 自动读取歌曲封面、歌手、时长,无需手动解析

  • 🚀 扫描速度快,千首歌曲5秒内全部加载完成

🎞️ shimmer --- 骨架屏加载动画库

OpenHarmony 适配优势

  • ✨ 遵循鸿蒙柔和动效设计,加载动画简约高级不刺眼

  • 📉 极低渲染功耗,低配鸿蒙设备也不会卡顿掉帧

  • 🌓 自动适配深浅色模式,动画色调跟随系统切换

  • 🧩 轻量无冗余,不增加APP安装包体积

💾 hive_ohos --- 鸿蒙高性能本地存储

OpenHarmony 适配优势

  • 🗄️ 加密存储收藏歌曲、播放记录,重启APP数据不丢失

  • ⚡ 读写速度远超传统存储,打开秒加载播放列表

  • ☁️ 适配鸿蒙分布式数据,多设备同步收藏歌单

  • 🛡️ 沙箱隔离存储,保护用户音乐隐私数据


📦 环境配置

pubspec.yaml 依赖配置

yaml 复制代码
dependencies:
  flutter:
    sdk: flutter
  audioplayers_ohos: ^5.2.0      # 鸿蒙音频播放
  on_audio_query: ^2.9.0         # 本地音乐扫描
  shimmer: ^3.1.0                # 骨架加载动画
  hive_ohos: ^2.2.0              # 本地持久化存储
  hive_flutter_ohos: ^1.1.0

OpenHarmony 权限配置

module\.json5 中添加:

json 复制代码
"requestPermissions": [
  {
    "name": "ohos.permission.READ_MEDIA",
    "reason": "读取本地音乐音频文件"
  },
  {
    "name": "ohos.permission.BACKGROUND_AUDIO",
    "reason": "允许后台持续播放音乐"
  }
]

🧩 分模块详解

1️⃣ 音乐数据模型 --- 规范歌曲信息

dart 复制代码
class MusicSong extends HiveObject {
  @HiveField(0) String songName;
  @HiveField(1) String singer;
  @HiveField(2) String songPath;
  @HiveField(3) int duration;
  @HiveField(4) bool isCollect;
  MusicSong({required this.songName,required this.singer,
    required this.songPath,required this.duration,this.isCollect = false});
}

2️⃣ 本地音乐扫描 --- 全盘读取音频

dart 复制代码
Future<List<MusicSong>> scanLocalMusic() async {
  OnAudioQuery audioQuery = OnAudioQuery();
  List<SongModel> songList = await audioQuery.querySongs();
  return songList.map((e) => MusicSong(
      songName: e.title,singer: e.artist ?? "未知歌手",
      songPath: e.data,duration: e.duration ?? 0)).toList();
}

3️⃣ 音频播放控制器 --- 播放暂停管理

dart 复制代码
final AudioPlayer player = AudioPlayer();
Future<void> playMusic(String path) async {
  await player.setSourceDeviceFile(path);
  await player.setVolume(1.0);
  await player.resume();
}

4️⃣ 进度条拖拽 --- 精准跳转播放位置

dart 复制代码
Widget buildProgressSlider() {
  return Slider(min: 0,max: totalTime.value.toDouble(),
    value: currentTime.value,onChanged: (v) async{
      await player.seek(Duration(milliseconds: v.toInt()));
    });
}

5️⃣ 播放模式切换 --- 顺序/随机/单曲

dart 复制代码
void changePlayMode() {
  if(mode == PlayMode.sequence) mode = PlayMode.random;
  else if(mode == PlayMode.random) mode = PlayMode.single;
  else mode = PlayMode.sequence;
  showToast("已切换为${mode.name}播放模式");
}

6️⃣ 歌曲收藏功能 --- 本地永久保存

dart 复制代码
Future<void> collectSong(MusicSong song) async {
  song.isCollect = !song.isCollect;
  await song.save();
  if(song.isCollect){
    showToast("❤️ 收藏成功");
  }else showToast("已取消收藏");
}

7️⃣ 骨架屏加载 --- 优化空白等待体验

dart 复制代码
Widget buildLoadingSkeleton() {
  return Shimmer.fromColors(baseColor: Colors.grey[200]!,
    highlightColor: Colors.white,child: ListView.builder(
    itemCount: 8,itemBuilder: (_,i) => MusicSkeletonItem()));
}




🏆 完整实现总结

📁 项目结构

Plain 复制代码
lib/
├── models/          # 音乐实体模型
├── screens/         # 页面
│   ├── music_list.dart    # 歌曲列表页
│   ├── play_page.dart     # 播放详情页
│   └── collect_page.dart  # 我的收藏页
├── widgets/         # 播放器组件、骨架屏
└── utils/           # 音频工具、存储工具

✨ 核心亮点总结

  1. 零广告纯纯净:无联网、无推送、无充值,纯粹本地音乐播放

  2. 鸿蒙深度适配:后台播放、线控切歌、熄屏播放全部支持

  3. 极致轻量化:安装包不足15MB,低配鸿蒙手机流畅运行

  4. 隐私安全可靠:仅读取本地音频,无多余权限、无数据上传

🎮 运行效果描述

在OpenHarmony设备安装运行后,首次授权媒体权限,APP自动全盘扫描本地音乐。首页展示全部歌曲列表,搭配柔和骨架屏加载动画;点击歌曲进入播放页,展示歌曲封面、进度条、播放模式切换按钮;支持后台挂听、锁屏控歌;喜欢的歌曲一键收藏,收藏数据永久本地保存。整体UI简约清新,贴合鸿蒙极简美学,动画丝滑、无卡顿、无广告,是一款完美替代商用音乐软件的本地播放器!


相关推荐
花椒技术1 天前
HJPusher / HJPlayer SDK 实践:我们为什么把直播推播链路拆成一套可复用能力
设计模式·harmonyos·直播
用户965597361901 天前
Provider vs Bloc vs GetX vs Riverpod:Flutter 状态管理方案怎么选?
flutter
一维Ace1 天前
HarmonyOS ArkTS 按钮组件全解:Button、Toggle 状态交互实战
harmonyos
恋猫de小郭1 天前
Flutter Patchwork,不用 Fork 改依赖包源码的第三方工具
android·前端·flutter
程序员老刘2 天前
跑分第一的编程大模型,我为啥不用?
flutter·ai编程·vibecoding
anyup2 天前
来简单聊聊鸿蒙开发,万元奖金的事~
前端·华为·harmonyos
Georgewu2 天前
【无测试机别害怕】华为云鸿蒙云手机南:从零到联调全流程详解
harmonyos
恋猫de小郭2 天前
苹果 AirPods 协议,Android 也可以使用完整版 AirPods 能力
android·前端·flutter
张风捷特烈2 天前
Flutter 类库大揭秘#01 | path_provider架构与设计
android·flutter
Georgewu3 天前
【HarmonyOS 7】DevEco Code安装与使用
harmonyos