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 依赖配置
dependencies:flutter:sdk:flutteraudioplayers_ohos:^5.2.0# 鸿蒙音频播放on_audio_query:^2.9.0# 本地音乐扫描shimmer:^3.1.0# 骨架加载动画hive_ohos:^2.2.0# 本地持久化存储hive_flutter_ohos:^1.1.0OpenHarmony 权限配置
在module\.json5中添加:
"requestPermissions":[{"name":"ohos.permission.READ_MEDIA","reason":"读取本地音乐音频文件"},{"name":"ohos.permission.BACKGROUND_AUDIO","reason":"允许后台持续播放音乐"}]🧩 分模块详解
1️⃣ 音乐数据模型 — 规范歌曲信息
classMusicSongextendsHiveObject{@HiveField(0)StringsongName;@HiveField(1)Stringsinger;@HiveField(2)StringsongPath;@HiveField(3)int duration;@HiveField(4)bool isCollect;MusicSong({requiredthis.songName,requiredthis.singer,requiredthis.songPath,requiredthis.duration,this.isCollect=false});}2️⃣ 本地音乐扫描 — 全盘读取音频
Future<List<MusicSong>>scanLocalMusic()async{OnAudioQueryaudioQuery=OnAudioQuery();List<SongModel>songList=awaitaudioQuery.querySongs();returnsongList.map((e)=>MusicSong(songName:e.title,singer:e.artist??"未知歌手",songPath:e.data,duration:e.duration??0)).toList();}3️⃣ 音频播放控制器 — 播放暂停管理
finalAudioPlayerplayer=AudioPlayer();Future<void>playMusic(Stringpath)async{awaitplayer.setSourceDeviceFile(path);awaitplayer.setVolume(1.0);awaitplayer.resume();}4️⃣ 进度条拖拽 — 精准跳转播放位置
WidgetbuildProgressSlider(){returnSlider(min:0,max:totalTime.value.toDouble(),value:currentTime.value,onChanged:(v)async{awaitplayer.seek(Duration(milliseconds:v.toInt()));});}5️⃣ 播放模式切换 — 顺序/随机/单曲
voidchangePlayMode(){if(mode==PlayMode.sequence)mode=PlayMode.random;elseif(mode==PlayMode.random)mode=PlayMode.single;elsemode=PlayMode.sequence;showToast("已切换为${mode.name}播放模式");}6️⃣ 歌曲收藏功能 — 本地永久保存
Future<void>collectSong(MusicSongsong)async{song.isCollect=!song.isCollect;awaitsong.save();if(song.isCollect){showToast("❤️ 收藏成功");}elseshowToast("已取消收藏");}7️⃣ 骨架屏加载 — 优化空白等待体验
WidgetbuildLoadingSkeleton(){returnShimmer.fromColors(baseColor:Colors.grey[200]!,highlightColor:Colors.white,child:ListView.builder(itemCount:8,itemBuilder:(_,i)=>MusicSkeletonItem()));}🏆 完整实现总结
📁 项目结构
lib/ ├── models/ # 音乐实体模型 ├── screens/ # 页面 │ ├── music_list.dart # 歌曲列表页 │ ├── play_page.dart # 播放详情页 │ └── collect_page.dart # 我的收藏页 ├── widgets/ # 播放器组件、骨架屏 └── utils/ # 音频工具、存储工具✨ 核心亮点总结
零广告纯纯净:无联网、无推送、无充值,纯粹本地音乐播放
鸿蒙深度适配:后台播放、线控切歌、熄屏播放全部支持
极致轻量化:安装包不足15MB,低配鸿蒙手机流畅运行
隐私安全可靠:仅读取本地音频,无多余权限、无数据上传
🎮 运行效果描述
在OpenHarmony设备安装运行后,首次授权媒体权限,APP自动全盘扫描本地音乐。首页展示全部歌曲列表,搭配柔和骨架屏加载动画;点击歌曲进入播放页,展示歌曲封面、进度条、播放模式切换按钮;支持后台挂听、锁屏控歌;喜欢的歌曲一键收藏,收藏数据永久本地保存。整体UI简约清新,贴合鸿蒙极简美学,动画丝滑、无卡顿、无广告,是一款完美替代商用音乐软件的本地播放器!