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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:52:35