在 Android WebView 中遇到摄像头权限被拒绝(NotAllowedError 0)时,通常是因为 WebView 未正确配置或应用未请求相关权限。以下是针对 Android WebView 的完整解决方案:
第一步 检查
- APP 权限设置,是否开启相机权限
- 确认H5页面的域名一定要是 https协议
1. 在 AndroidManifest.xml 中声明权限
确保应用请求摄像头权限和必要的系统特性:
<manifest>
<!-- 声明摄像头权限 -->
<uses-permission android:name="android.permission.CAMERA" />
<!-- 如果使用 WebRTC,可能需要麦克风权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!-- 声明设备支持摄像头(可选但推荐) -->
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
</manifest>
2. 动态请求运行时权限(Android 6.0+)
在 Activity 或 Fragment 中动态请求摄像头权限:
private static final int CAMERA_PERMISSION_REQUEST_CODE = 100;
private void checkCameraPermission() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
// 未授权时请求权限
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.CAMERA},
CAMERA_PERMISSION_REQUEST_CODE);
} else {
// 已授权,初始化 WebView
initWebView();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
if (requestCode == CAMERA_PERMISSION_REQUEST_CODE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
initWebView();
} else {
// 权限被拒绝,提示用户
Toast.makeText(this, "Camera permission required!", Toast.LENGTH_LONG).show();
}
}
}
3. 配置 WebView 以支持摄像头
在初始化 WebView 时启用必要的设置:
private void initWebView() {
WebView webView = findViewById(R.id.webview);
WebSettings settings = webView.getSettings();
// 启用 JavaScript 和媒体访问
settings.setJavaScriptEnabled(true);
settings.setMediaPlaybackRequiresUserGesture(false); // 允许自动播放媒体
// 允许访问摄像头和麦克风(Android 5.0+)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
settings.setAllowFileAccess(true);
settings.setAllowContentAccess(true);
}
// 设置 WebChromeClient 处理权限请求
webView.setWebChromeClient(new CustomWebChromeClient());
webView.loadUrl("https://your-website-url");
}
4. 处理摄像头权限请求回调
自定义 WebChromeClient 以响应 WebView 的权限请求:
private class CustomWebChromeClient extends WebChromeClient {
// Android 5.0+ 处理权限请求
@Override
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public void onPermissionRequest(final PermissionRequest request) {
// 检查请求的权限类型
if (request.getResources()[0].equals(PermissionRequest.RESOURCE_VIDEO_CAPTURE)) {
// 确认应用已获得摄像头权限
if (ContextCompat.checkSelfPermission(MainActivity.this,
Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
request.grant(request.getResources());
} else {
request.deny();
}
}
}
}
5. 确保使用 HTTPS 或本地文件
-
HTTPS 协议:WebView 仅在安全上下文(HTTPS 或
file:///android_asset/)中允许访问摄像头。 -
本地文件:若加载本地 HTML,使用
file:///android_asset/your-page.html。
6. 排查硬件和系统问题
-
检查设备摄像头是否可用:
if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY)) { Toast.makeText(this, "Device has no camera!", Toast.LENGTH_SHORT).show(); } - 重启设备:临时修复可能的驱动冲突。
完整流程总结
- 声明权限和硬件特性 → 2. 动态请求权限 → 3. 配置 WebView → 4. 处理权限回调 → 5. 确保安全协议。
常见问题
Q1:WebView 加载的页面仍提示权限被拒绝
- 检查是否漏掉
WebChromeClient或未覆盖onPermissionRequest。 - 确保
WebSettings.setJavaScriptEnabled(true)。
Q2:Android 10+ 设备无法使用摄像头
- 适配分区存储(Scoped Storage):
<application android:requestLegacyExternalStorage="true">
Q3:黑屏或无画面
- 检查摄像头是否被其他应用占用。
- 确保 HTML 页面正确初始化媒体流(参考浏览器端代码)。
如果是 IFrame 嵌套, 修改 allow属性 增加 camera;autoplay;
<iframe ref="iframes" src="xxx" allow='microphone;camera;autoplay;'></iframe>
//摄像头权限
else if(resource.contains(PermissionRequest.RESOURCE_VIDEO_CAPTURE) {
String[] permissions = new String[]{Permissions.CAMERA};
}
通过以上步骤,可解决 Android WebView 中摄像头权限被拒绝的问题。








网友评论