feat(IdleGpsService): 实现圆形轨迹GPS模拟并优化服务启动逻辑
- 重构IdleGpsService,将固定坐标模拟改为圆形轨迹动态生成 - 添加角动量(bearing)递增机制,实现坐标沿圆周持续运动 - 新增calculatePosition()方法,基于锚点坐标和半径计算轨迹位置 - 在MainActivity.onResume中根据空转状态自动启动GPS服务 - 更新build.properties版本号(buildCount 21->23)
This commit is contained in:
@@ -1,8 +1,8 @@
|
|||||||
#Created by .winboll/winboll_app_build.gradle
|
#Created by .winboll/winboll_app_build.gradle
|
||||||
#Sun May 03 18:27:26 CST 2026
|
#Mon May 04 03:36:37 CST 2026
|
||||||
stageCount=20
|
stageCount=20
|
||||||
libraryProject=
|
libraryProject=
|
||||||
baseVersion=15.12
|
baseVersion=15.12
|
||||||
publishVersion=15.12.19
|
publishVersion=15.12.19
|
||||||
buildCount=21
|
buildCount=23
|
||||||
baseBetaVersion=15.12.20
|
baseBetaVersion=15.12.20
|
||||||
|
|||||||
@@ -111,6 +111,9 @@ public class MainActivity extends WinBoLLActivity implements IWinBoLLActivity {
|
|||||||
protected void onResume() {
|
protected void onResume() {
|
||||||
super.onResume();
|
super.onResume();
|
||||||
LogUtils.d(TAG, "onResume -> 页面恢复可见");
|
LogUtils.d(TAG, "onResume -> 页面恢复可见");
|
||||||
|
if (App.isAppIdleRunning()) {
|
||||||
|
IdleGpsService.getInstance().start();
|
||||||
|
}
|
||||||
if (mADsBannerView != null) {
|
if (mADsBannerView != null) {
|
||||||
mADsBannerView.resumeADs(MainActivity.this);
|
mADsBannerView.resumeADs(MainActivity.this);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,32 +16,72 @@ import java.util.List;
|
|||||||
public class IdleGpsService {
|
public class IdleGpsService {
|
||||||
|
|
||||||
private static final long MOCK_INTERVAL_MS = 5000; // 模拟坐标更新间隔(5秒)
|
private static final long MOCK_INTERVAL_MS = 5000; // 模拟坐标更新间隔(5秒)
|
||||||
|
private static final long BEARING_INTERVAL_MS = 1000; // 角动量递增间隔(1秒)
|
||||||
|
private static final double EARTH_RADIUS_M = 6371000; // 地球平均半径(米)
|
||||||
|
private static final double ANCHOR_LAT = 39.9042; // 固定锚点纬度(北京)
|
||||||
|
private static final double ANCHOR_LON = 116.4074; // 固定锚点经度(北京)
|
||||||
|
private static final double CIRCLE_RADIUS_M = 50; // 移动轨迹半径(米)
|
||||||
|
|
||||||
private static IdleGpsService instance;
|
private static IdleGpsService instance;
|
||||||
private final List<MainService.GpsUpdateListener> listeners = new ArrayList<>();
|
private final List<MainService.GpsUpdateListener> listeners = new ArrayList<>();
|
||||||
private final Handler handler;
|
private final Handler handler;
|
||||||
private final Runnable updateRunnable;
|
private final Runnable updateRunnable;
|
||||||
|
private final Runnable bearingRunnable;
|
||||||
private final PositionModel mockPosition;
|
private final PositionModel mockPosition;
|
||||||
private boolean isRunning;
|
private boolean isRunning;
|
||||||
|
private int currentBearing = 1; // 当前角动量度数(1-360)
|
||||||
|
|
||||||
private IdleGpsService() {
|
private IdleGpsService() {
|
||||||
handler = new Handler(Looper.getMainLooper());
|
handler = new Handler(Looper.getMainLooper());
|
||||||
mockPosition = new PositionModel();
|
mockPosition = new PositionModel();
|
||||||
mockPosition.setPositionId("mock_idle_pos");
|
mockPosition.setPositionId("mock_idle_pos");
|
||||||
mockPosition.setMemo("空转模拟坐标");
|
mockPosition.setMemo("空转模拟坐标");
|
||||||
// 默认模拟坐标:北京
|
|
||||||
mockPosition.setLatitude(39.9042);
|
|
||||||
mockPosition.setLongitude(116.4074);
|
|
||||||
|
|
||||||
updateRunnable = new Runnable() {
|
updateRunnable = new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
if (isRunning) {
|
if (isRunning) {
|
||||||
|
calculatePosition();
|
||||||
notifyListeners(mockPosition);
|
notifyListeners(mockPosition);
|
||||||
AppIdleRunningModeHandler.sendIdleLog("模拟GPS数据更新 -> 纬度:" + mockPosition.getLatitude() + ", 经度:" + mockPosition.getLongitude());
|
AppIdleRunningModeHandler.sendIdleLog("模拟GPS数据更新 -> 纬度:" + mockPosition.getLatitude() + ", 经度:" + mockPosition.getLongitude() + ", 角度:" + currentBearing + "°");
|
||||||
handler.postDelayed(this, MOCK_INTERVAL_MS);
|
handler.postDelayed(this, MOCK_INTERVAL_MS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
bearingRunnable = new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
if (isRunning) {
|
||||||
|
currentBearing++;
|
||||||
|
if (currentBearing > 360) {
|
||||||
|
currentBearing = 1;
|
||||||
|
}
|
||||||
|
handler.postDelayed(this, BEARING_INTERVAL_MS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private void calculatePosition() {
|
||||||
|
double bearingRad = Math.toRadians(currentBearing);
|
||||||
|
double angularDistance = CIRCLE_RADIUS_M / EARTH_RADIUS_M;
|
||||||
|
|
||||||
|
double anchorLatRad = Math.toRadians(ANCHOR_LAT);
|
||||||
|
double anchorLonRad = Math.toRadians(ANCHOR_LON);
|
||||||
|
|
||||||
|
double newLatRad = Math.asin(
|
||||||
|
Math.sin(anchorLatRad) * Math.cos(angularDistance) +
|
||||||
|
Math.cos(anchorLatRad) * Math.sin(angularDistance) * Math.cos(bearingRad)
|
||||||
|
);
|
||||||
|
|
||||||
|
double newLonRad = anchorLonRad + Math.atan2(
|
||||||
|
Math.sin(bearingRad) * Math.sin(angularDistance) * Math.cos(anchorLatRad),
|
||||||
|
Math.cos(angularDistance) - Math.sin(anchorLatRad) * Math.sin(newLatRad)
|
||||||
|
);
|
||||||
|
|
||||||
|
mockPosition.setLatitude(Math.toDegrees(newLatRad));
|
||||||
|
mockPosition.setLongitude(Math.toDegrees(newLonRad));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IdleGpsService getInstance() {
|
public static IdleGpsService getInstance() {
|
||||||
@@ -57,10 +97,11 @@ public class IdleGpsService {
|
|||||||
public void start() {
|
public void start() {
|
||||||
if (isRunning) return;
|
if (isRunning) return;
|
||||||
isRunning = true;
|
isRunning = true;
|
||||||
|
currentBearing = 1;
|
||||||
AppIdleRunningModeHandler.sendIdleLog("空转GPS服务已启动");
|
AppIdleRunningModeHandler.sendIdleLog("空转GPS服务已启动");
|
||||||
// 通知监听器
|
|
||||||
notifyStatusChange("空转GPS服务已启动");
|
notifyStatusChange("空转GPS服务已启动");
|
||||||
handler.post(updateRunnable);
|
handler.post(updateRunnable);
|
||||||
|
handler.post(bearingRunnable);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -70,6 +111,7 @@ public class IdleGpsService {
|
|||||||
if (!isRunning) return;
|
if (!isRunning) return;
|
||||||
isRunning = false;
|
isRunning = false;
|
||||||
handler.removeCallbacks(updateRunnable);
|
handler.removeCallbacks(updateRunnable);
|
||||||
|
handler.removeCallbacks(bearingRunnable);
|
||||||
notifyStatusChange("空转GPS服务已停止");
|
notifyStatusChange("空转GPS服务已停止");
|
||||||
AppIdleRunningModeHandler.sendIdleLog("空转GPS服务已停止");
|
AppIdleRunningModeHandler.sendIdleLog("空转GPS服务已停止");
|
||||||
}
|
}
|
||||||
@@ -103,14 +145,16 @@ public class IdleGpsService {
|
|||||||
private void startMockUpdate() {
|
private void startMockUpdate() {
|
||||||
if (isRunning) return;
|
if (isRunning) return;
|
||||||
isRunning = true;
|
isRunning = true;
|
||||||
// 通知状态变更
|
currentBearing = 1;
|
||||||
notifyStatusChange("空转GPS服务已启动");
|
notifyStatusChange("空转GPS服务已启动");
|
||||||
handler.post(updateRunnable);
|
handler.post(updateRunnable);
|
||||||
|
handler.post(bearingRunnable);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void stopMockUpdate() {
|
private void stopMockUpdate() {
|
||||||
isRunning = false;
|
isRunning = false;
|
||||||
handler.removeCallbacks(updateRunnable);
|
handler.removeCallbacks(updateRunnable);
|
||||||
|
handler.removeCallbacks(bearingRunnable);
|
||||||
notifyStatusChange("空转GPS服务已停止");
|
notifyStatusChange("空转GPS服务已停止");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user