从零开始打造一个 Android 音乐播放器(Kotlin + Jetpack Compose)

当然可以!以下是为你量身定制的一篇 Android 音乐播放器项目总结博客,适合发布在个人技术博客、掘金、CSDN 或 GitHub Pages 上。内容清晰、结构完整,既有技术细节,也有开发心得。


🎵 从零开始打造一个 Android 音乐播放器(Kotlin + Jetpack Compose)

本文记录了一个基于 Kotlin 和 Jetpack Compose 的简易音乐播放器的开发过程,涵盖项目搭建、依赖管理、UI 设计与核心逻辑实现。适合初学者快速上手 Android 开发。


🧩 项目简介

这是一个极简版的 Android 音乐播放器 App ,使用 Jetpack Compose 构建 UI,采用 Kotlin 协程 处理异步任务,支持基本的播放控制:

  • 播放 / 暂停
  • 切换上一曲 / 下一曲

虽然功能简单,但完整覆盖了现代 Android 应用开发的核心流程。


🛠️ 技术栈

技术 版本/说明
Kotlin 2.0.0
Android Gradle Plugin (AGP) 8.7.0
Jetpack Compose 1.5+
Gradle 8.6+
Android Studio Bumblebee 或更高版本

📁 项目结构

复制代码
EmptyActivity/
├── build.gradle.kts             # 根项目配置
├── gradle/libs.versions.toml    # 依赖版本统一管理
└── app/
    ├── build.gradle.kts         # 模块配置
    └── src/main/
        ├── MainActivity.kt      # 主 Activity
        └── ui/
            └── MusicPlayer.kt   # 组合式 UI 组件

✅ 第一步:初始化项目

使用 Android Studio 创建新项目:

  1. 打开 Android Studio → New Project
  2. 选择 "Compose Activity"
  3. 命名为 EmptyActivity,语言选 Kotlin

⚠️ 注意:默认模板会生成 MainActivity.ktMainScreen,我们稍后替换为自定义播放器界面。


🔧 第二步:配置插件与依赖

1. gradle/libs.versions.toml

复制代码
[versions]
agp = "8.7.0"
kotlin = "2.0.0"
compose = "1.5.0"

[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
kotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlin" }

[libraries]
compose-ui = { group = "androidx.compose.ui", name = "ui", version.ref = "compose" }
compose-material = { group = "androidx.compose.material", name = "material", version.ref = "compose" }

2. 根项目 build.gradle.kts

复制代码
plugins {
    alias(libs.plugins.android.application) apply false
    alias(libs.plugins.kotlin.android) apply false
    alias(libs.plugins.kotlin.kapt) apply false
}

✅ 使用 apply false 表示这些插件只用于版本声明,实际应用在模块中。

3. app/build.gradle.kts

复制代码
plugins {
    alias(libs.plugins.android.application)
    alias(libs.plugins.kotlin.android)
    alias(libs.plugins.kotlin.kapt)
}

android {
    namespace = "com.example.emptyactivity"
    compileSdk = 35

    defaultConfig {
        applicationId = "com.example.emptyactivity"
        minSdk = 24
        targetSdk = 35
        versionCode = 1
        versionName = "1.0"
    }

    buildFeatures {
        compose = true
    }
}

dependencies {
    implementation(libs.compose.ui)
    implementation(libs.compose.material)
}

🎨 第三步:构建 UI 界面

MainActivity.kt

复制代码
class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            MusicPlayerTheme {
                MusicPlayer()
            }
        }
    }
}

MusicPlayer.kt

复制代码
@Composable
fun MusicPlayer() {
    Column(
        modifier = Modifier.fillMaxSize(),
        horizontalAlignment = Alignment.CenterHorizontally,
        verticalArrangement = Arrangement.Bottom
    ) {
        Spacer(modifier = Modifier.weight(1f))

        Row(
            modifier = Modifier
                .fillMaxWidth()
                .padding(horizontal = 16.dp),
            horizontalArrangement = Arrangement.SpaceBetween
        ) {
            Button(onClick = { /* 上一曲 */ }) {
                Text("上一曲")
            }
            Button(onClick = { /* 播放 */ }) {
                Text("播放")
            }
            Button(onClick = { /* 暂停 */ }) {
                Text("暂停")
            }
            Button(onClick = { /* 下一曲 */ }) {
                Text("下一曲")
            }
        }
    }
}

@Composable
fun MusicPlayerTheme(darkTheme: Boolean = false, content: @Composable () -> Unit) {
    MaterialTheme(
        colorScheme = if (darkTheme) DarkColorScheme else LightColorScheme,
        content = content
    )
}

