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

如何解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 13:16:18