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

.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协议或需跨域访问相机,需创建网络安全配置文件:

  1. 在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>
  1. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 08:42:34