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

如何解决Xamarin Android WebView无法正常调用设备摄像头的问题

可行解决方案


1. 修正自定义渲染器注册错误

你当前的渲染器注册语句完全错误,导致写的权限授予逻辑根本不生效。原代码第一行:

[assembly: ExportRenderer(typeof(HybridWebView), typeof(HybridWebView))]

第二个参数需要填你实现的MyWebViewRenderer,修改为:

// 如果你没有自定义HybridWebView类,只是用默认的Xamarin.Forms.WebView,第一个参数改为typeof(Xamarin.Forms.WebView)
[assembly: ExportRenderer(typeof(HybridWebView), typeof(MyWebViewRenderer))]

2. 补全WebView必要配置

在OnElementChanged方法中添加缺失的配置项,解决媒体流拦截、渲染异常问题:

protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e)
{
    base.OnElementChanged(e);
    Control.Settings.JavaScriptEnabled = true;
    Control.ClearCache(true);
    // 新增以下配置
    Control.Settings.MediaPlaybackRequiresUserGesture = false; // 允许摄像头流自动播放
    Control.Settings.DomStorageEnabled = true; // 开启DOM存储,绝大多数网页摄像头功能依赖该配置
    Control.Settings.AllowContentAccess = true;
    Control.Settings.AllowFileAccess = true;
    Control.Settings.SetAllowUniversalAccessFromFileURLs(true); // 加载本地测试网页时必需
    Control.SetWebChromeClient(new MyWebClient(mContext));
}

3. 添加动态权限申请

Android 6.0以上仅在Manifest声明权限无效,需要在应用启动时主动申请摄像头权限,在MainActivity的OnCreate方法中LoadApplication(new App());之前添加:

if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.Camera) != Permission.Granted)
{
    ActivityCompat.RequestPermissions(this, new string[] { Manifest.Permission.Camera }, 1001);
}

4. 补全Manifest配置

在Manifest的application节点添加属性,解决高版本Android对明文流量、媒体渲染的限制:

<application 
    android:label="MyApp" 
    android:icon="@mipmap/launcher_foreground"
    android:usesCleartextTraffic="true" <!-- 测试HTTP网页时添加,生产环境用HTTPS可删除 -->
    android:hardwareAccelerated="true"> <!-- 开启硬件加速,避免视频流渲染黑屏 -->
</application>
<!-- 如果网页需要同时录音,添加以下权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

5. 验证网页和设备配置

  • 确认加载的网页使用HTTPS协议,Android 9.0以上默认拦截HTTP页面调用摄像头等敏感API
  • 确认网页调用摄像头使用的是标准navigator.mediaDevices.getUserMedia接口,没有使用已废弃的旧JS API
  • 模拟器测试时需手动打开模拟器设置,将前置/后置摄像头配置为电脑真实摄像头或模拟摄像头,默认关闭状态下也会无画面

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 18:36:06