我有一个使用相机的https网站。在我的桌面浏览器和Android的Chrome浏览器中都能正常运行。
但是,在Flutter中,它不适用于WebView和WebViewScaffold。 我的应用程序具有摄像头权限,但是从Flutter应用程序连接到网站时,没有任何提示使用摄像头的提示。
我在logcat中收到此错误:
chromium: [ERROR:web_contents_delegate.cc(197)] WebContentsDelegate::CheckMediaAccessPermission: Not supported.
为什么它在Chrom中而不在我的WebView中起作用?以及如何使其在WebView或WebViewScaffold中正确运行?
谢谢。
答案 0 :(得分:1)
如果您在音频方面遇到同样的问题,请添加
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
权限解决了我在android 10中的问题。
答案 1 :(得分:0)
显然,嵌入式Web视图不会继承父应用程序的权限。
您将必须获取要使用的webview插件以允许所需的权限。现在,我不认为任何抖动的Webview插件都可以暴露这一点。
用于权限处理的Android辅助代码显示在this answer中。
iOS将需要类似WKWebView shown here或here中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)。