@openwebf/vue-camera
v1.0.1
Published
Camera component for WebF applications. Wraps Flutter's camera package as HTML custom element for use in WebF.
Readme
WebF Camera
Camera component for WebF applications. Wraps Flutter's camera package as an HTML custom element for capturing photos and videos.
Installation
Add this package to your pubspec.yaml:
dependencies:
webf_camera: ^1.0.1Setup
Register the custom element in your Flutter app's main function:
import 'package:webf_camera/webf_camera.dart';
void main() {
installWebFCamera();
runApp(MyApp());
}Usage
React
Install the React package:
npm install @openwebf/react-cameraBasic usage:
import { useRef } from 'react';
import { FlutterCamera, FlutterCameraElement } from '@openwebf/react-camera';
function CameraApp() {
const cameraRef = useRef<FlutterCameraElement>(null);
const handleCameraReady = (e: CustomEvent) => {
console.log('Camera ready:', e.detail);
console.log('Zoom range:', e.detail.minZoom, '-', e.detail.maxZoom);
};
const takePicture = () => {
cameraRef.current?.takePicture();
};
return (
<div>
<FlutterCamera
ref={cameraRef}
facing="back"
resolution="high"
flashMode="auto"
autoInit={true}
enableAudio={true}
style={{ width: '100%', height: '400px' }}
onCameraready={handleCameraReady}
onPhotocaptured={(e) => console.log('Photo:', e.detail.path)}
onCapturefailed={(e) => console.error('Failed:', e.detail.error)}
/>
<button onClick={takePicture}>Take Photo</button>
</div>
);
}Vue
Install the Vue package:
npm install @openwebf/vue-cameraBasic usage (type-only import with custom element):
<script setup lang="ts">
import { ref } from 'vue';
// Type-only import - no runtime JS in Vue package
import type { FlutterCameraElement } from '@openwebf/vue-camera';
const cameraRef = ref<FlutterCameraElement | null>(null);
function handleCameraReady(e: CustomEvent) {
console.log('Camera ready:', e.detail);
console.log('Zoom range:', e.detail.minZoom, '-', e.detail.maxZoom);
}
function handlePhotoCaptured(e: CustomEvent) {
console.log('Photo saved to:', e.detail.path);
}
function handleCameraFailed(e: CustomEvent) {
console.error('Camera error:', e.detail.error);
}
function takePicture() {
cameraRef.value?.takePicture();
}
</script>
<template>
<div>
<flutter-camera
ref="cameraRef"
facing="back"
resolution="high"
flash-mode="auto"
auto-init
enable-audio
:style="{ width: '100%', height: '400px' }"
@cameraready="handleCameraReady"
@photocaptured="handlePhotoCaptured"
@camerafailed="handleCameraFailed"
/>
<button @click="takePicture">Take Photo</button>
</div>
</template>HTML Custom Element
Basic example:
<flutter-camera></flutter-camera>With options:
<flutter-camera
facing="back"
resolution="high"
flash-mode="auto"
enable-audio="true"
auto-init="true"
></flutter-camera>JavaScript Control
const camera = document.querySelector('flutter-camera');
// Listen for camera ready
camera.addEventListener('cameraready', (e) => {
console.log('Available cameras:', e.detail.cameras);
console.log('Zoom range:', e.detail.minZoom, '-', e.detail.maxZoom);
});
// Take a photo
camera.takePicture();
// Listen for photo captured
camera.addEventListener('photocaptured', (e) => {
console.log('Photo saved to:', e.detail.path);
});
// Record video
camera.startVideoRecording();
// ... recording ...
camera.stopVideoRecording();
// Listen for recording stopped
camera.addEventListener('recordingstopped', (e) => {
console.log('Video saved to:', e.detail.path);
});
// Switch between front/back cameras
camera.switchCamera();
// Control zoom
camera.setZoomLevel(2.0);
// Set flash mode
camera.setFlashMode('torch');
// Set focus point (normalized 0-1 coordinates)
camera.setFocusPoint(0.5, 0.5);
// Handle errors
camera.addEventListener('camerafailed', (e) => {
console.error('Camera error:', e.detail.error, e.detail.code);
});Properties
| Property | Type | Default | Description |
|----------|------|---------|-------------|
| facing | string | 'back' | Camera facing: 'front', 'back', 'external' |
| resolution | string | 'high' | Resolution: 'low', 'medium', 'high', 'veryHigh', 'ultraHigh', 'max' |
| flash-mode | string | 'auto' | Flash mode: 'off', 'auto', 'always', 'torch' |
| enable-audio | boolean | true | Enable audio for video recording |
| auto-init | boolean | true | Auto-initialize camera on mount |
| zoom | number | 1.0 | Current zoom level |
| exposure-offset | number | 0.0 | Current exposure offset |
| focus-mode | string | 'auto' | Focus mode: 'auto', 'locked' |
| exposure-mode | string | 'auto' | Exposure mode: 'auto', 'locked' |
Methods
Async Methods
| Method | Returns | Description |
|--------|---------|-------------|
| initialize() | Promise | Initialize the camera |
| dispose() | Promise | Dispose camera resources |
| takePicture() | Promise | Take a photo |
| startVideoRecording() | Promise | Start video recording |
| stopVideoRecording() | Promise | Stop video recording |
| pauseVideoRecording() | Promise | Pause video recording (iOS only) |
| resumeVideoRecording() | Promise | Resume video recording (iOS only) |
| switchCamera() | Promise | Switch between cameras |
| setFlashMode(mode) | Promise | Set flash mode |
| setZoomLevel(zoom) | Promise | Set zoom level (1.0 to maxZoom) |
| setExposureOffset(offset) | Promise | Set exposure offset |
| setFocusPoint(x, y) | Promise | Set focus point (normalized 0-1) |
| setExposurePoint(x, y) | Promise | Set exposure point (normalized 0-1) |
| lockCaptureOrientation(orientation) | Promise | Lock capture orientation |
| unlockCaptureOrientation() | Promise | Unlock capture orientation |
| getAvailableCameras() | Promise<CameraInfo[]> | Get available cameras |
Sync Methods
| Method | Returns | Description |
|--------|---------|-------------|
| getMinZoomLevel() | number | Get minimum zoom level |
| getMaxZoomLevel() | number | Get maximum zoom level |
| getMinExposureOffset() | number | Get minimum exposure offset |
| getMaxExposureOffset() | number | Get maximum exposure offset |
Events
| Event | Detail | Description |
|-------|--------|-------------|
| cameraready | {cameras, currentCamera, minZoom, maxZoom, minExposureOffset, maxExposureOffset} | Camera initialized |
| camerafailed | {error, code} | Camera initialization failed |
| photocaptured | {path, width, height, size} | Photo captured successfully |
| capturefailed | {error} | Photo capture failed |
| recordingstarted | - | Video recording started |
| recordingstopped | {path, duration} | Video recording stopped |
| recordingfailed | {error} | Video recording failed |
| cameraswitched | {facing, camera} | Camera switched |
| zoomchanged | {zoom} | Zoom level changed |
| focusset | {x, y} | Focus point set |
| cameradisposed | - | Camera disposed |
Error Codes
| Code | Description |
|------|-------------|
| NO_CAMERAS | No cameras available on device |
| INIT_ERROR | Failed to initialize cameras |
| CONTROLLER_ERROR | Failed to create camera controller |
Platform Configuration
iOS
Add to ios/Runner/Info.plist:
<key>NSCameraUsageDescription</key>
<string>Camera access is required for taking photos and videos.</string>
<key>NSMicrophoneUsageDescription</key>
<string>Microphone access is required for recording video with audio.</string>Android
Add to android/app/src/main/AndroidManifest.xml:
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>Set minimum SDK version in android/app/build.gradle:
minSdkVersion 21macOS
Add to macos/Runner/Info.plist:
<key>NSCameraUsageDescription</key>
<string>Camera access is required for taking photos and videos.</string>
<key>NSMicrophoneUsageDescription</key>
<string>Microphone access is required for recording video with audio.</string>Add to macos/Runner/DebugProfile.entitlements and macos/Runner/Release.entitlements:
<key>com.apple.security.device.camera</key>
<true/>
<key>com.apple.security.device.audio-input</key>
<true/>License
Apache License 2.0
