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
相关产品推荐
相关产品推荐

