76 lines
2.0 KiB
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;
|
|
}
|
|
}
|