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

