Explorar el Código

新增 usb 监听

gavin.chen hace 1 año
padre
commit
439e6327c0

+ 67 - 1
android/app/src/main/kotlin/com/example/vnoteapp/MainActivity.kt

@@ -1,10 +1,76 @@
 package com.vinno.vitalapp
 
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.content.IntentFilter
+import android.hardware.usb.UsbDevice
+import android.hardware.usb.UsbManager
 import android.os.Bundle
 import io.flutter.embedding.android.FlutterActivity
+import io.flutter.embedding.engine.FlutterEngine
+import io.flutter.plugin.common.EventChannel
+import kotlin.collections.HashMap
+
+class MainActivity : FlutterActivity() {
+    private lateinit var usbEventReceiver: BroadcastReceiver
+    private lateinit var eventChannel: EventChannel
+    private var eventSink: EventChannel.EventSink? = null
 
-class MainActivity: FlutterActivity() {
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
+
+        // 初始化BroadcastReceiver
+        usbEventReceiver = object : BroadcastReceiver() {
+            override fun onReceive(context: Context?, intent: Intent) {
+                val usbDevice: UsbDevice? = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE)
+                val deviceName = usbDevice?.deviceName ?: "Unknown"
+                val deviceType = usbDevice?.deviceClass?.toString() ?: "Unknown"
+
+                val data = HashMap<String, String>().apply {
+                    put("name", deviceName)
+                    put("type", deviceType)
+                }
+
+                when (intent.action) {
+                    UsbManager.ACTION_USB_DEVICE_ATTACHED -> {
+                        data["action"] = "attached"
+                        eventSink?.success(data)
+                    }
+                    UsbManager.ACTION_USB_DEVICE_DETACHED -> {
+                        data["action"] = "detached"
+                        eventSink?.success(data)
+                    }
+                }
+            }
+        }
+
+        // 注册BroadcastReceiver以监听USB设备的变更
+        IntentFilter().apply {
+            addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED)
+            addAction(UsbManager.ACTION_USB_DEVICE_DETACHED)
+            registerReceiver(usbEventReceiver, this)
+        }
+    }
+
+    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
+        super.configureFlutterEngine(flutterEngine)
+
+        // 设置与Flutter的通信通道
+        eventChannel = EventChannel(flutterEngine.dartExecutor.binaryMessenger, "com.vinno.vitalapp/usb_events")
+        eventChannel.setStreamHandler(object : EventChannel.StreamHandler {
+            override fun onListen(arguments: Any?, events: EventChannel.EventSink) {
+                eventSink = events
+            }
+
+            override fun onCancel(arguments: Any?) {
+                eventSink = null
+            }
+        })
+    }
+
+    override fun onDestroy() {
+        unregisterReceiver(usbEventReceiver)
+        super.onDestroy()
     }
 }

+ 3 - 0
lib/pages/admin/controller.dart

@@ -8,6 +8,7 @@ import 'package:vitalapp/architecture/defines.dart';
 import 'package:vitalapp/architecture/network_connectivity.dart';
 import 'package:vitalapp/global.dart';
 import 'package:vitalapp/pages/admin/camera_test.dart';
+import 'package:vitalapp/pages/admin/usb_state.dart';
 import 'package:vitalapp/routes/routes.dart';
 import 'package:vnote_device_plugin/vnote_device_plugin_platform_interface.dart';
 
@@ -22,6 +23,8 @@ class AdminController extends FControllerBase {
     state.isNetOnline = kIsOnline;
     state.isDeviceLogEnable = VnoteDevicePluginPlatform.instance.isLogEnable;
     netChecker.onlineChangedEvent.addListener(_onNetOnlineChanged);
+    UsbState usbState = UsbState();
+    usbState.startListening();
     super.onInit();
   }
 

+ 31 - 0
lib/pages/admin/usb_state.dart

@@ -0,0 +1,31 @@
+import 'package:flutter/services.dart';
+
+class UsbState {
+  final EventChannel _eventChannel =
+      EventChannel('com.vinno.vitalapp/usb_events');
+
+  void startListening() {
+    _eventChannel.receiveBroadcastStream().listen(
+      (dynamic event) {
+        // 这里我们期望event是一个Map,包含USB设备的信息
+        Map<dynamic, dynamic> usbEvent = event as Map<dynamic, dynamic>;
+        print('USB Event: $usbEvent');
+
+        String action = usbEvent['action'] ?? 'unknown';
+        String name = usbEvent['name'] ?? 'unknown';
+        String type = usbEvent['type'] ?? 'unknown';
+
+        if (action == 'attached') {
+          print('USB device attached: Name - $name, Type - $type');
+          // USB设备已连接,可以根据需要处理
+        } else if (action == 'detached') {
+          print('USB device detached: Name - $name, Type - $type');
+          // USB设备已断开,可以根据需要处理
+        }
+      },
+      onError: (dynamic error) {
+        print('USB Event Error: $error');
+      },
+    );
+  }
+}

+ 10 - 0
lib/pages/admin/view.dart

@@ -168,6 +168,16 @@ class AdminPage extends GetView<AdminController> {
                 controller.detectCamera();
               },
             ),
+            ElevatedButton.icon(
+              label: Text("Open Camera Test Page"),
+              icon: Icon(
+                Icons.refresh,
+                size: 30,
+              ),
+              onPressed: () {
+                controller.openCameraTest();
+              },
+            ),
           ],
         ),
         // 多行文本