如何使用Kotlin在Android Studio中播放Firebase存储的音频
Kotlin 实现 Android Studio 中播放 Firebase 端音频完整步骤
前置配置
- 确保Android项目已完成Firebase服务关联,Firebase控制台已开通Cloud Storage服务,目标音频文件已上传至对应存储桶,测试阶段可临时将存储规则配置为可读以调试功能,上线前必须替换为权限校验规则。
- 确认测试设备网络正常,可正常访问Firebase服务。
步骤1:添加项目依赖
在模块级build.gradle(对应app模块的配置文件)的dependencies闭包中添加所需依赖,同步Gradle完成引入:
// Firebase Storage Kotlin扩展依赖 implementation("com.google.firebase:firebase-storage-ktx:20.3.0") // 可选:引入ExoPlayer(推荐,支持流式缓冲、进度管控,兼容性优于原生MediaPlayer) implementation("androidx.media3:media3-exoplayer:1.2.0")
步骤2:声明必要权限
在AndroidManifest.xml文件中添加网络权限,支持云端音频拉取:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
步骤3:获取Firebase音频的可播放Uri
通过Firebase Storage引用获取目标音频的临时访问地址,不要直接硬编码存储路径:
// 初始化Storage实例 val storageInstance = FirebaseStorage.getInstance() // 替换为你的音频文件在Storage中的实际存储路径 val audioFileRef = storageInstance.reference.child("audio/demo_sound.mp3") audioFileRef.downloadUrl .addOnSuccessListener { audioUri -> // 拿到有效Uri后传入播放器启动播放 initAndPlay(audioUri) } .addOnFailureListener { e -> // 处理异常:路径错误、权限不足、网络异常都在这里捕获 e.printStackTrace() }
步骤4:初始化播放器实现播放
方案一:原生MediaPlayer(轻量无额外依赖场景)
private var mediaPlayer: MediaPlayer? = null private fun initAndPlay(audioUri: Uri) { // 先释放已有播放器实例,避免内存泄漏 releasePlayer() mediaPlayer = MediaPlayer().apply { setAudioAttributes( AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .setUsage(AudioAttributes.USAGE_MEDIA) .build() ) setDataSource(applicationContext, audioUri) prepareAsync() // 异步准备,禁止主线程调用同步prepare()避免ANR setOnPreparedListener { it.start() } setOnErrorListener { _, _, _ -> releasePlayer() true } setOnCompletionListener { releasePlayer() } } } // 生命周期销毁时必须调用,释放资源 private fun releasePlayer() { mediaPlayer?.run { if (isPlaying) stop() release() } mediaPlayer = null }
在页面的onDestroy()生命周期中主动调用releasePlayer(),防止内存泄漏。
方案二:ExoPlayer(生产环境推荐)
private var exoPlayer: ExoPlayer? = null private fun initAndPlay(audioUri: Uri) { releasePlayer() exoPlayer = ExoPlayer.Builder(this).build().apply { setMediaItem(MediaItem.fromUri(audioUri)) prepare() playWhenReady = true // 缓冲完成后自动播放 } // 可自行添加监听绑定进度条、播放/暂停控件 } private fun releasePlayer() { exoPlayer?.release() exoPlayer = null }
同样需要在onDestroy()中调用releasePlayer()释放资源。
注意事项
- 长音频播放建议配合ExoPlayer的缓存组件实现本地缓存,减少重复流量消耗
- 上线前必须调整Firebase Storage规则,禁止公开读写,按业务逻辑配置访问权限
- 多音频播放场景需要处理音频焦点,避免和系统其他音频应用播放冲突
- 不要在主线程执行网络请求、播放器同步准备等耗时操作,避免触发ANR
内容的提问来源于stack exchange,提问作者Badr_ G9mer
相关产品推荐
相关产品推荐

