From 8b004066992c3ff21348a7bfa44042d44d0b7088 Mon Sep 17 00:00:00 2001
From: Dana <Dana_Lee1016@126.com>
Date: 星期三, 28 一月 2026 17:30:09 +0800
Subject: [PATCH] 1.p2摄像头 跨进程服务,未测试

---
 app/src/main/java/com/safeluck/floatwindow/manager/UsbCameraPushManager.java   |   13 +++
 app/src/main/java/com/safeluck/floatwindow/FloatingService.java                |  108 +++++++++++++++++++++++++++++++++++
 app/src/main/java/com/safeluck/floatwindow/MediaArgu.java                      |   23 ++++++-
 app/src/main/AndroidManifest.xml                                               |    6 ++
 app/src/main/java/com/safeluck/floatwindow/manager/UsbCameraRecordManager.java |   13 +++
 5 files changed, 155 insertions(+), 8 deletions(-)

diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index fbd24eb..8fc9fae 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -34,6 +34,12 @@
             android:name=".FloatingService"
             android:enabled="true"
             android:exported="false" />
+
+        <service
+            android:name=".P2UsbCameraVideoService"
+            android:enabled="true"
+            android:exported="false"
+            android:process=":p2" />
     </application>
 
 </manifest>
\ No newline at end of file
diff --git a/app/src/main/java/com/safeluck/floatwindow/FloatingService.java b/app/src/main/java/com/safeluck/floatwindow/FloatingService.java
index d634ab8..c714a00 100644
--- a/app/src/main/java/com/safeluck/floatwindow/FloatingService.java
+++ b/app/src/main/java/com/safeluck/floatwindow/FloatingService.java
@@ -1,7 +1,9 @@
 package com.safeluck.floatwindow;
 
 import android.app.Service;
+import android.content.ComponentName;
 import android.content.Context;
+import android.content.ServiceConnection;
 import android.content.Intent;
 import android.os.IBinder;
 import android.os.RemoteCallbackList;
@@ -32,6 +34,50 @@
     
     // 褰撳墠浣跨敤鐨勭鐞嗗櫒绫诲瀷
     private ManagerType currentManagerType = ManagerType.NONE;
