Xamarin.Android中MediaPlayer空引用异常问题求助
解决Xamarin.Android MediaPlayer空引用异常问题
嘿,我来帮你搞定这个空引用的坑!先看你的代码里几个容易踩的问题:
问题分析
- 重复初始化+多余的Prepare调用:你先
new MediaPlayer()然后立刻用MediaPlayer.Create覆盖了这个实例,前面的new完全没必要;而且MediaPlayer.Create方法已经帮你完成了初始化、加载资源和准备工作,再调用player.Prepare()不仅多余,还可能触发错误。 - 未检查Create的返回值:如果指定的音频文件找不到(比如Assets里文件名写错、大小写不对)或者格式不支持,
MediaPlayer.Create会返回null,这时候调用player.Prepare()或player.Start()就会直接抛出空引用异常。 - Assets文件配置问题:要确保你的音频文件确实放在Assets文件夹下,并且在Visual Studio里把文件的Build Action设置为
AndroidAsset,Android对Assets里的文件名大小写是敏感的哦!
修正后的代码
MediaPlayer player; public void Play(string filename) { // 先释放之前的player实例,避免内存泄漏 player?.Release(); Android.Net.Uri url = Android.Net.Uri.Parse("file:///android_asset/" + filename); Context context = Android.App.Application.Context; // 创建MediaPlayer实例并检查是否成功 player = MediaPlayer.Create(context, url); if (player == null) { // 这里可以加日志或者提示用户文件不存在/格式不支持 System.Diagnostics.Debug.WriteLine($"无法加载音频文件: {filename}"); return; } // 直接启动播放,Create已经完成了Prepare player.Start(); // 可选:监听播放完成事件,自动释放资源 player.Completion += (s, e) => { player?.Release(); player = null; }; }
额外注意事项
- 记得在页面销毁或者不再需要播放功能时,主动调用
player?.Release()释放MediaPlayer资源,避免内存泄漏。 - 测试时可以先打印
url的值确认路径是否正确,或者用已知能正常播放的音频文件做测试,排除文件本身的问题。
内容的提问来源于stack exchange,提问作者Jaanis
相关产品推荐
相关产品推荐

