本文最后更新于156 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com
这是一个功能完整的 Android 音乐播放器应用,采用 Java 开发,使用 SQLite 本地数据库存储用户数据和收藏信息。
主要功能模块
1. 用户认证系统
功能:
- 用户注册
- 用户登录
- 当前登录用户状态管理
实现方式:
- UserDao.java: 数据访问层,使用 SQLite 存储用户信息
register(): 检查用户名是否存在,不存在则插入到tb_user表login(): 查询用户名和密码匹配的记录getByUsername(): 根据用户名查询用户
- CurrentUserUtils: 静态工具类,保存当前登录用户的 ID(使用 SharedPreferences)
- LoginActivity.java: 登录界面
- 验证用户输入
- 调用
UserDao.login()进行登录验证 - 登录成功后跳转到 MainActivity 并清空任务栈
- RegisterActivity.java: 注册界面
- 调用
UserDao.register()创建新用户
- 调用
2. 音乐播放核心功能
功能:
- 播放/暂停音乐
- 上一首/下一首切换
- 进度条拖动
- 后台播放服务
实现方式:
- MusicService.java: 后台音乐播放服务
- 继承
Service,通过Binder机制与 Activity 通信 - 使用
MediaPlayer播放 assets 目录下的 MP3 文件 - 使用
Timer每 500ms 更新一次播放进度 - 实现自动播放下一首(
OnCompletionListener) - 支持播放控制方法:
play(Music): 播放指定音乐pausePlay(): 暂停continuePlay(): 继续播放next()/previous(): 切歌seekTo(int): 跳转到指定位置
- 继承
- 监听器模式:
- 定义
OnMusicServiceListener接口 - 回调方法:
onTimerTask(): 通知播放进度更新onMusicChange(): 通知歌曲切换
- 定义
3. 音乐库管理
功能:
- 显示所有歌曲列表
- 按歌手分类浏览
- 搜索和筛选
实现方式:
- AssetsMusicData.java: 音乐数据管理(单例模式)
- 从
assets/music/目录读取 MP3 文件 - 解析文件名格式:
歌手-歌名.mp3 - 从
assets/picture/加载歌手封面图片 - 自动获取音乐时长(使用 MediaPlayer)
- 随机打乱歌曲顺序(
Collections.shuffle())
- 从
- SongsFragment.java: 歌曲列表页面
- 使用
RecyclerView+MusicAdapter显示歌曲 - 点击列表项播放音乐
- 点击爱心图标收藏/取消收藏
- 使用
- ArtistsFragment.java: 歌手分类页面
- 按歌手分组显示
- 点击歌手查看该歌手的所有歌曲
4. 收藏功能
功能:
- 收藏/取消收藏歌曲
- 查看收藏列表
- 收藏状态持久化
实现方式:
- FavoriteDao.java: 收藏数据访问层
- SQLite 表:
tb_favorite(user_id, music_id, create_time) - 方法:
addFavorite(): 添加收藏记录cancelFavorite(): 删除收藏记录toggleFavorite(): 切换收藏状态getFavoriteList(): 获取用户收藏列表isFavorite(): 判断是否已收藏updateFavoriteStatus(): 批量更新歌曲收藏状态
- SQLite 表:
- FavoritesFragment.java: 收藏页面
- 调用
FavoriteDao.getFavoriteList()获取收藏列表 - 展示用户收藏的所有歌曲
- 调用
5. 播放器界面
功能:
- 全屏播放器界面
- 显示专辑封面、歌曲信息
- 进度条显示和拖动
- 播放控制按钮
- 收藏按钮
实现方式:
- PlayerActivity.java: 播放器全屏页面
- 绑定
MusicService获取播放状态 - 实现
OnMusicServiceListener接口:onTimerTask(): 更新进度条和时间显示onMusicChange(): 更新歌曲信息和收藏状态
SeekBar拖动监听:调用musicControl.seekTo()跳转播放位置- 收藏按钮:调用
FavoriteDao.toggleFavorite()
- 绑定
6. 主界面架构
实现方式:
- MainActivity.java: 主界面容器
- 使用
ViewPager2+BottomNavigationView实现页面切换 - 三个主标签页:
- 音乐库 (MusicLibraryFragment) – 包含歌曲列表和歌手列表
- 收藏 (FavoritesFragment)
- 设置 (SettingsFragment)
- 底部常驻播放控制栏:
- 显示当前播放歌曲信息
- 播放/暂停按钮
- 下一首按钮
- 点击跳转到 PlayerActivity
- 使用
🗄️ 数据库设计
SQLite 数据库表:
tb_user(用户表)
- id (Long, 主键)
- username (String)
- password (String)
tb_favorite(收藏表)
- id (Long, 主键)
- user_id (Long, 外键)
- music_id (Long, 外键)
- create_time (时间戳,按收藏时间排序)
🎨 技术栈和依赖
- Android SDK: API 24-36
- UI 框架:
- Material Design Components
- ViewPager2
- RecyclerView
- BottomNavigationView
- 第三方库:
com.gzone.university:expand:1.4.0– UI 工具库(包含 GlideUtils 图片加载)me.jessyan:autosize:1.2.1– 屏幕自适应
📂 目录结构
app/src/main/
├── assets/ # 资源文件
│ ├── music/ # MP3 音乐文件
│ └── picture/ # 歌手封面图片
├── java/com/example/selfmusic/
│ ├── dao/ # 数据访问层
│ │ ├── UserDao.java
│ │ └── FavoriteDao.java
│ ├── entity/ # 实体类
│ │ ├── User.java
│ │ ├── Music.java
│ │ └── Singer.java
│ ├── service/ # 服务
│ │ └── MusicService.java
│ ├── ui/ # 界面层
│ │ ├── activity/ # Activity
│ │ │ ├── LoginActivity.java
│ │ │ ├── RegisterActivity.java
│ │ │ ├── MainActivity.java
│ │ │ ├── PlayerActivity.java
│ │ │ └── AboutActivity.java
│ │ ├── adapter/ # 适配器
│ │ │ ├── MusicAdapter.java
│ │ │ └── SingerAdapter.java
│ │ └── fragment/ # Fragment
│ │ ├── SongsFragment.java
│ │ ├── ArtistsFragment.java
│ │ ├── FavoritesFragment.java
│ │ ├── MusicLibraryFragment.java
│ │ └── SettingsFragment.java
│ ├── common/ # 公共类
│ │ ├── Result.java # 统一返回结果封装
│ │ └── AssetsMusicData.java
│ └── utils/ # 工具类
│ ├── SqliteUtils.java # 数据库工具
│ └── CurrentUserUtils.java
🔄 关键流程
音乐播放流程:
- 用户点击歌曲列表项
SongsFragment调用musicControl.play(music)MusicService使用MediaPlayer加载 assets 中的 MP3 文件- 开始播放并启动
Timer更新进度 - 通过监听器回调更新所有相关 UI(MainActivity、PlayerActivity)
收藏流程:
- 用户点击收藏按钮
- 调用
FavoriteDao.toggleFavorite(userId, musicId) - 查询当前收藏状态,执行添加或删除操作
- 更新数据库并返回新的收藏状态
- UI 更新收藏图标








