Xamarin Forms MediaElement加载文件异常无法被try catch捕获如何处理
问题原因
Java.Lang.RuntimeException: setDataSource failed: status = 0xFFFFFFEA 是Android平台MediaPlayer原生层异步抛出的异常,不是赋值Source属性时同步触发的异常,因此外层的同步try/catch无法捕获。错误码0xFFFFFFEA对应原生MediaPlayer的未知数据源错误,通常由无效、损坏、0字节的音频文件触发。
解决方案
按优先级排序实施即可解决问题:
- 前置校验音频文件,从根源避免触发异常
赋值Source之前先校验文件合法性,直接过滤无效文件,是成本最低的解决方案:// 先校验文件有效性 if (!File.Exists(audioPath)) { // 自定义文件不存在的处理逻辑 return; } var fileInfo = new FileInfo(audioPath); if (fileInfo.Length <= 0) { // 自定义空文件的处理逻辑 return; } try { doaaME.Stop(); doaaME.Source = null; doaaME.Source = audioPath; } catch (Exception ex) { // 捕获少量同步抛出的异常 } - 绑定MediaElement的
MediaFailed事件,捕获异步播放异常
MediaElement本身提供了专门处理加载、播放阶段异步异常的事件,所有播放链路的异常都会回调到该事件,不会直接导致应用崩溃:// 在页面/控件初始化时绑定事件 doaaME.MediaFailed += (s, e) => { // 处理加载、播放错误逻辑,比如提示用户、重置播放器 doaaME.Source = null; }; - 可选:Android平台全局异常兜底
如果存在极端场景的异常漏出,可以在Android项目的Application初始化时订阅全局未捕获异常事件做兜底:AppDomain.CurrentDomain.UnhandledException += (s, e) => { if (e.ExceptionObject is Java.Lang.RuntimeException ex && ex.Message.Contains("setDataSource failed")) { // 忽略该类已知异常,或写入错误日志 return; } // 其他异常按原有逻辑处理 };
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

