Last active
August 1, 2024 04:18
-
-
Save pmatatias/89e75e40d612b527e17e49fa777501ea to your computer and use it in GitHub Desktop.
open camera from webview for android in flutter app
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import 'dart:io'; | |
| import 'package:file_picker/file_picker.dart'; | |
| import 'package:flutter/material.dart'; | |
| import 'package:webview_flutter/webview_flutter.dart'; | |
| import 'package:image_picker/image_picker.dart' as image_picker; | |
| // ignore: depend_on_referenced_packages | |
| import 'package:webview_flutter_android/webview_flutter_android.dart' | |
| as webview_flutter_android; | |
| class AndroWebviewHanlder extends StatefulWidget { | |
| const AndroWebviewHanlder({super.key, required this.source}); | |
| final String source; | |
| @override | |
| State<AndroWebviewHanlder> createState() => _AndroWebviewHanlderState(); | |
| } | |
| class _AndroWebviewHanlderState extends State<AndroWebviewHanlder> { | |
| late final WebViewController _controller; | |
| @override | |
| void initState() { | |
| super.initState(); | |
| _controller = WebViewController() | |
| ..setJavaScriptMode(JavaScriptMode.unrestricted) | |
| ..setBackgroundColor(const Color(0x00000000)) | |
| ..enableZoom(true) | |
| ..setNavigationDelegate( | |
| NavigationDelegate( | |
| onProgress: (int progress) async {}, | |
| onPageStarted: (String url) {}, | |
| onPageFinished: (String url) {}, | |
| onWebResourceError: (WebResourceError error) {}, | |
| onNavigationRequest: (NavigationRequest request) { | |
| return NavigationDecision.navigate; | |
| }, | |
| ), | |
| ) | |
| ..loadRequest(Uri.parse(widget.source)); | |
| fileIframeHandler(_controller); | |
| } | |
| @override | |
| Widget build(BuildContext context) { | |
| return Scaffold( | |
| appBar: AppBar( | |
| backgroundColor: Colors.indigo, | |
| title: const Text( | |
| "Android Webview Handler", | |
| style: TextStyle(color: Colors.white), | |
| )), | |
| body: SafeArea( | |
| child: WebViewWidget(controller: _controller), | |
| ), | |
| ); | |
| } | |
| } | |
| void fileIframeHandler(WebViewController controller, | |
| {bool limitSize = false}) async { | |
| if (Platform.isAndroid) { | |
| final androidController = (controller.platform | |
| as webview_flutter_android.AndroidWebViewController); | |
| await androidController.setOnShowFileSelector(_androidFilePicker); | |
| } | |
| } | |
| /// This method is called when the user tries to upload a file from the webview. | |
| /// It will open the file picker and return the selected files. | |
| /// If the user cancels the file picker, it will return an empty list. | |
| /// | |
| /// Returns uri's of the selected files. | |
| Future<List<String>> _androidFilePicker( | |
| webview_flutter_android.FileSelectorParams params) async { | |
| try { | |
| if (params.acceptTypes.any((type) => type == 'image/*')) { | |
| final picker = image_picker.ImagePicker(); | |
| final photo = await picker.pickImage( | |
| source: image_picker.ImageSource.camera, | |
| // maxHeight: 800, | |
| // maxWidth: 800, | |
| // imageQuality: 60, | |
| ); | |
| if (photo == null) { | |
| return []; | |
| } | |
| return [Uri.file(photo.path).toString()]; | |
| } else if (params.acceptTypes.any((type) => type == 'video/*')) { | |
| final picker = image_picker.ImagePicker(); | |
| final vidFile = await picker.pickVideo( | |
| source: image_picker.ImageSource.camera, | |
| maxDuration: const Duration(seconds: 10)); | |
| if (vidFile == null) { | |
| return []; | |
| } | |
| return [Uri.file(vidFile.path).toString()]; | |
| } else if (params.mode == | |
| webview_flutter_android.FileSelectorMode.openMultiple) { | |
| final attachments = | |
| await FilePicker.platform.pickFiles(allowMultiple: true); | |
| if (attachments == null) return []; | |
| return attachments.files | |
| .where((element) => element.path != null) | |
| .map((e) => File(e.path!).uri.toString()) | |
| .toList(); | |
| } else { | |
| final attachment = await FilePicker.platform.pickFiles(); | |
| if (attachment == null) return []; | |
| File file = File(attachment.files.single.path!); | |
| return [file.uri.toString()]; | |
| } | |
| } catch (e) { | |
| return []; | |
| } | |
| } | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // ignore: avoid_web_libraries_in_flutter | |
| import 'dart:html' as html; | |
| import 'dart:ui_web' as ui; | |
| import 'package:flutter/material.dart'; | |
| class WebIframeHanlder extends StatefulWidget { | |
| final String source; | |
| const WebIframeHanlder({super.key, required this.source}); | |
| @override | |
| State<WebIframeHanlder> createState() => _WebIframeHanlderState(); | |
| } | |
| class _WebIframeHanlderState extends State<WebIframeHanlder> { | |
| final html.IFrameElement _iframeElement = html.IFrameElement(); | |
| @override | |
| void initState() { | |
| super.initState(); | |
| _iframeElement.src = widget.source; | |
| _iframeElement.style.border = 'none'; | |
| _iframeElement.style.width = '100%'; | |
| _iframeElement.style.height = '100%'; | |
| // ignore: undefined_prefixed_name | |
| ui.platformViewRegistry.registerViewFactory( | |
| widget.source, //use source as registered key to ensure uniqueness | |
| (int viewId) => _iframeElement, | |
| ); | |
| // Add the iframe to the UI | |
| html.document.body!.children.add(_iframeElement); | |
| } | |
| @override | |
| void dispose() { | |
| _iframeElement.remove(); | |
| super.dispose(); | |
| } | |
| @override | |
| Widget build(BuildContext context) { | |
| return Scaffold( | |
| appBar: AppBar( | |
| backgroundColor: Colors.indigo, | |
| title: const Text( | |
| "Web Iframe Handler", | |
| style: TextStyle(color: Colors.white), | |
| )), | |
| body: HtmlElementView( | |
| key: UniqueKey(), | |
| viewType: widget.source, | |
| ), | |
| ); | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment