You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 04:51:22