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