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

Xamarin.Forms Android中WebView无法调用摄像头问题排查

解决Xamarin.Forms Android原生WebView无法调用摄像头的问题

我之前也碰到过几乎一模一样的问题——Xamarin.Forms里Android原生WebView调用摄像头没反应,但Chrome和iOS的WKWebView都正常,而且其他模块摄像头权限也没问题。结合你的情况,问题大概率出在原生WebView的权限请求处理和配置缺失上,下面是我验证有效的解决方案:

1. 自定义WebChromeClient处理权限请求

Android的WebView在调用摄像头这类媒体设备时,不会自动授权权限请求,必须通过自定义WebChromeClient来手动授予。你需要在Android项目里创建这个类:

using Android.Webkit;

public class CameraEnabledWebChromeClient : WebChromeClient
{
    public override void OnPermissionRequest(PermissionRequest request)
    {
        // 这里可以校验请求的来源网站,确保是你的目标站点
        if (request.Origin.ToString().StartsWith("https://你的目标网站域名"))
        {
            // 授予请求的所有权限(这里主要是摄像头权限)
            request.Grant(request.GetResources());
        }
        else
        {
            base.OnPermissionRequest(request);
        }
    }
}

2. 给WebView配置必要设置并绑定自定义ChromeClient

接下来需要通过自定义渲染器,给Xamarin.Forms的WebView设置上述ChromeClient和必要的WebView参数:

using Android.Content;
using Android.Webkit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;

[assembly: ExportRenderer(typeof(WebView), typeof(CameraEnabledWebViewRenderer))]
namespace 你的Android项目命名空间
{
    public class CameraEnabledWebViewRenderer : WebViewRenderer
    {
        public CameraEnabledWebViewRenderer(Context context) : base(context) { }

        protected override void OnElementChanged(ElementChangedEventArgs<WebView> e)
        {
            base.OnElementChanged(e);

            if (Control != null)
            {
                var webView = Control as Android.Webkit.WebView;
                
                // 启用JavaScript(网站调用摄像头依赖JS)
                webView.Settings.JavaScriptEnabled = true;
                // 允许文件访问(摄像头拍摄的照片需要文件读写)
                webView.Settings.AllowFileAccess = true;
                // 启用DOM存储(部分网站的媒体功能依赖这个)
                webView.Settings.DomStorageEnabled = true;
                // 取消媒体播放需要用户手势的限制(避免摄像头调用被拦截)
                webView.Settings.MediaPlaybackRequiresUserGesture = false;
                
                // 绑定自定义的ChromeClient处理权限请求
                webView.SetWebChromeClient(new CameraEnabledWebChromeClient());
            }
        }
    }
}

3. 额外注意事项

  • 确认你的目标网站是HTTPS协议:Android的WebView对HTTP站点的媒体权限限制更严格,即使配置了上述内容也可能无法调用摄像头。
  • 动态权限检查:虽然你说其他模块已经正常使用摄像头,但可以在渲染器初始化时再确认一次权限(比如Manifest.Permission.Camera和Manifest.Permission.RecordAudio如果需要的话),确保权限状态是授予的。

按这个步骤配置后,Android原生WebView应该就能正常调用摄像头了,我当时就是这么解决的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:56:42