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

Blazor MAUI安卓端HTML5相机输入无响应,权限排查求助

问题分析与解决方案

你的问题核心是Blazor MAUI安卓端的HTML5文件输入框(带capture="camera")无响应,虽然JS条码扫描功能正常,但这个输入框的行为依赖WebView的文件选择回调处理,并非单纯的权限问题,以下是具体排查和解决步骤:

1. 权限补充检查

你已动态申请了相机、读写存储权限,但需要确保AndroidManifest.xml中也声明了对应权限,尤其是Android 13及以上版本的权限变化:

<!-- 基础相机权限 -->
<uses-permission android:name="android.permission.CAMERA" />
<!-- Android 12及以下的存储权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
<!-- Android 13+ 替代WRITE_EXTERNAL_STORAGE的权限 -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />

动态申请时,针对Android 13+要调整权限数组:

var permissions = Build.VERSION.SdkInt >= BuildVersionCodes.Tiramisu 
    ? new[] { Manifest.Permission.Camera, Manifest.Permission.ReadMediaImages }
    : new[] { Manifest.Permission.Camera, Manifest.Permission.ReadExternalStorage, Manifest.Permission.WriteExternalStorage };

ActivityCompat.RequestPermissions(this, permissions, 0);

2. 配置WebChromeClient处理文件选择

BlazorWebView默认没有实现OnShowFileChooser回调,这是HTML5文件输入框触发相机/文件选择的关键。你需要在安卓项目的MainActivity.cs中自定义WebChromeClient并绑定到BlazorWebView:

protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);

    var blazorWebView = FindViewById<BlazorWebView>(Resource.Id.blazorWebView);
    if (blazorWebView != null)
    {
        blazorWebView.WebView.SetWebChromeClient(new CustomFileChooserWebChromeClient(this));
    }
}

// 自定义WebChromeClient处理文件选择请求
private class CustomFileChooserWebChromeClient : WebChromeClient
{
    private readonly MainActivity _activity;

    public CustomFileChooserWebChromeClient(MainActivity activity)
    {
        _activity = activity;
    }

    public override bool OnShowFileChooser(Android.Webkit.WebView webView, IValueCallback filePathCallback, FileChooserParams fileChooserParams)
    {
        // 保存回调用于后续返回结果
        _activity._filePathCallback = filePathCallback;

        // 启动相机捕获图片(匹配input的capture="camera"要求)
        var takePictureIntent = new Intent(MediaStore.ActionImageCapture);
        if (takePictureIntent.ResolveActivity(_activity.PackageManager) != null)
        {
            _activity.StartActivityForResult(takePictureIntent, 1001);
            return true;
        }

        // 如果相机不可用, fallback到文件选择器
        var fileIntent = new Intent(Intent.ActionGetContent);
        fileIntent.SetType("image/*");
        _activity.StartActivityForResult(Intent.CreateChooser(fileIntent, "选择图片"), 1001);
        return true;
    }
}

// 存储文件选择回调
private IValueCallback _filePathCallback;

// 处理相机/文件选择返回结果
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
    base.OnActivityResult(requestCode, resultCode, data);

    if (requestCode == 1001 && _filePathCallback != null)
    {
        Android.Net.Uri[] results = null;
        if (resultCode == Result.Ok && data != null)
        {
            // 获取返回的图片Uri
            results = new[] { data.Data };
        }

        _filePathCallback.OnReceiveValue(results);
        _filePathCallback = null;
    }
}

3. 额外检查项

  • 确认BlazorWebView的Content-Security-Policy没有限制相机或文件访问:在wwwroot/index.html的meta标签中,确保包含media-src 'self' camera:或default-src允许相关资源。
  • 测试时使用物理设备而非模拟器,部分模拟器对相机捕获的支持有限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 22:05:25