From 5fd8e30b972f097085a13bfe6d85fb77a4688195 Mon Sep 17 00:00:00 2001
From: cxf <2417125293@qq.com>
Date: Tue, 28 Apr 2026 11:39:16 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=91=E5=8F=B0=E5=81=8F?=
=?UTF-8?q?=E8=88=AA=E5=90=91=E4=B8=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/src/main/AndroidManifest.xml | 14 +++++
.../com/aros/apron/activity/MainActivity.kt | 13 +++--
.../com/aros/apron/callback/MqttCallBack.java | 15 +++++
.../com/aros/apron/constant/Constant.java | 11 ++--
.../com/aros/apron/manager/CameraManager.java | 6 ++
.../com/aros/apron/manager/FlightManager.java | 57 ++++++++++++-------
.../manager/FlightTaskProgressManager.java | 2 +-
.../com/aros/apron/manager/GimbalManager.java | 36 ++++++++++++
.../aros/apron/manager/MissionV3Manager.java | 25 ++++----
.../apron/manager/TakeOffToPointManager.java | 8 +++
10 files changed, 146 insertions(+), 41 deletions(-)
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f16bba90..20e2cefa 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -23,6 +23,9 @@
+
+
+
@@ -110,6 +113,17 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/aros/apron/activity/MainActivity.kt b/app/src/main/java/com/aros/apron/activity/MainActivity.kt
index b71585ba..d5eab416 100644
--- a/app/src/main/java/com/aros/apron/activity/MainActivity.kt
+++ b/app/src/main/java/com/aros/apron/activity/MainActivity.kt
@@ -733,6 +733,7 @@ open class MainActivity : BaseActivity() {
startVtxHeartbeat()
SpeakerManager.getInstance().initMegaphoneInfo()
+ GimbalManager.getInstance().setmode()
//GimbalManager.getInstance().gimsetmode()
@@ -799,7 +800,7 @@ open class MainActivity : BaseActivity() {
GeoidManager.getInstance().init(this);
-
+ GimbalManager.getInstance().setmode()
//GimbalManager.getInstance().gimsetmode()
//开启雷达监听器
//PerceptionManager.getInstance().isladraopeninti()
@@ -821,8 +822,6 @@ open class MainActivity : BaseActivity() {
LogUtil.log(TAG, "推流类型:" + PreferenceUtils.getInstance().customStreamType)
}
-
-
} else {
if ((isFlightControllerConnect == null || isFlightControllerConnect != true) && (isCameraConnect == null || isCameraConnect != true)) {
handler.postDelayed({
@@ -869,7 +868,7 @@ open class MainActivity : BaseActivity() {
//开启雷达监听器
//PerceptionManager.getInstance().isladraopeninti()
-
+ GimbalManager.getInstance().setmode()
LogUtil.log(TAG, "自定义推流方式:" + PreferenceUtils.getInstance().customStreamType)
@@ -1261,6 +1260,12 @@ open class MainActivity : BaseActivity() {
FLAG_STOP_ARUCO ->
startArucoType = 0
+ "REFRESH_VIDEO_SOURCE" -> {
+ // 起飞后刷新视频源,避免FPVWidget因相机状态变化卡死
+ swapVideoSource()
+ LogUtil.log(TAG,"刷新视频流")
+ }
+
MqttCallBack.FLAG_RESET_CLEAN_MODE ->
setViewVisibilityWithCleanMode()
}
diff --git a/app/src/main/java/com/aros/apron/callback/MqttCallBack.java b/app/src/main/java/com/aros/apron/callback/MqttCallBack.java
index 248ef6d6..68495102 100644
--- a/app/src/main/java/com/aros/apron/callback/MqttCallBack.java
+++ b/app/src/main/java/com/aros/apron/callback/MqttCallBack.java
@@ -30,6 +30,7 @@ import com.aros.apron.manager.StickManager;
import com.aros.apron.manager.StreamManager;
import com.aros.apron.manager.SystemManager;
import com.aros.apron.manager.TakeOffToPointManager;
+import com.aros.apron.manager.UpdateManager;
import com.aros.apron.mix.Aprondown;
import com.aros.apron.mix.Aprongim;
import com.aros.apron.tools.ApronArucoDetect;
@@ -600,6 +601,20 @@ public class MqttCallBack extends BaseManager implements MqttCallbackExtended {
}
break;
+ case Constant.APP_UPDATE:
+ LogUtil.log(TAG, "收到:远程更新 " + jsonString);
+ String apkUrl = message.getData() != null ? message.getData().getUrl() : null;
+ if (apkUrl != null && !apkUrl.isEmpty()) {
+ UpdateManager.getInstance().startUpdate(
+ ApronApp.Companion.getApplication(),
+ apkUrl,
+ () -> sendMsg2Server(message)
+ );
+ } else {
+ LogUtil.log(TAG, "更新APK链接为空");
+ sendFailMsg2Server(message, "更新APK链接为空");
+ }
+ break;
// //获取控制权
// case 60007:
diff --git a/app/src/main/java/com/aros/apron/constant/Constant.java b/app/src/main/java/com/aros/apron/constant/Constant.java
index a2b2033e..7482d847 100644
--- a/app/src/main/java/com/aros/apron/constant/Constant.java
+++ b/app/src/main/java/com/aros/apron/constant/Constant.java
@@ -342,9 +342,12 @@ public class Constant {
//A1云台校准
public static final String DRC_LIGHT_CALIBRATION="drc_light_calibration";
-
-
-
-
+ /**
+ * 远程更新APK
+ */
+ public static final String APP_UPDATE="app_update";
}
+
+
+
diff --git a/app/src/main/java/com/aros/apron/manager/CameraManager.java b/app/src/main/java/com/aros/apron/manager/CameraManager.java
index 4ffd222c..fade1a4d 100644
--- a/app/src/main/java/com/aros/apron/manager/CameraManager.java
+++ b/app/src/main/java/com/aros/apron/manager/CameraManager.java
@@ -173,6 +173,12 @@ public class CameraManager extends BaseManager {
Movement.getInstance().setPhoto_status("fail");
Movement.getInstance().setMode_code(3);
stopReport();
+ }else if(t1 == PanoramaExitStatus.ABORTED){
+ Movement.getInstance().setPhoto_current_step(3000);
+ Movement.getInstance().setPhoto_result(0);
+ Movement.getInstance().setPhoto_status("fail");
+ Movement.getInstance().setMode_code(3);
+ stopReport();
}
}
}
diff --git a/app/src/main/java/com/aros/apron/manager/FlightManager.java b/app/src/main/java/com/aros/apron/manager/FlightManager.java
index 6a0cb38a..db7c0c60 100644
--- a/app/src/main/java/com/aros/apron/manager/FlightManager.java
+++ b/app/src/main/java/com/aros/apron/manager/FlightManager.java
@@ -914,9 +914,11 @@ public class FlightManager extends BaseManager {
//降落时将云台朝下
private void gimbalDownwards() {
-
if (goHomeExecutionState == GoHomeState.LANDING.value()
&& Movement.getInstance().getElevation() > 11 && !isGimbalDownwards) {
+
+
+
MediaDataCenter.getInstance().getCameraStreamManager().setVisionAssistViewDirection(VisionAssistDirection.DOWN, new CommonCallbacks.CompletionCallback() {
@Override
public void onSuccess() {
@@ -951,12 +953,18 @@ public class FlightManager extends BaseManager {
DroneHelper.getInstance().setCameraFocusMode();
+
+
new android.os.Handler().postDelayed(() -> {
setkuaim();
}, 500);
new android.os.Handler().postDelayed(() -> {
setCameraExposureMode();
}, 500);
+
+ new android.os.Handler().postDelayed(() -> {
+ EventBus.getDefault().post("REFRESH_VIDEO_SOURCE");
+ }, 2000);
//将镜头设置为自动对焦
// new android.os.Handler().postDelayed(() -> {
// setCameraExposureCompensation();
@@ -1342,30 +1350,35 @@ public class FlightManager extends BaseManager {
if (!getGimbalAndCameraEnabled()) {
return;
}
+ GimbalManager.getInstance().gimbalReset();
+
+ new Handler().postDelayed(() -> {
+ if (Movement.getInstance().isPlaneWing() && Movement.getInstance().getHome_distance() < 20
+ && Movement.getInstance().getElevation() < 88
+ && Movement.getInstance().getBattery_a_capacity_percent() > 25
+ && ((flightMode != null && flightMode == FlightMode.WAYPOINT) ||
+ (flightMode != null && flightMode == FlightMode.AUTO_TAKE_OFF))) {
+ WayLineExecutingInterruptManager.getInstance().onExecutingInterruptToDo();
+ } else {
+ Boolean isConnect = KeyManager.getInstance().getValue(createKey(FlightControllerKey.KeyConnection));
+
+ KeyManager.getInstance().performAction(createKey(FlightControllerKey.KeyStartGoHome), new CommonCallbacks.CompletionCallbackWithParam() {
+ @Override
+ public void onSuccess(EmptyMsg emptyMsg) {
+ sendMsg2Server(message);
+ }
+
+ @Override
+ public void onFailure(@NonNull IDJIError error) {
+ sendFailMsg2Server(message, "返航执行失败:" + getIDJIErrorMsg(error));
+ }
+ });
+
+ }
- if (Movement.getInstance().isPlaneWing() && Movement.getInstance().getHome_distance() < 20
- && Movement.getInstance().getElevation() < 88
- && Movement.getInstance().getBattery_a_capacity_percent() > 25
- && ((flightMode != null && flightMode == FlightMode.WAYPOINT) ||
- (flightMode != null && flightMode == FlightMode.AUTO_TAKE_OFF))) {
- WayLineExecutingInterruptManager.getInstance().onExecutingInterruptToDo();
- } else {
- Boolean isConnect = KeyManager.getInstance().getValue(createKey(FlightControllerKey.KeyConnection));
- KeyManager.getInstance().performAction(createKey(FlightControllerKey.KeyStartGoHome), new CommonCallbacks.CompletionCallbackWithParam() {
- @Override
- public void onSuccess(EmptyMsg emptyMsg) {
- sendMsg2Server(message);
- }
-
- @Override
- public void onFailure(@NonNull IDJIError error) {
- sendFailMsg2Server(message, "返航执行失败:" + getIDJIErrorMsg(error));
- }
- });
-
- }
+ },1000);
}
diff --git a/app/src/main/java/com/aros/apron/manager/FlightTaskProgressManager.java b/app/src/main/java/com/aros/apron/manager/FlightTaskProgressManager.java
index c80f0e2b..5f9ccce7 100644
--- a/app/src/main/java/com/aros/apron/manager/FlightTaskProgressManager.java
+++ b/app/src/main/java/com/aros/apron/manager/FlightTaskProgressManager.java
@@ -32,7 +32,7 @@ public class FlightTaskProgressManager extends BaseManager {
//如果是一键起飞航线或之后的指点飞行,这个就不用发,除此之外航线以及指点飞行都要发
if (PreferenceUtils.getInstance().getMissionType()==0&& (Movement.getInstance().isPlaneWing()
- || Movement.getInstance().isMotorsOn()) && Movement.getInstance().isWaylineinterpter() ) {
+ || Movement.getInstance().isMotorsOn()) && Movement.getInstance().isWaylineinterpter()) {
sendFlightTaskProgress2Server();
}
diff --git a/app/src/main/java/com/aros/apron/manager/GimbalManager.java b/app/src/main/java/com/aros/apron/manager/GimbalManager.java
index 2d81356f..de754e70 100644
--- a/app/src/main/java/com/aros/apron/manager/GimbalManager.java
+++ b/app/src/main/java/com/aros/apron/manager/GimbalManager.java
@@ -169,6 +169,22 @@ public class GimbalManager extends BaseManager {
VirtualStickManager.getInstance().sendVirtualStickAdvancedParam(virtualStickFlightControlParam);
}
+ public void setmode() {
+
+ KeyManager.getInstance().setValue(KeyTools.createKey(GimbalKey.KeyGimbalMode, ComponentIndexType.PORT_1), GimbalMode.YAW_FOLLOW, new CommonCallbacks.CompletionCallback() {
+ @Override
+ public void onSuccess() {
+ LogUtil.log(TAG, "云台跟随");
+ }
+
+ @Override
+ public void onFailure(@NonNull IDJIError idjiError) {
+ LogUtil.log(TAG, "云台跟随失败");
+ }
+ });
+
+
+ }
//云台重置
public void gimbalReset() {
@@ -255,6 +271,10 @@ public class GimbalManager extends BaseManager {
case 3:
GimbalAngleRotation rotation1 = new GimbalAngleRotation();
rotation1.setMode(GimbalAngleRotationMode.ABSOLUTE_ANGLE);
+ if (!TextUtils.isEmpty(Movement.getInstance().getGimbal_yaw() + "")) {
+ rotation1.setYaw(Movement.getInstance().getGimbal_yaw());
+ LogUtil.log(TAG,"俯仰向下"+Movement.getInstance().getGimbal_yaw());
+ }
rotation1.setPitch(-90.0);
KeyManager.getInstance().performAction(KeyTools.createKey(GimbalKey.KeyRotateByAngle, ComponentIndexType.PORT_1), rotation1, new CommonCallbacks.CompletionCallbackWithParam() {
@Override
@@ -268,6 +288,22 @@ public class GimbalManager extends BaseManager {
}
}
);
+
+// GimbalAngleRotation rotation1 = new GimbalAngleRotation();
+// rotation1.setMode(GimbalAngleRotationMode.ABSOLUTE_ANGLE);
+// rotation1.setPitch(-90.0);
+// KeyManager.getInstance().performAction(KeyTools.createKey(GimbalKey.KeyRotateByAngle, ComponentIndexType.PORT_1), rotation1, new CommonCallbacks.CompletionCallbackWithParam() {
+// @Override
+// public void onSuccess(EmptyMsg emptyMsg) {
+// sendMsg2Server(message);
+// }
+//
+// @Override
+// public void onFailure(@NonNull IDJIError error) {
+// sendFailMsg2Server(message, "偏航向下失败:" + getIDJIErrorMsg(error));
+// }
+// }
+// );
break;
}
diff --git a/app/src/main/java/com/aros/apron/manager/MissionV3Manager.java b/app/src/main/java/com/aros/apron/manager/MissionV3Manager.java
index 6461159d..d6e55464 100644
--- a/app/src/main/java/com/aros/apron/manager/MissionV3Manager.java
+++ b/app/src/main/java/com/aros/apron/manager/MissionV3Manager.java
@@ -26,6 +26,8 @@ import com.dji.wpmzsdk.common.data.KMZInfo;
import com.dji.wpmzsdk.manager.WPMZManager;
import com.google.gson.Gson;
+import org.greenrobot.eventbus.EventBus;
+
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
@@ -270,8 +272,9 @@ public class MissionV3Manager extends BaseManager {
Movement.getInstance().setVirtualStickQuitMission(false);
sendEvent2Server("任务状态:航线任务执行中断", 1);
- Movement.getInstance().setTask_status("paused");
+
if(PreferenceUtils.getInstance().getMissionType()==0){
+ Movement.getInstance().setTask_status("paused");
sendFlightTaskProgress2Server();
}
@@ -805,14 +808,10 @@ public class MissionV3Manager extends BaseManager {
sendEvent2Server("任务开始执行", 1);
Movement.getInstance().setTask_current_step(23);
-// Movement.getInstance().setMode_code(5);
-
-// // 自动起飞
-// Movement.getInstance().setMode_code(4);
-//
-// new android.os.Handler(android.os.Looper.getMainLooper()).postDelayed(() -> {
-// Movement.getInstance().setMode_code(5);
-// }, 2000);
+ // 起飞后相机状态变化可能导致FPVWidget卡死,延迟刷新视频源
+ mainHandler.postDelayed(() -> {
+ EventBus.getDefault().post("REFRESH_VIDEO_SOURCE");
+ }, 2000);
}
@@ -878,7 +877,13 @@ public class MissionV3Manager extends BaseManager {
@Override
public void onSuccess() {
sendMsg2Server(message);
- Movement.getInstance().setTask_status("paused");
+
+ if( PreferenceUtils.getInstance().getMissionType()==0){
+ Movement.getInstance().setTask_status("paused");
+
+ sendFlightTaskProgress2Server();
+ }
+
//暂停成功就是手动飞行
diff --git a/app/src/main/java/com/aros/apron/manager/TakeOffToPointManager.java b/app/src/main/java/com/aros/apron/manager/TakeOffToPointManager.java
index 80d9f836..82c3d407 100644
--- a/app/src/main/java/com/aros/apron/manager/TakeOffToPointManager.java
+++ b/app/src/main/java/com/aros/apron/manager/TakeOffToPointManager.java
@@ -33,6 +33,8 @@ import com.dji.wpmzsdk.common.data.KMZInfo;
import com.dji.wpmzsdk.manager.WPMZManager;
import com.google.gson.Gson;
+import org.greenrobot.eventbus.EventBus;
+
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
@@ -392,6 +394,12 @@ public class TakeOffToPointManager extends BaseManager {
sendEvent2Server("任务开始执行", 1);
Movement.getInstance().setTask_current_step(23);
Movement.getInstance().setTakeoff_result(0);
+
+ // 起飞后相机状态变化可能导致FPVWidget卡死,延迟刷新视频源
+ mainHandler.postDelayed(() -> {
+ EventBus.getDefault().post("REFRESH_VIDEO_SOURCE");
+ }, 2000);
+
}
@Override