Skip to content

Instantly share code, notes, and snippets.

@pmatatias
Last active August 1, 2024 04:18
Show Gist options
  • Select an option

  • Save pmatatias/89e75e40d612b527e17e49fa777501ea to your computer and use it in GitHub Desktop.

Select an option

Save pmatatias/89e75e40d612b527e17e49fa777501ea to your computer and use it in GitHub Desktop.
open camera from webview for android in flutter app
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 [];
}
}
// 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