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简约清新,贴合鸿蒙极简美学,动画丝滑、无卡顿、无广告,是一款完美替代商用音乐软件的本地播放器!


相关推荐
梦想不只是梦与想4 小时前
HarmonyOS应用分层架构设计
harmonyos·分层架构·一次开发,多端部署
MardaWang6 小时前
当滚动逃离了框架 ——HarmonyOS Web 与原生混排滚动的冲突本质与解法
harmonyos·arkts·鸿蒙·deveco studio
tsqtsqtsq03098 小时前
DevEco Studio 介绍
harmonyos
传奇开心果编程10 小时前
【现代声明式UI学与练】第4课 列表渲染与 key——如何高效渲染列表、key 的作用、列表重排时的状态保持
学习·flutter·react native·ui·swiftui·android jetpack
HwJack2011 小时前
【共创稿事节】HarmonyOS 7文旅展陈展厅大空间 3DGS 重建的分块策略与拼接踩坑
3d·华为·harmonyos
熊猫钓鱼>_>13 小时前
Kotlin Multiplatform for OpenHarmony 实战:为 kotlin-inject 实现依赖注入适配
开发语言·华为·kotlin·ai编程·inject·鸿蒙·openharmony
m0_7381858213 小时前
Flutter 鸿蒙化实战:media_info 适配 OpenHarmony,媒体信息与缩略图
flutter·华为·harmonyos·鸿蒙·媒体
m0_7381858214 小时前
Flutter 鸿蒙化实战:just_audio 适配 OpenHarmony,功能强大的播放器
flutter·华为·harmonyos·鸿蒙
翼辉cto14 小时前
Kotlin Multiplatform 三方库 SQLDelight 的 OpenHarmony 鸿蒙化适配实战
开发语言·kotlin·harmonyos