USB 摄像头适配iPadOS17+ios端的配置

This commit is contained in:
2026-10-22 12:54:08 +08:00
parent 58a23ef218
commit 615d76a8ce
4 changed files with 401 additions and 0 deletions

View File

@@ -0,0 +1,74 @@
//
// UsbCameraAndroidPlugin.swift
// usb_camera_android
//
// Flutter iOS 插件入口:注册 MethodChannel / EventChannel / PlatformView,
// 通道名与 Android 端完全一致,上层 Dart 无需区分平台。
//
import Flutter
import UIKit
public class UsbCameraAndroidPlugin: NSObject, FlutterPlugin, FlutterStreamHandler {
private static let METHOD_CHANNEL = "com.maibu.usb_camera_android/methods"
private static let EVENT_CHANNEL = "com.maibu.usb_camera_android/events"
private static let VIEW_TYPE = "com.maibu.usb_camera_android/preview"
private let engine = UsbCameraEngine()
public static func register(with registrar: FlutterPluginRegistrar) {
let instance = UsbCameraAndroidPlugin()
let methodChannel = FlutterMethodChannel(
name: METHOD_CHANNEL, binaryMessenger: registrar.messenger())
registrar.addMethodCallDelegate(instance, channel: methodChannel)
let eventChannel = FlutterEventChannel(
name: EVENT_CHANNEL, binaryMessenger: registrar.messenger())
eventChannel.setStreamHandler(instance)
registrar.register(UsbCameraViewFactory(engine: instance.engine),
withId: VIEW_TYPE)
instance.engine.startMonitoring()
}
// MARK: - FlutterStreamHandler(转发给 engine)
public func onListen(withArguments arguments: Any?,
eventSink events: @escaping FlutterEventSink) -> FlutterError? {
return engine.onListen(withArguments: arguments, eventSink: events)
}
public func onCancel(withArguments arguments: Any?) -> FlutterError? {
return engine.onCancel(withArguments: arguments)
}
// MARK: - MethodCallHandler
public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
switch call.method {
case "isSupported":
result(engine.isSupported())
case "getDeviceList":
result(engine.getDeviceList())
case "getSupportedResolutions":
result(engine.getSupportedResolutions())
case "getPreviewSize":
result(engine.getPreviewSize())
case "open":
let args = call.arguments as? [String: Any]
engine.open(deviceId: args?["deviceId"] as? String,
resolution: args?["resolution"] as? String,
result: result)
case "close":
engine.close(result: result)
case "setResolution":
let args = call.arguments as? [String: Any]
engine.setResolution(args?["resolution"] as? String, result: result)
default:
result(FlutterMethodNotImplemented)
}
}
}