Files
flutterApp/lib/features/v2/usb_camera/data/uvc_camera_service.dart

76 lines
2.0 KiB
Dart

import 'dart:async';
import 'package:usb_camera_android/usb_camera_android.dart' as plugin;
import '../domain/usb_camera_device.dart';
import 'usb_camera_prefs.dart';
/// UVC 摄像头原生能力封装。
class UvcCameraService {
bool _isOpen = false;
StreamSubscription? _eventSub;
/// 枚举当前已连接的 UVC 设备。
Future<List<UsbCameraDevice>> enumerateDevices() async {
final list = await plugin.UsbCameraAndroid.getDeviceList();
return list
.map(
(d) => UsbCameraDevice(
deviceId: d.deviceId,
vendorId: d.vendorId,
productId: d.productId,
productName: d.productName,
),
)
.toList();
}
/// 请求并打开指定设备。
Future<void> open(
UsbCameraDevice device, {
String? resolution,
}) async {
await UsbCameraPrefs.setLastDeviceId(device.deviceId);
if (resolution != null) {
await UsbCameraPrefs.setLastResolution(resolution);
}
await plugin.UsbCameraAndroid.open(
device.deviceId,
resolution: resolution,
);
_isOpen = true;
}
/// 关闭当前设备。
Future<void> close() async {
if (!_isOpen) return;
_isOpen = false;
await plugin.UsbCameraAndroid.close();
}
/// 切换分辨率。
Future<void> setResolution(String resolution) async {
await UsbCameraPrefs.setLastResolution(resolution);
await plugin.UsbCameraAndroid.setResolution(resolution);
}
/// 监听原生端插拔/权限等事件。
void startListeningEvents(
void Function(String type, String? deviceId) onEvent,
) {
_eventSub?.cancel();
_eventSub = plugin.UsbCameraAndroid.eventStream.listen((event) {
final type = event['type'] as String?;
final data = event['data'] as Map?;
final deviceId = data?['deviceId'] as String?;
onEvent(type ?? 'unknown', deviceId);
});
}
/// 释放事件监听。
Future<void> dispose() async {
await _eventSub?.cancel();
_eventSub = null;
}
}