.NET MAUI Android WebView无法获取相机权限问题求助
解决.NET MAUI Android WebView无法调用相机拍照的问题
以下是针对你已完成基础配置后仍无法调用相机的排查和解决方案:
1. 适配Android 13+权限规则
如果应用目标API为33(Android 13)及以上,除CAMERA权限外,若网页需要访问拍摄后的照片,还需额外声明READ_MEDIA_IMAGES权限。检查Platforms/Android/AndroidManifest.xml:
<uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" android:required="false" /> <uses-feature android:name="android.hardware.camera.autofocus" android:required="false" /> <!-- Android 13+ 访问相册需添加 --> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
2. 完善自定义WebChromeClient的权限处理
确保CustomWebChromeClient正确识别相机权限请求,并在UI线程执行授权操作:
public class CustomWebChromeClient : WebChromeClient { private readonly Activity _activity; public CustomWebChromeClient(Activity activity) => _activity = activity; public override void OnPermissionRequest(PermissionRequest request) { // 匹配相机权限请求 if (request.GetResources().Contains(PermissionRequest.ResourceVideoCapture)) { _activity.RunOnUiThread(() => request.Grant(request.GetResources())); } else { base.OnPermissionRequest(request); } } }
3. 修正WebView核心配置
除启用JavaScript外,必须关闭MediaPlaybackRequiresUserGesture,否则WebView会阻止相机等媒体设备的自动调用:
var webViewHandler = WebView.Handler as Microsoft.Maui.Platform.MauiWebViewHandler; if (webViewHandler != null) { var nativeWebView = webViewHandler.PlatformView; nativeWebView.SetWebChromeClient(new CustomWebChromeClient(this)); var settings = nativeWebView.Settings; settings.JavaScriptEnabled = true; settings.AllowFileAccess = true; settings.MediaPlaybackRequiresUserGesture = false; // 关键配置 settings.DomStorageEnabled = true; settings.JavaScriptCanOpenWindowsAutomatically = true; }
4. 配置网络安全策略
若网页为HTTP协议或需跨域访问相机,需创建网络安全配置文件:
- 在
Platforms/Android/Resources/xml下新建network_security_config.xml:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config cleartextTrafficPermitted="true"> <trust-anchors> <certificates src="system" /> </trust-anchors> </base-config> <!-- 替换为你的网页域名,本地测试可保留localhost --> <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">your-web-domain.com</domain> <domain includeSubdomains="true">localhost</domain> </domain-config> </network-security-config>
- 在
AndroidManifest.xml的application标签中添加引用:
<application ... android:networkSecurityConfig="@xml/network_security_config">
5. 验证权限请求结果
在MainActivity.cs中重写权限回调,确认权限是否被正确授予:
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Permission[] grantResults) { base.OnRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 100) // 匹配你请求权限时的code { foreach (var result in grantResults) { if (result != Permission.Granted) { Toast.MakeText(this, "相机权限未授予,无法拍照", ToastLength.Long).Show(); } } } }
内容的提问来源于stack exchange,提问作者Giuliano Caruso
相关产品推荐
相关产品推荐

