Android MediaPlayer调用setDataSource报status=0x80000000错误问询
错误原因
- 核心错误是多余的URI解码操作:Android Content URI 本身是符合RFC规范的编码格式,
Uri.parse()要求传入编码后的合法URI字符串。你将URI解码后,路径中的空格、方括号等特殊字符没有编码,生成的URI是无效的,MediaPlayer无法识别无效的数据源,就会返回0x80000000未知错误。 - 次要可能原因:如果是长期存储后再使用从系统文件选择器获取的URI,默认的临时访问权限已经失效,MediaPlayer没有权限读取对应文件也会触发该错误。
修复方案
- 移除多余的解码逻辑,存储、使用时都直接操作原始编码后的URI即可,正确代码示例:
val audioFileUri = data.data!! // 原始Uri类型的Content URI // 存储时直接转字符串,无需解码 val storedUriStr = audioFileUri.toString() // 后续使用时直接解析原始字符串 mediaPlayer.setDataSource(this, Uri.parse(storedUriStr))
- 如果需要长期使用获取到的Content URI,拿到URI后主动申请持久化访问权限:
// 拿到URI后立即申请持久化权限 val takeFlags = intent.flags and (Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION) contentResolver.takePersistableUriPermission(audioFileUri, takeFlags)
- 调用
setDataSource、prepare等MediaPlayer方法时添加try-catch捕获IOException、IllegalArgumentException,避免应用崩溃的同时方便定位其他潜在问题。
内容的提问来源于stack exchange,提问作者laila
相关产品推荐
相关产品推荐

