Browse Source

Fix 修复息屏后扫码出错的问题。

Yue 3 days ago
parent
commit
dcb04f0b64

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

@@ -45,21 +45,18 @@ public class ScanService extends Service {
     private final BroadcastReceiver screenReceiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
-            if (intent == null || intent.getAction() == null || !isScanHeadOpened()) return;
+            if (intent == null || intent.getAction() == null) return;
             
             switch (intent.getAction()) {
                 case Intent.ACTION_SCREEN_ON:
-                    // 屏幕亮起 - 若处于扫描中,恢复解码并重置单次超时
-                    if (isScanning) {
-                        resumeScan();
-                        resetSingleTimeout();
-                    }
+                    // 屏幕亮起 - 重新打开扫描头
+                    Log.d(TAG, "屏幕亮起");
+                    openScanHead();
                     break;
                 case Intent.ACTION_SCREEN_OFF:
-                    // 屏幕熄灭 - 暂停解码,保留扫描头
-                    if (isScanning) {
-                        pauseScan();
-                    }
+                    // 屏幕熄灭 - 关闭扫描头
+                    Log.d(TAG, "屏幕熄灭");
+                    closeScanHead();
                     break;
             }
         }
@@ -156,12 +153,6 @@ public class ScanService extends Service {
      * 逻辑:初始化扫描硬件+注册广播+启动闲置超时+默认开启瞄准灯
      */
     public boolean openScanHead() {
-        if (isScanHeadOpened()) {
-            Log.w(TAG, "扫描头已打开,无需重复调用");
-            resetIdleTimeout(); // 重置闲置超时
-            return true;
-        }
-
         // 1. 懒加载初始化扫描管理器
         lazyInitScanManager();
         if (scanManager == null) {
@@ -171,15 +162,29 @@ public class ScanService extends Service {
             setDefaultParams();
             // 2. 打开扫描头硬件
             scanManager.openScanner();
-            while (!scanManager.isScannerOpen()) {
+            int retryCount = 0;
+            while (!scanManager.isScannerOpen() && retryCount < 10) {
                 Thread.sleep(50);
+                retryCount++;
+            }
+            if (!scanManager.isScannerOpen()) {
+                Log.e(TAG, "扫描头打开超时");
+                return false;
             }
             // 3. 设置默认灯光(照明+瞄准)
             setLightingMode(DEFAULT_LIGHT_MODE);
             // 4. 设置广播模式
             scanManager.setOPMode(ScanConstants.SCAN_OP_MODE_BROADCAST);
-            // 5. 注册广播接收器
-            registerScanReceivers();
+            // 5. 注册广播接收器(只在第一次打开时注册)
+            if (screenReceiver != null && scanReceiver != null) {
+                try {
+                    unregisterReceiver(screenReceiver);
+                    unregisterReceiver(scanReceiver);
+                } catch (Exception e) {
+                    // 忽略注销异常
+                }
+                registerScanReceivers();
+            }
             
             // 6. 启动扫描头闲置超时(核心调整:打开扫描头就启动)
             startIdleTimeout();
@@ -279,10 +284,7 @@ public class ScanService extends Service {
             }
         }
 
-        // 4. 注销广播接收器
-        unregisterScanReceivers();
-
-        // 5. 更新状态
+        // 4. 更新状态
         isScanning = false;
     }
 
@@ -299,6 +301,7 @@ public class ScanService extends Service {
 
         // 1. 若扫描头未打开,自动打开
         if (!isScanHeadOpened()) {
+            Log.d(TAG, "自动打开扫描头");
             boolean openSuccess = openScanHead();
             if (!openSuccess) {
                 return false;
@@ -444,6 +447,8 @@ public class ScanService extends Service {
                 Log.e(TAG, "暂停扫码失败", e);
             }
         }
+        // 确保在暂停后将扫描状态设置为false,以便在屏幕亮起后能重新开始扫描
+        isScanning = false;
     }
 
     /**
@@ -456,7 +461,12 @@ public class ScanService extends Service {
                 Log.d(TAG, "扫码已恢复(屏幕亮起)");
             } catch (Exception e) {
                 Log.e(TAG, "恢复扫码失败", e);
+                // 出错时重置扫描状态,以便下次可以重新开始扫描
+                isScanning = false;
             }
+        } else {
+            // 如果扫描头未打开,重置状态
+            isScanning = false;
         }
     }