+
+    // P2 璺ㄨ繘绋嬫湇鍔★紙鐢ㄤ簬 usbCameraId == 2锛�
+    private IMediaAidlInterface p2Service;
+    private boolean p2Bound = false;
+    private MediaArgu pendingP2StartMedia;
+
+    private final IMyCallback p2Callback = new IMyCallback.Stub() {
+        @Override
+        public void onResult(ResponseVO re) throws RemoteException {
+            // 灏� P2 杩涚▼鍥炶皟杞彂缁欏鎴风
+            notifyCallback(re);
+        }
+    };
+
+    private final ServiceConnection p2Connection = new ServiceConnection() {
+        @Override
+        public void onServiceConnected(ComponentName name, IBinder service) {
+            p2Service = IMediaAidlInterface.Stub.asInterface(service);
+            p2Bound = true;
+            Timber.d("P2UsbCameraVideoService connected");
+            try {
+                p2Service.registerCallback(p2Callback);
+            } catch (RemoteException e) {
+                Timber.e(e, "Failed to register p2Callback");
+            }
+
+            // 濡傛灉鏈� pending startMedia锛岃繛鎺ュ悗绔嬪埢鎵ц
+            if (pendingP2StartMedia != null) {
+                try {
+                    p2Service.startMedia(pendingP2StartMedia);
+                    pendingP2StartMedia = null;
+                } catch (RemoteException e) {
+                    Timber.e(e, "Failed to startMedia on P2 service");
+                }
+            }
+        }
+
+        @Override
+        public void onServiceDisconnected(ComponentName name) {
+            Timber.w("P2UsbCameraVideoService disconnected");
+            p2Bound = false;
+            p2Service = null;
+        }
+    };
     
     /**
      * 绠$悊鍣ㄧ被鍨嬫灇涓�
@@ -40,7 +86,9 @@
         NONE,
         USB_PUSH,
         USB_RECORD,
-        ANDROID_RECORD
+        ANDROID_RECORD,
+        P2_USB_PUSH,
+        P2_USB_RECORD
     }
     
     // AIDL Binder
@@ -116,6 +164,16 @@
         
         Timber.d("FloatingService onCreate");
     }
+
+    private void ensureP2Bound() {
+        if (p2Bound) return;
+        Intent intent = new Intent(this, P2UsbCameraVideoService.class);
+        try {
+            bindService(intent, p2Connection, Context.BIND_AUTO_CREATE);
+        } catch (Exception e) {
+            Timber.e(e, "bindService P2UsbCameraVideoService failed");
+        }
+    }
     
     @Override
     public int onStartCommand(Intent intent, int flags, int startId) {
@@ -129,6 +187,26 @@
         if (media == null) {
             Timber.w("startMedia: media is null");
             notifyCallback(1, -1, "MediaArgu is null");
+            return;
+        }
+
+        // usbCameraId == 2锛氳蛋 P2 璺ㄨ繘绋嬫湇鍔★紝鏀寔涓よ矾 USB 鍚屾椂宸ヤ綔
+        if (media.isUsedOutCamera() && media.getUsbCameraId() == 2) {
+            stopCurrentManager();
+            ensureP2Bound();
+            if (p2Service != null) {
+                try {
+                    p2Service.startMedia(media);
+                    currentManagerType = media.isPush() ? ManagerType.P2_USB_PUSH : ManagerType.P2_USB_RECORD;
+                } catch (RemoteException e) {
+                    Timber.e(e, "startMedia forward to P2 failed");
+                    notifyCallback(1, -3, "鍚姩P2鏈嶅姟澶辫触: " + e.getMessage());
+                }
+            } else {
+                // 绛夊緟杩炴帴瀹屾垚鍚庢墽琛�
+                pendingP2StartMedia = media;
+                currentManagerType = media.isPush() ? ManagerType.P2_USB_PUSH : ManagerType.P2_USB_RECORD;
+            }
             return;
         }
         
@@ -183,6 +261,18 @@
                     androidCameraRecordManager.stopRecord();
                 }
                 break;
+            case P2_USB_PUSH:
+            case P2_USB_RECORD:
+                if (p2Service != null) {
+                    try {
+                        p2Service.stopMedia();
+                    } catch (RemoteException e) {
+                        Timber.e(e, "stopMedia forward to P2 failed");
+                    }
+                } else {
+                    pendingP2StartMedia = null;
+                }
+                break;
             case NONE:
                 break;
         }
@@ -208,6 +298,22 @@
         super.onDestroy();
         stopMedia();
         mCallbacks.kill();
+        if (p2Bound) {
+            try {
+                if (p2Service != null) {
+                    p2Service.unregisterCallback(p2Callback);
+                }
+            } catch (RemoteException e) {
+                Timber.e(e, "Failed to unregister p2Callback");
+            }
+            try {
+                unbindService(p2Connection);
+            } catch (Exception e) {
+                Timber.w(e, "unbindService P2 failed");
+            }
+            p2Bound = false;
+            p2Service = null;
+        }
         Timber.d("FloatingService onDestroy");
     }
     
diff --git a/app/src/main/java/com/safeluck/floatwindow/MediaArgu.java b/app/src/main/java/com/safeluck/floatwindow/MediaArgu.java
index dff6790..359464b 100644
--- a/app/src/main/java/com/safeluck/floatwindow/MediaArgu.java
+++ b/app/src/main/java/com/safeluck/floatwindow/MediaArgu.java
@@ -14,8 +14,8 @@
 
     private boolean isPush;//鏄惁鎺ㄦ祦 true-鏄�
     private boolean usedOutCamera;//榛樿false 浣跨敤鍐呯疆鎽勫儚澶达紝 true浣跨敤澶栫疆鎽勫儚澶�
-
-
+    private int usbCameraId;//鏍囪鏄敤1- P1 usb鎽勫儚澶�  2-P2鎽勫儚澶�
+    private String jsonconfig ; //浠ュ悗鍙兘浼氱敤鍒帮紝鐩墠鐢ㄤ笉鍒�
     private int codeRate = 0;// 鐮佺巼
     private int frameRate = 0;// 甯х巼
     private ScreenSolution m_screen;
@@ -24,8 +24,23 @@
     private String pwd;//ftp涓婁紶瀵嗙爜
     private int recordTime;//鍒嗛挓
 
+    public int getUsbCameraId() {
+        return usbCameraId;
+    }
 
-private int tfCardFlag =0; //0-鍐呴儴flash 1- 澶栫疆tfcard
+    public String getJsonconfig() {
+        return jsonconfig;
+    }
+
+    public void setJsonconfig(String jsonconfig) {
+        this.jsonconfig = jsonconfig;
+    }
+
+    public void setUsbCameraId(int usbCameraId) {
+        this.usbCameraId = usbCameraId;
+    }
+
+    private int tfCardFlag =0; //0-鍐呴儴flash 1- 澶栫疆tfcard
 
     public int getTfCardFlag() {
         return tfCardFlag;
@@ -181,6 +196,7 @@
     public void writeToParcel(Parcel dest, int flags) {
         dest.writeByte(this.isPush ? (byte) 1 : (byte) 0);
         dest.writeByte(this.usedOutCamera ? (byte) 1 : (byte) 0);
+        dest.writeInt(this.usbCameraId);
         dest.writeInt(this.codeRate);
         dest.writeInt(this.frameRate);
 
@@ -198,6 +214,7 @@
     protected MediaArgu(Parcel in) {
         this.isPush = in.readByte() != 0;
         this.usedOutCamera = in.readByte() != 0;
+        this.usbCameraId = in.readInt();
         this.codeRate = in.readInt();
         this.frameRate = in.readInt();
         this.m_screen = in.readParcelable(ScreenSolution.class.getClassLoader());
diff --git a/app/src/main/java/com/safeluck/floatwindow/manager/UsbCameraPushManager.java b/app/src/main/java/com/safeluck/floatwindow/manager/UsbCameraPushManager.java
index fb85f0f..c362f04 100644
--- a/app/src/main/java/com/safeluck/floatwindow/manager/UsbCameraPushManager.java
+++ b/app/src/main/java/com/safeluck/floatwindow/manager/UsbCameraPushManager.java
@@ -586,8 +586,17 @@
             // 鎵撳紑鎽勫儚澶翠箣鍓嶅厛璋冪敤setenv
             usbCamera.setenv();
 
-            // 浣跨敤prepareCamera鏂规硶锛宑amera_id鑼冨洿[0,2]
-            int[] cameraIds = {0, 2};
+            // 浣跨敤 prepareCamera 鏂规硶锛涙牴鎹� MediaArgu.usbCameraId 閫夋嫨鍏蜂綋鎽勫儚澶�
+            // usbCameraId: 1 -> P1(0), 2 -> P2(2), 鍏朵粬 -> 璁╁簱鑷鍦� {0,2} 閲岄�夋嫨
+            int usbId = (mediaArgu != null) ? mediaArgu.getUsbCameraId() : 0;
+            int[] cameraIds;
+            if (usbId == 2) {
+                cameraIds = new int[]{2};
+            } else if (usbId == 1) {
+                cameraIds = new int[]{0};
+            } else {
+                cameraIds = new int[]{0, 2};
+            }
             String cameraName = null; // 涓嶆寚瀹氱壒瀹氬悕绉�
 
             // 濡傛灉杩斿洖闈�0锛屼唬琛ㄦ墦寮�澶辫触锛屽垯鍏坰topCamera鍐嶉噸璇曪紝鏈�澶�3娆�
diff --git a/app/src/main/java/com/safeluck/floatwindow/manager/UsbCameraRecordManager.java b/app/src/main/java/com/safeluck/floatwindow/manager/UsbCameraRecordManager.java
index 4102bf6..baabf8a 100644
--- a/app/src/main/java/com/safeluck/floatwindow/manager/UsbCameraRecordManager.java
+++ b/app/src/main/java/com/safeluck/floatwindow/manager/UsbCameraRecordManager.java
@@ -288,8 +288,17 @@
             // 鎵撳紑鎽勫儚澶翠箣鍓嶅厛璋冪敤setenv
             usbCamera.setenv();
 
-            // 浣跨敤prepareCamera鏂规硶锛宑amera_id鑼冨洿[0,9]
-            int[] cameraIds = {0, 2};
+            // 浣跨敤 prepareCamera 鏂规硶锛涙牴鎹� MediaArgu.usbCameraId 閫夋嫨鍏蜂綋鎽勫儚澶�
+            // usbCameraId: 1 -> P1(0), 2 -> P2(2), 鍏朵粬 -> 璁╁簱鑷鍦� {0,2} 閲岄�夋嫨
+            int usbId = (mediaArgu != null) ? mediaArgu.getUsbCameraId() : 0;
+            int[] cameraIds;
+            if (usbId == 2) {
+                cameraIds = new int[]{2};
+            } else if (usbId == 1) {
+                cameraIds = new int[]{0};
+            } else {
+                cameraIds = new int[]{0, 2};
+            }
             String cameraName = null; // 涓嶆寚瀹氱壒瀹氬悕绉�
 
             // 濡傛灉杩斿洖闈�0锛屼唬琛ㄦ墦寮�澶辫触锛屽垯鍏坰topCamera鍐嶉噸璇曪紝鏈�澶�3娆�

--
Gitblit v1.8.0