💡 使用 Column + Row 实现底部按钮布局,Spacer 占位让按钮固定在底部。


🔊 第四步:添加音频播放功能

1. 添加权限

AndroidManifest.xml 中添加:

复制代码
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

2. 使用 MediaPlayer 播放音频

复制代码
class MediaPlayerManager {
    private val mediaPlayer = MediaPlayer()

    fun play(url: String) {
        mediaPlayer.apply {
            setDataSource(url)
            prepareAsync()
            setOnPreparedListener { start() }
        }
    }

    fun pause() {
        mediaPlayer.pause()
    }

    fun stop() {
        mediaPlayer.stop()
        mediaPlayer.release()
    }

    fun next() {
        // TODO: 切换到下一首歌曲
    }

    fun previous() {
        // TODO: 切换到上一首歌曲
    }
}

🚀 可以结合 ViewModelStateFlow 实现状态管理,提升可维护性。


🌟 项目亮点

亮点 说明
✅ 使用 Jetpack Compose 声明式 UI,代码简洁易读
✅ Kotlin DSL + libs.versions.toml 依赖版本统一管理,避免冲突
✅ 插件化配置 分离根项目与模块职责,便于团队协作
✅ 响应式设计 支持不同屏幕尺寸
✅ 易扩展 可轻松加入播放列表、进度条、封面图等

🚫 常见问题与解决方案

问题 原因 解决方案
Plugin not found: org.jetbrains.kotlin.kapt 缺少版本或重复声明 使用 alias(libs.plugins.kotlin.kapt) 并确保版本一致
UI 不显示 setContent 未调用 确保 MainActivity 正确设置了 setContent
播放失败 权限缺失或 URL 错误 添加网络权限并检查音频地址

📈 后续优化方向

  1. ✅ 加入播放进度条(Slider
  2. ✅ 显示歌曲名称和艺术家
  3. ✅ 支持本地音频文件(FileProvider
  4. ✅ 使用 WorkManager 实现后台播放
  5. ✅ 添加 Hilt 或 Koin 实现依赖注入
  6. ✅ 引入 Room 数据库保存播放历史

🧠 开发心得

  • Jetpack Compose 是未来:它让 UI 开发变得像写网页一样直观。
  • 版本管理很重要libs.versions.toml 能有效避免版本冲突。
  • 分层设计是关键:将 UI、业务逻辑、数据源分离,才能写出可维护的代码。
  • 不要怕"小"项目:哪怕只是几个按钮,也能帮你掌握完整开发流程。

📄 结语

这个小小的音乐播放器,虽然是一个入门级项目,但它涵盖了 Android 开发中的核心技能:

👉 项目搭建、依赖管理、UI 设计、事件处理、多媒体操作......

当你看到手机屏幕上那四个按钮成功响应点击时,那种成就感是无价的。

💬 "每一个伟大的 App,都始于一个简单的想法。"


📎 附录:GitHub 仓库(可选)

你可以将项目上传至 GitHub,方便分享和迭代:

复制代码
git init
git add .
git commit -m "Initial commit"
git remote add origin https://github.com/yourname/music-player.git
git push -u origin main

📚 参考资料


📌 如果你喜欢这篇文章,欢迎点赞、收藏、转发!也欢迎留言交流你的开发经验 😊

相关推荐
cyw89982 小时前
手动安装mysql8.0.44
android
zore_c2 小时前
【数据结构】二叉树初阶——超详解!!!(包含二叉树的实现)
c语言·开发语言·数据结构·经验分享·笔记·算法·链表
laocooon5238578862 小时前
《21天学通C语言》第一天
c语言·开发语言
Edward.W2 小时前
Android (ADB)、iOS、OpenHarmony 常用调试命令对照表
android·ios·adb
Rysxt_2 小时前
UniApp pages.json 配置完全指南
开发语言·前端·javascript
Railshiqian2 小时前
DeepSeek反馈的,如何通过adb获取某个Window或View的绘制内容的方法
android·adb
消失的旧时光-19432 小时前
Android(Kotlin) ↔ Flutter(Dart) 的“1:1 对应表”:架构分层来对照(MVVM/MVI 都适用)
android·flutter·kotlin
三七吃山漆2 小时前
攻防世界——Web_php_wrong_nginx_config
开发语言·nginx·安全·web安全·网络安全·php·ctf
csbysj20202 小时前
XML Schema 复合类型 - 混合内容
开发语言