J'ai un site Web https qui utilise la caméra. Cela fonctionne bien dans mon navigateur de bureau et dans Chrome de mon Android.
Dans Flutter cependant, cela ne fonctionne pas dans WebView, ni WebViewScaffold. Mon application dispose des autorisations de caméra, mais je ne reçois aucune invite pour utiliser la caméra lorsque je me connecte au site Web à partir de mon application Flutter.
J'obtiens cette erreur dans logcat:
chromium: [ERROR:web_contents_delegate.cc(197)] WebContentsDelegate::CheckMediaAccessPermission: Not supported.
Pourquoi cela fonctionne-t-il dans Chrom et pas dans ma WebView?! Et comment le faire fonctionner correctement dans WebView ou WebViewScaffold?
Merci.
3 Réponses :
Cela a été évoqué avant ici et indirectement ici .
Apparemment, les vues Web intégrées n'héritent pas des autorisations de l'application parente.
Vous allez devoir vous procurer le plugin de visualisation Web que vous utilisez pour autoriser les autorisations dont vous avez besoin. Pour le moment, je ne pense pas qu'aucun des plugins de vue Web Flutter expose cela.
Le code côté Android pour la gestion des autorisations est indiqué dans cette réponse .
iOS aura besoin de quelque chose comme l'exemple pour webrtc dans WKWebView montré ici ou ici .
Vous devrez le faire manuellement maintenant. Ou ouvrez un problème pour le plugin de votre choix en demandant cette fonctionnalité / indiquez vous-même le code en l'ajoutant et faites approuver votre RP.
Merci. nous avons fini par abandonner complètement le flottement à cause de cela :)
Pour la visualisation Web, vous devez accorder les bonnes autorisations.
Dans votre cas, pour Android, si vous essayez d'utiliser la caméra et également le microphone (par exemple pour un chat en direct WebRTC), dans le AndroidManifest.xml , vous devez ajouter ces autorisations:
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 {
WidgetsFlutterBinding.ensureInitialized();
await Permission.camera.request();
await Permission.microphone.request();
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => new _MyAppState();
}
class _MyAppState extends State<MyApp> {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: InAppWebViewPage()
);
}
}
class InAppWebViewPage extends StatefulWidget {
@override
_InAppWebViewPageState createState() => new _InAppWebViewPageState();
}
class _InAppWebViewPageState extends State<InAppWebViewPage> {
InAppWebViewController _webViewController;
@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",
initialOptions: InAppWebViewGroupOptions(
crossPlatform: InAppWebViewOptions(
mediaPlaybackRequiresUserGesture: false,
debuggingEnabled: true,
),
),
onWebViewCreated: (InAppWebViewController controller) {
_webViewController = controller;
},
androidOnPermissionRequest: (InAppWebViewController controller, String origin, List<String> resources) async {
return PermissionRequestResponse(resources: resources, action: PermissionRequestResponseAction.GRANT);
}
),
),
),
]))
);
}
}
Mais cela ne suffit pas car vous devez demander des autorisations à l'utilisateur sur la caméra et le microphone . Donc, vous pouvez utiliser le plugin permission_handler .
Donc, pour la webview, vous pouvez utiliser mon plugin flutter_inappwebview qui propose l'événement androidOnPermissionRequest . Vous devez l'implémenter pour Android, c'est-à-dire un événement déclenché lorsque WebView demande l'autorisation d'accéder à une ressource spécifique (c'est-à-dire le événement WebChromeClient.onPermissionRequest ). Dans ce cas, cet événement est utilisé pour accorder des autorisations pour l'API WebRTC.
Un exemple d'utilisation de WebRTC qui fonctionne sur Android:
<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" />
Cet exemple utilise le room 158489234 sur https://appr.tc/ , c'est-à-dire une démonstration de chat vidéo application basée sur WebRTC ( https://github.com/webrtc/apprtc ).
Pour que cela fonctionne, vous devez définir l'option mediaPlaybackRequiresUserGesture sur false et implémenter (pour Android) l'événement onPermissionRequest .
Votre solution fonctionne vraiment, merci! =) Mais il y a un inconvénient que j'ai trouvé. La taille de la vue Web ne peut pas être modifiée à la volée. Si nous modifions la taille, la page Web se recharge simplement
@Lorenzo Pichili, malheureusement, votre exemple ne fonctionne pas pour moi. J'obtiens une boîte de dialogue avec l'erreur: "Impossible d'accéder au média local. Le nom de l'erreur était NotReadableError. Continuer sans envoyer de flux."
Si vous rencontrez le même problème audio, l'ajout de l'autorisation
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
a résolu mon problème sous Android 10.
Je pense que dans certains sites Web pour accéder au matériel de bureau, ils sont implémentés des applets Java qui fonctionnent dans le navigateur de bureau, mais dans le navigateur mobile, les applets ne fonctionnent pas bien