如何解决C# Xamarin Forms Android中getParameters failed空参数异常?
解决OnAppearing中调用ZXing扫码方法抛出
getParameters failed异常的问题 问题场景
编写了一个异步的Scanner方法,手动触发时功能正常,但在OnAppearing生命周期方法中调用时,会抛出Java.Lang.RuntimeException: 'getParameters failed (empty parameters)'异常。
原Scanner方法代码
private async void Scanner() { try { var scannerPage = new ZXingScannerPage(); scannerPage.Title = "Scanner"; scannerPage.OnScanResult += (result) => { scannerPage.IsScanning = false; string resultado = Convert.ToString(result); if (resultado.Contains("http") || resultado.Contains("https")) { Browser.OpenAsync(resultado, BrowserLaunchMode.External); Navigation.PopAsync(); } else Device.BeginInvokeOnMainThread(async () => { Navigation.PopAsync(); subs = result.Text.Split('\t'); string cadena = "var1N°: " + subs[0] + "\\var2N°: " + subs[1] + "\\var3N°: " + subs[2]; await this.DisplayAlert("Data QR", cadena, "OK"); sacarFotos(); }); }; await Navigation.PushAsync(scannerPage); } catch(Exception ex) { await DisplayAlert("Error", "Sorry we had a problem, "OK"); await Shell.Current.GoToAsync($"//{nameof(HomePage)}"); } }
原OnAppearing调用代码
protected override void OnAppearing() { try { Scanner(); } catch(Exception ex) { } }
问题原因
OnAppearing触发时,页面UI还未完全渲染完成,相机硬件资源也未被系统完全分配,此时直接初始化ZXing扫码组件调用相机,会导致相机参数获取失败,从而抛出异常。
解决方案
1. 延迟调用扫码方法
给页面和相机足够的初始化时间,通过Task.Delay延迟调用Scanner,同时将OnAppearing改为异步版本。
2. 优化Scanner方法
将async void改为async Task(async void属于“火即忘”模式,不利于异常处理和流程控制),同时修复原代码中的潜在问题(比如字符串拼接错误、数组越界风险)。
修改后的代码
异步版OnAppearing
protected override async void OnAppearing() { base.OnAppearing(); // 必须调用基类的OnAppearing方法 // 延迟200ms,可根据设备性能调整时长 await Task.Delay(200); await Scanner(); }
优化后的Scanner方法
private async Task Scanner() { try { var scannerPage = new ZXingScannerPage(); scannerPage.Title = "Scanner"; scannerPage.OnScanResult += async (result) => { scannerPage.IsScanning = false; string resultado = Convert.ToString(result); if (resultado.Contains("http") || resultado.Contains("https")) { await Browser.OpenAsync(resultado, BrowserLaunchMode.External); await Navigation.PopAsync(); } else { await Navigation.PopAsync(); // 处理可能的空值,避免Split报错 string[] subs = result.Text?.Split('\t') ?? Array.Empty<string>(); // 避免数组越界,给默认值 string var1 = subs.Length > 0 ? subs[0] : "未获取到"; string var2 = subs.Length > 1 ? subs[1] : "未获取到"; string var3 = subs.Length > 2 ? subs[2] : "未获取到"; string cadena = $"var1N°: {var1}\\var2N°: {var2}\\var3N°: {var3}"; await DisplayAlert("Data QR", cadena, "OK"); sacarFotos(); } }; await Navigation.PushAsync(scannerPage); } catch(Exception ex) { // 修复原代码中的字符串拼接错误,同时显示异常信息便于调试 await DisplayAlert("Error", $"Sorry we had a problem: {ex.Message}", "OK"); await Shell.Current.GoToAsync($"//{nameof(HomePage)}"); } }
额外说明
- 延迟时长可以根据测试情况调整,比如部分老旧设备可能需要更长的延迟(300-500ms)
- 确保应用已经获取了相机权限,权限不足也可能导致类似异常
- ZXing的
OnScanResult回调默认在主线程执行,无需额外用Device.BeginInvokeOnMainThread包裹异步操作
内容的提问来源于stack exchange,提问作者F205
相关产品推荐
相关产品推荐

