如何解决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
相关产品推荐
相关产品推荐

