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

Xamarin开发C# Android应用时MediaPlayer执行Prepare报错status=0x1如何解决?

问题原因及修复方案
  • 核心错误:SetDataSource调用参数不全。Assets目录下的所有资源都会打包进APK的统一资源块中,你通过Assets.OpenFd("MySound.mp3")拿到的AssetFileDescriptor,其内部的FileDescriptor指向的是整个APK的资源区块,而非独立的音频文件。你只传入了FileDescriptor实例,没有指定音频文件在资源块中的起始偏移和总长度,MediaPlayer无法解析出有效音频数据,因此Prepare阶段报错,返回0x1状态码。
  • 排查点补充:先确认MySound.mp3文件在VS中的生成操作属性设置为AndroidAsset,如果属性配置错误,文件不会被打包进APK,也会触发同类读取错误。

修正后的核心代码

protected MediaPlayer player;
protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);
    SetContentView(Resource.Layout.layout1);
    this.Window.AddFlags(WindowManagerFlags.Fullscreen);

    player = new MediaPlayer();
    player.Reset();
    using (var fileDescriptor = Assets.OpenFd("MySound.mp3"))
    {
        // 补全起始偏移和长度参数
        player.SetDataSource(fileDescriptor.FileDescriptor, fileDescriptor.StartOffset, fileDescriptor.Length);
    }
    player.Prepare();
    player.Start();
}

优化建议

  • 推荐用PrepareAsync()替代同步Prepare(),避免音频文件较大时阻塞UI线程引发ANR,可监听player.Prepared事件,在回调中调用Start()播放。
  • Activity销毁时及时释放MediaPlayer资源,避免内存泄漏:
protected override void OnDestroy()
{
    base.OnDestroy();
    if (player != null)
    {
        if (player.IsPlaying)
        {
            player.Stop();
        }
        player.Release();
        player.Dispose();
        player = null;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 07:06:02