无法从WebView访问摄像机

时间:2019-05-09 13:10:03

标签: android flutter

我有一个使用相机的https网站。在我的桌面浏览器和Android的Chrome浏览器中都能正常运行。

但是,在Flutter中,它不适用于WebView和WebViewScaffold。 我的应用程序具有摄像头权限,但是从Flutter应用程序连接到网站时,没有任何提示使用摄像头的提示。

我在logcat中收到此错误:

chromium: [ERROR:web_contents_delegate.cc(197)] WebContentsDelegate::CheckMediaAccessPermission: Not supported.

为什么它在Chrom中而不在我的WebView中起作用?以及如何使其在WebView或WebViewScaffold中正确运行?

谢谢。

3 个答案:

答案 0 :(得分:1)

如果您在音频方面遇到同样的问题,请添加

<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>

权限解决了我在android 10中的问题。

答案 1 :(得分:0)

此问题已在here之前提出,并在here之间间接提出。

显然,嵌入式Web视图不会继承父应用程序的权限。

您将必须获取要使用的webview插件以允许所需的权限。现在,我不认为任何抖动的Webview插件都可以暴露这一点。

用于权限处理的Android辅助代码显示在this answer中。

iOS将需要类似WKWebView shown herehere中webrtc的示例。

您现在必须手动执行此操作。或为您选择的插件打开一个问题,要求该功能/自己添加代码并添加代码并获得PR批准。

答案 2 :(得分:0)

对于Web视图,您需要授予正确的权限。

对于您的情况,对于Android,如果您尝试同时使用摄像头和麦克风(例如,用于WebRTC实时聊天),请在AndroidManifest.xml中添加以下权限:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.VIDEO_CAPTURE" />
<uses-permission android:name="android.permission.AUDIO_CAPTURE" />

但这还不够,因为您需要向用户请求有关摄像头和麦克风的权限。因此,您可以使用permission_handler插件。另外,例如,Webview需要在Android中实现附加到该Webview的WebChromeClient实例上的onPermissionRequest事件。

因此,对于网络视图,您可以使用我的插件flutter_inappbrowser编辑:它已重命名为flutter_inappwebview)来提供此特定事件并实现{{ 1}}事件,以授予WebRTC API权限。

使用可在Android上使用的WebRTC的示例:

onPermissionRequest

此示例使用https://appr.tc/上的import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter_inappwebview/flutter_inappwebview.dart'; import 'package:permission_handler/permission_handler.dart'; Future main() async { await PermissionHandler().requestPermissions([PermissionGroup.camera, PermissionGroup.microphone]); runApp(new MyApp()); } class MyApp extends StatefulWidget { @override _MyAppState createState() => new _MyAppState(); } class _MyAppState extends State<MyApp> { @override void initState() { super.initState(); } @override void dispose() { super.dispose(); } @override Widget build(BuildContext context) { return MaterialApp( home: InAppWebViewPage() ); } } class InAppWebViewPage extends StatefulWidget { @override _InAppWebViewPageState createState() => new _InAppWebViewPageState(); } class _InAppWebViewPageState extends State<InAppWebViewPage> { InAppWebViewController webView; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("InAppWebView") ), body: Container( child: Column(children: <Widget>[ Expanded( child: Container( child: InAppWebView( initialUrl: "https://appr.tc/r/158489234", initialHeaders: {}, initialOptions: InAppWebViewWidgetOptions( inAppWebViewOptions: InAppWebViewOptions( mediaPlaybackRequiresUserGesture: false, debuggingEnabled: true, ), ), onWebViewCreated: (InAppWebViewController controller) { webView = controller; }, onLoadStart: (InAppWebViewController controller, String url) { }, onLoadStop: (InAppWebViewController controller, String url) { }, onPermissionRequest: (InAppWebViewController controller, String origin, List<String> resources) async { print(origin); print(resources); return PermissionRequestResponse(resources: resources, action: PermissionRequestResponseAction.GRANT); } ), ), ), ])) ); } } 房间,这是一个基于WebRTC(https://github.com/webrtc/apprtc)的视频聊天演示应用程序。 要使其正常工作,您需要将选项158489234设置为mediaPlaybackRequiresUserGesture并实现false事件(对于Android)。