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

Android Kotlin使用MediaPlayer播放URL音频时setDataSource报错如何解决

问题解决方案

以下是针对该问题的修改点和可运行代码:

  • 首先在AndroidManifest.xml中添加网络权限,缺少该权限会直接导致加载网络音频资源失败:
    <!-- 放在manifest标签下,application标签外 -->
    <uses-permission android:name="android.permission.INTERNET" />
    
  • 不要在主线程调用同步prepare()方法加载网络音频,会阻塞主线程引发ANR或调用失败,改为异步prepareAsync()配合准备完成监听器使用
  • 每次调用setDataSource()前需要先调用reset()重置MediaPlayer状态,否则MediaPlayer处于其他状态时调用设置数据源方法会直接抛出异常
  • 适配高版本Android系统,setAudioStreamType在API 26及以上已废弃,改用setAudioAttributes方法
  • 可选补充:如果后续你需要使用HTTP协议的音频链接,需要在AndroidManifest.xml的application标签中添加android:usesCleartextTraffic="true"属性,否则Android 9及以上系统会禁止明文网络请求,导致加载失败

修改后的完整代码:

val mP = MediaPlayer()
val url_play_btn: Button = findViewById(R.id.url_play_btn)
// 提前设置准备完成监听器,音频缓冲准备完成后自动播放
mP.setOnPreparedListener {
    it.start()
}

url_play_btn.setOnClickListener{
    val url = "https://www.learningcontainer.com/wp-content/uploads/2020/02/Kalimba.mp3"
    try {
        // 重置MediaPlayer到空闲状态
        mP.reset()
        // 适配高版本设置音频属性
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            mP.setAudioAttributes(
                AudioAttributes.Builder()
                    .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                    .setUsage(AudioAttributes.USAGE_MEDIA)
                    .build()
            )
        } else {
            @Suppress("DEPRECATION")
            mP.setAudioStreamType(AudioManager.STREAM_MUSIC)
        }
        mP.setDataSource(url)
        // 异步准备,不会阻塞主线程
        mP.prepareAsync()
    } catch(e: Exception) {
        Log.i("Error","Couldn't Play the Audio")
        Toast.makeText(this,"播放失败:${e.message}",Toast.LENGTH_LONG).show()
    }
}

// 页面销毁时释放MediaPlayer资源,避免内存泄漏
override fun onDestroy() {
    super.onDestroy()
    mP.release()
}

内容的提问来源于stack exchange,提问作者user17302519

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 16:54:03