第一期:最小可用播放器 — 项目结构与关键代码框架
目录结构
1 | music-player/ |
1. 依赖配置
gradle/libs.versions.toml
1 | [versions] |
app/build.gradle.kts
1 | plugins { |
2. 核心接口设计(★ 重中之重)
这些接口是整个架构的骨架。后期换 FFmpeg + USB 独占时,只需要新增实现类,UI 层和 Service 层完全不动。
player/PlaybackState.kt
1 | package com.example.musicplayer.player |
player/PlayerController.kt
1 | package com.example.musicplayer.player |
player/AudioOutputBackend.kt
1 | package com.example.musicplayer.player |
3. ExoPlayer 实现
player/ExoPlayerController.kt
1 | package com.example.musicplayer.player |
4. 后台播放服务
service/PlaybackService.kt
1 | package com.example.musicplayer.service |
5. 数据模型与文件扫描
model/AudioFile.kt
1 | package com.example.musicplayer.model |
scanner/FileScanner.kt
1 | package com.example.musicplayer.scanner |
6. 依赖注入
di/AppModule.kt
1 | package com.example.musicplayer.di |
MusicPlayerApp.kt
1 | package com.example.musicplayer |
7. UI 层
ui/MainActivity.kt
1 | package com.example.musicplayer.ui |
ui/navigation/AppNavigation.kt
1 | package com.example.musicplayer.ui.navigation |
ui/screen/FileBrowserScreen.kt
1 | package com.example.musicplayer.ui.screen |
ui/screen/NowPlayingScreen.kt
1 | package com.example.musicplayer.ui.screen |
ui/component/MiniPlayer.kt
1 | package com.example.musicplayer.ui.component |
ui/component/PermissionHandler.kt
1 | package com.example.musicplayer.ui.component |
8. AndroidManifest.xml
1 |
|
9. 架构要点总结
为什么这样设计
1 | ┌──────────────┐ |
后期替换引擎只需要做三件事
- 写一个
NativePlayerController实现PlayerController接口 - 写一个
UsbExclusiveBackend实现AudioOutputBackend接口 - 在
AppModule.kt中把绑定改一行:1
2
3
4
abstract fun bindPlayerController(
impl: NativePlayerController // 改这里
): PlayerController
UI 层和 Service 层 零修改。
第一期完成后的效果
- 打开 App → 自动请求权限 → 扫描音频
- 看到歌曲列表(标题、艺术家、时长)
- 点击播放,底部出现迷你播放条
- 点击迷你播放条进入全屏播放页
- 支持暂停/恢复、上一首/下一首、进度拖动
- 切到后台继续播放,通知栏显示控制按钮
- 蓝牙耳机/有线耳机按键可控制
说些什么吧!