Sfoglia il codice sorgente

Fix 修复设备不兼容扫码和读卡器时闪退的现象

Yue 1 mese fa
parent
commit
ac24c6bd6f

+ 20 - 6
UI/CF.APP/chicken_farm/android/app/src/main/java/com/vber/chicken_farm/rfid/RfidManager.java

@@ -31,12 +31,26 @@ public class RfidManager {
     private final ServiceConnection serviceConnection = new ServiceConnection() {
         @Override
         public void onServiceConnected(ComponentName name, IBinder service) {
-            Log.d(TAG, "RFID服务绑定成功");
-            RfidBinder binder = (RfidBinder) service;
-            rfidService = binder.getService();
-            rfidService.init();
-            rfidService.setListener(listener); // 设置回调监听
-            isBound = true;
+            try {
+                Log.d(TAG, "RFID服务绑定成功");
+                RfidBinder binder = (RfidBinder) service;
+                rfidService = binder.getService();
+                
+                // 初始化服务,如果失败则记录错误但不崩溃
+                boolean initSuccess = rfidService.init();
+                if (!initSuccess) {
+                    Log.e(TAG, "RFID服务初始化失败");
+                }
+                
+                rfidService.setListener(listener); // 设置回调监听
+                isBound = true;
+            } catch (UnsatisfiedLinkError e) {
+                Log.e(TAG, "绑定服务时加载本地库失败", e);
+                isBound = false;
+            } catch (Exception e) {
+                Log.e(TAG, "绑定服务时发生错误", e);
+                isBound = false;
+            }
         }
 
         @Override

+ 3 - 0
UI/CF.APP/chicken_farm/android/app/src/main/java/com/vber/chicken_farm/rfid/RfidMethodCallHandler.java

@@ -169,6 +169,9 @@ public class RfidMethodCallHandler implements MethodCallHandler, RfidListener, E
             boolean success = rfidManager.connect(retryTimes);
             result.success(success);
             Log.d(TAG, "RFID连接请求已处理。 ");
+        } catch (UnsatisfiedLinkError e) {
+            Log.e(TAG, "连接设备时加载本地库失败", e);
+            result.error("CONNECT_FAILED", "连接RFID设备失败,本地库加载错误: " + e.getMessage(), null);
         } catch (Exception e) {
             Log.e(TAG, "连接设备失败", e);
             result.error("CONNECT_FAILED", "连接RFID设备失败: " + e.getMessage(), null);

+ 8 - 0
UI/CF.APP/chicken_farm/android/app/src/main/java/com/vber/chicken_farm/rfid/RfidService.java

@@ -119,6 +119,9 @@ public class RfidService extends Service {
             initSound();
             registerScreenStateReceiver(); // 注册屏幕状态监听
             return true;
+        } catch (UnsatisfiedLinkError e) {
+            Log.e(RfidConstants.TAG, "加载本地库失败,可能是缺少libSerialPort.so", e);
+            return false;
         } catch (Exception e) {
             Log.e(RfidConstants.TAG, "读卡器初始化失败", e);
             return false;
@@ -198,6 +201,11 @@ public class RfidService extends Service {
             }
             readerParameter = new ReaderParameter();
             Log.d(RfidConstants.TAG, "RFID阅读器初始化成功");
+        } catch (UnsatisfiedLinkError e) {
+            Log.e(RfidConstants.TAG, "加载本地库失败,可能是缺少libSerialPort.so", e);
+            if (listener != null) {
+                listener.onScanError("加载本地库失败,请检查设备兼容性:" + e.getMessage());
+            }
         } catch (Exception e) {
             Log.e(RfidConstants.TAG, "Init reader failed", e);
             if (listener != null) {

+ 13 - 1
UI/CF.APP/chicken_farm/android/app/src/main/java/com/vber/chicken_farm/scan/ScanManager.java

@@ -29,7 +29,19 @@ public class ScanManager {
             ScanBinder binder = (ScanBinder) service;
             scanService = binder.getService();
             scanService.setListener(listener); // 设置回调监听
-            scanService.openScanHead();
+            try {
+                scanService.openScanHead();
+            } catch (UnsatisfiedLinkError e) {
+                Log.e(TAG, "绑定服务时加载本地库失败", e);
+                if (listener != null) {
+                    listener.onScanError("绑定服务时加载本地库失败:" + e.getMessage());
+                }
+            } catch (Exception e) {
+                Log.e(TAG, "绑定服务时发生错误", e);
+                if (listener != null) {
+                    listener.onScanError("绑定服务时发生错误:" + e.getMessage());
+                }
+            }
             isBound = true;
         }
 

+ 27 - 0
UI/CF.APP/chicken_farm/android/app/src/main/java/com/vber/chicken_farm/scan/ScanMethodCallHandler.java

@@ -106,6 +106,9 @@ public class ScanMethodCallHandler implements MethodCallHandler, ScanListener {
             boolean success = scanManager.openScanHead();
             result.success(success);
             Log.d(TAG, "打开扫描头请求已处理");
+        } catch (UnsatisfiedLinkError e) {
+            Log.e(TAG, "打开扫描头时加载本地库失败", e);
+            result.error("OPEN_SCAN_HEAD_FAILED", "打开扫描头失败,请检查设备兼容性:" + e.getMessage(), null);
         } catch (Exception e) {
             Log.e(TAG, "打开扫描头失败", e);
             result.error("OPEN_SCAN_HEAD_FAILED", "打开扫描头失败: " + e.getMessage(), null);
@@ -120,6 +123,9 @@ public class ScanMethodCallHandler implements MethodCallHandler, ScanListener {
             scanManager.closeScanHead();
             result.success(true);
             Log.d(TAG, "关闭扫描头请求已处理");
+        } catch (UnsatisfiedLinkError e) {
+            Log.e(TAG, "关闭扫描头时加载本地库失败", e);
+            result.error("CLOSE_SCAN_HEAD_FAILED", "关闭扫描头失败,请检查设备兼容性:" + e.getMessage(), null);
         } catch (Exception e) {
             Log.e(TAG, "关闭扫描头失败", e);
             result.error("CLOSE_SCAN_HEAD_FAILED", "关闭扫描头失败: " + e.getMessage(), null);
@@ -138,6 +144,9 @@ public class ScanMethodCallHandler implements MethodCallHandler, ScanListener {
             } else {
                 Log.w(TAG, "开始扫描请求失败");
             }
+        } catch (UnsatisfiedLinkError e) {
+            Log.e(TAG, "开始扫描时加载本地库失败", e);
+            result.error("START_SCAN_FAILED", "开始扫描失败,请检查设备兼容性:" + e.getMessage(), null);
         } catch (Exception e) {
             Log.e(TAG, "开始扫描失败", e);
             result.error("START_SCAN_FAILED", "开始扫描失败: " + e.getMessage(), null);
@@ -152,6 +161,9 @@ public class ScanMethodCallHandler implements MethodCallHandler, ScanListener {
             scanManager.stopScan();
             result.success(null);
             Log.d(TAG, "停止扫描请求已处理");
+        } catch (UnsatisfiedLinkError e) {
+            Log.e(TAG, "停止扫描时加载本地库失败", e);
+            result.error("STOP_SCAN_FAILED", "停止扫描失败,请检查设备兼容性:" + e.getMessage(), null);
         } catch (Exception e) {
             Log.e(TAG, "停止扫描失败", e);
             result.error("STOP_SCAN_FAILED", "停止扫描失败: " + e.getMessage(), null);
@@ -166,6 +178,9 @@ public class ScanMethodCallHandler implements MethodCallHandler, ScanListener {
             scanManager.resetTimeout();
             result.success(null);
             Log.d(TAG, "重置超时请求已处理");
+        } catch (UnsatisfiedLinkError e) {
+            Log.e(TAG, "重置超时时加载本地库失败", e);
+            result.error("RESET_TIMEOUT_FAILED", "重置超时失败,请检查设备兼容性:" + e.getMessage(), null);
         } catch (Exception e) {
             Log.e(TAG, "重置超时失败", e);
             result.error("RESET_TIMEOUT_FAILED", "重置超时失败: " + e.getMessage(), null);
@@ -184,6 +199,9 @@ public class ScanMethodCallHandler implements MethodCallHandler, ScanListener {
             } else {
                 result.error("INVALID_ARGUMENT", "灯光模式参数不能为空", null);
             }
+        } catch (UnsatisfiedLinkError e) {
+            Log.e(TAG, "设置灯光模式时加载本地库失败", e);
+            result.error("SET_LIGHTING_MODE_FAILED", "设置灯光模式失败,请检查设备兼容性:" + e.getMessage(), null);
         } catch (Exception e) {
             Log.e(TAG, "设置灯光模式失败", e);
             result.error("SET_LIGHTING_MODE_FAILED", "设置灯光模式失败: " + e.getMessage(), null);
@@ -198,6 +216,9 @@ public class ScanMethodCallHandler implements MethodCallHandler, ScanListener {
             boolean isScanning = scanManager.isScanning();
             result.success(isScanning);
             Log.d(TAG, "检查扫描状态成功: " + isScanning);
+        } catch (UnsatisfiedLinkError e) {
+            Log.e(TAG, "检查扫描状态时加载本地库失败", e);
+            result.error("CHECK_SCANNING_FAILED", "检查扫描状态失败,请检查设备兼容性:" + e.getMessage(), null);
         } catch (Exception e) {
             Log.e(TAG, "检查扫描状态失败", e);
             result.error("CHECK_SCANNING_FAILED", "检查扫描状态失败: " + e.getMessage(), null);
@@ -212,6 +233,9 @@ public class ScanMethodCallHandler implements MethodCallHandler, ScanListener {
             boolean isOpened = scanManager.isScanHeadOpened();
             result.success(isOpened);
             Log.d(TAG, "检查扫描头状态成功: " + isOpened);
+        } catch (UnsatisfiedLinkError e) {
+            Log.e(TAG, "检查扫描头状态时加载本地库失败", e);
+            result.error("CHECK_SCAN_HEAD_OPENED_FAILED", "检查扫描头状态失败,请检查设备兼容性:" + e.getMessage(), null);
         } catch (Exception e) {
             Log.e(TAG, "检查扫描头状态失败", e);
             result.error("CHECK_SCAN_HEAD_OPENED_FAILED", "检查扫描头状态失败: " + e.getMessage(), null);
@@ -226,6 +250,9 @@ public class ScanMethodCallHandler implements MethodCallHandler, ScanListener {
             scanManager.release();
             result.success(null);
             Log.d(TAG, "释放资源请求已处理");
+        } catch (UnsatisfiedLinkError e) {
+            Log.e(TAG, "释放资源时加载本地库失败", e);
+            result.error("RELEASE_RESOURCES_FAILED", "释放资源失败,请检查设备兼容性:" + e.getMessage(), null);
         } catch (Exception e) {
             Log.e(TAG, "释放资源失败", e);
             result.error("RELEASE_RESOURCES_FAILED", "释放资源失败: " + e.getMessage(), null);

+ 53 - 1
UI/CF.APP/chicken_farm/android/app/src/main/java/com/vber/chicken_farm/scan/ScanService.java

@@ -212,7 +212,21 @@ public class ScanService extends Service {
     public boolean openScanHead() {
         // 初始化扫描管理器
         if (scanManager == null) {
-            scanManager = ScanManager.getDefaultInstance(this);
+            try {
+                scanManager = ScanManager.getDefaultInstance(this);
+            } catch (UnsatisfiedLinkError e) {
+                Log.e(TAG, "加载本地库失败,可能是缺少so库文件", e);
+                if (listener != null) {
+                    listener.onScanError("加载本地库失败,请检查设备兼容性:" + e.getMessage());
+                }
+                return false;
+            } catch (Exception e) {
+                Log.e(TAG, "获取ScanManager实例失败", e);
+                if (listener != null) {
+                    listener.onScanError("扫描硬件初始化失败: " + e.getMessage());
+                }
+                return false;
+            }
             if (scanManager == null) {
                 Log.e(TAG, "获取ScanManager实例失败");
                 if (listener != null) {
@@ -258,6 +272,12 @@ public class ScanService extends Service {
 
             Log.d(TAG, "扫描头已打开");
             return true;
+        } catch (UnsatisfiedLinkError e) {
+            Log.e(TAG, "加载本地库失败,可能是缺少so库文件", e);
+            if (listener != null) {
+                listener.onScanError("加载本地库失败,请检查设备兼容性:" + e.getMessage());
+            }
+            return false;
         } catch (Exception e) {
             Log.e(TAG, "打开扫描头失败", e);
             if (listener != null) {
@@ -326,6 +346,11 @@ public class ScanService extends Service {
              * 是否启用所有二维码(true-启用; false-不启用)
              */
             scanManager.enableSYM2D(true);
+        } catch (UnsatisfiedLinkError e) {
+            Log.e(TAG, "设置默认参数时加载本地库失败", e);
+            if (listener != null) {
+                listener.onScanError("设置默认参数失败,请检查设备兼容性:" + e.getMessage());
+            }
         } catch (Exception e) {
             Log.e(TAG, "设置默认参数失败", e);
         }
@@ -342,6 +367,11 @@ public class ScanService extends Service {
         if (scanManager != null && isScanning) {
             try {
                 scanManager.stopDecode();
+            } catch (UnsatisfiedLinkError e) {
+                Log.e(TAG, "停止解码时加载本地库失败", e);
+                if (listener != null) {
+                    listener.onScanError("停止解码失败,请检查设备兼容性:" + e.getMessage());
+                }
             } catch (Exception e) {
                 Log.e(TAG, "停止解码失败", e);
             }
@@ -352,6 +382,11 @@ public class ScanService extends Service {
             try {
                 scanManager.closeScanner();
                 Log.d(TAG, "扫描头已关闭");
+            } catch (UnsatisfiedLinkError e) {
+                Log.e(TAG, "关闭扫描头时加载本地库失败", e);
+                if (listener != null) {
+                    listener.onScanError("关闭扫描头失败,请检查设备兼容性:" + e.getMessage());
+                }
             } catch (Exception e) {
                 Log.e(TAG, "关闭扫描头失败", e);
             }
@@ -409,6 +444,13 @@ public class ScanService extends Service {
 
             Log.d(TAG, "开始扫描");
             return true;
+        } catch (UnsatisfiedLinkError e) {
+            Log.e(TAG, "开始扫描时加载本地库失败", e);
+            if (listener != null) {
+                listener.onScanError("开始扫描失败,请检查设备兼容性:" + e.getMessage());
+            }
+            isScanning = false;
+            return false;
         } catch (Exception e) {
             Log.e(TAG, "开始扫描失败", e);
             isScanning = false;
@@ -431,6 +473,11 @@ public class ScanService extends Service {
             try {
                 scanManager.stopDecode();
                 Log.d(TAG, "扫描已停止");
+            } catch (UnsatisfiedLinkError e) {
+                Log.e(TAG, "停止扫描时加载本地库失败", e);
+                if (listener != null) {
+                    listener.onScanError("停止扫描失败,请检查设备兼容性:" + e.getMessage());
+                }
             } catch (Exception e) {
                 Log.e(TAG, "停止扫描失败", e);
             }
@@ -487,6 +534,11 @@ public class ScanService extends Service {
                 int[] symValue = { mode };
                 scanManager.setSYMValueInts(paramIDList, symValue);
                 Log.d(TAG, "灯光模式设置为:" + mode);
+            } catch (UnsatisfiedLinkError e) {
+                Log.e(TAG, "设置灯光模式时加载本地库失败", e);
+                if (listener != null) {
+                    listener.onScanError("设置灯光模式失败,请检查设备兼容性:" + e.getMessage());
+                }
             } catch (Exception e) {
                 Log.e(TAG, "设置灯光模式失败", e);
                 if (listener != null) {

+ 21 - 7
UI/CF.APP/chicken_farm/lib/core/services/pda/rfid_manager.dart

@@ -2,6 +2,7 @@ import 'package:chicken_farm/core/config/app_config.dart';
 import 'package:chicken_farm/core/utils/logger.dart';
 import 'package:chicken_farm/core/utils/toast.dart';
 import 'package:chicken_farm/modes/rfid/rfid_model.dart';
+import 'package:flutter/services.dart';
 import 'rfid_channel.dart';
 import 'dart:async';
 
@@ -138,14 +139,27 @@ class RfidManager {
     _onConnectSuccess = null;
   }
 
-  Future<void> connect() async {
-    if (!(await RfidChannel.isConnected())) {
-      _startConnectionChecking();
+  /// 连接RFID读卡器
+  Future<bool> connect() async {
+    try {
+      final bool connected = await RfidChannel.connect(retryTimes: 3);
+      if (connected) {
+        _startConnectionChecking();
+        logger.i("✅ RFID读卡器连接成功");
+      } else {
+        logger.e("❌ RFID读卡器连接失败");
+      }
+      return connected;
+    } on PlatformException catch (e) {
+      logger.e("❌ RFID读卡器连接异常: ${e.message}");
+      // 显示友好的错误提示而不是让应用崩溃
+      ToastUtil.errorAlert("读卡器连接失败,请检查设备兼容性");
+      return false;
+    } catch (e) {
+      logger.e("❌ RFID读卡器连接未知错误: $e");
+      ToastUtil.errorAlert("读卡器连接出现未知错误");
+      return false;
     }
-    // 在新线程中执行初始化
-    Timer.run(() async {
-      await RfidChannel.connect(retryTimes: 2);
-    });
   }
 
   /// 开始连接状态检查