添加运动状态检测,运动实时监听GPS位置,静止时每一分钟监听一次GPS位置。

This commit is contained in:
ZhanGSKen
2025-10-28 19:59:33 +08:00
parent 6376ff4ccf
commit 2be6d5e122
4 changed files with 389 additions and 300 deletions

View File

@@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle #Created by .winboll/winboll_app_build.gradle
#Tue Oct 28 14:17:09 HKT 2025 #Tue Oct 28 12:00:20 GMT 2025
stageCount=17 stageCount=17
libraryProject= libraryProject=
baseVersion=15.0 baseVersion=15.0
publishVersion=15.0.16 publishVersion=15.0.16
buildCount=0 buildCount=8
baseBetaVersion=15.0.17 baseBetaVersion=15.0.17

View File

@@ -3,6 +3,9 @@
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
package="cc.winboll.studio.positions"> package="cc.winboll.studio.positions">
<!-- 1. 声明GPS权限 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 前台服务权限(可选,提升后台定位稳定性,避免服务被回收) --> <!-- 前台服务权限(可选,提升后台定位稳定性,避免服务被回收) -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
@@ -61,6 +64,17 @@
<service android:name=".services.AssistantService"/> <service android:name=".services.AssistantService"/>
<service android:name=".services.DistanceRefreshService"/> <service android:name=".services.DistanceRefreshService"/>
<!-- 2. 注册运动状态Receiver -->
<receiver
android:name="cc.winboll.studio.positions.receivers.MotionStatusReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="cc.winboll.studio.positions.ACTION_MOTION_STATUS" />
</intent-filter>
</receiver>
</application> </application>
</manifest> </manifest>

View File

@@ -0,0 +1,124 @@
package cc.winboll.studio.positions.receivers;
/**
* @Author ZhanGSKen&豆包大模型<zhangsken@qq.com>
* @Date 2025/10/28 19:07
* @Describe MotionStatusReceiver
*/
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.text.TextUtils;
import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.positions.services.MainService;
import cc.winboll.studio.positions.utils.ServiceUtil;
/**
* 运动状态监听Receiver
* 功能接收运动状态广播控制GPS权限申请与GPS监听开关
*/
public class MotionStatusReceiver extends BroadcastReceiver {
public static final String TAG = "MotionStatusReceiver";
// 运动状态广播Action需与运动状态发送方保持一致如传感器服务
public static final String ACTION_MOTION_STATUS = "cc.winboll.studio.positions.ACTION_MOTION_STATUS";
// 运动状态Extra键0=静止/低运动1=行走/高运动
public static final String EXTRA_MOTION_STATUS = "EXTRA_MOTION_STATUS";
// 静止时GPS定时获取间隔单位分钟可配置
public static final long GPS_STATIC_INTERVAL = 1;
@Override
public void onReceive(Context context, Intent intent) {
if (context == null || intent == null || !TextUtils.equals(intent.getAction(), ACTION_MOTION_STATUS)) {
LogUtils.w(TAG, "无效广播Action不匹配或上下文为空");
return;
}
// 1. 获取运动状态0=静止/低运动1=行走/高运动)
int motionStatus = intent.getIntExtra(EXTRA_MOTION_STATUS, 0);
LogUtils.d(TAG, "接收运动状态:" + (motionStatus == 1 ? "行走中" : "静止/低运动"));
// 2. 绑定并获取MainService实例确保服务已启动
MainService mainService = getMainService(context);
if (mainService == null) {
LogUtils.e(TAG, "MainService未启动无法控制GPS状态");
return;
}
// 3. 根据运动状态处理GPS逻辑
if (motionStatus == 1) {
// 3.1 行走中申请GPS权限若未授予+ 开启持续GPS监听
handleWalkingStatus(mainService, context);
} else {
// 3.2 静止/低运动关闭持续GPS监听 + 启动定时GPS获取
handleStaticStatus(mainService);
}
}
/**
* 处理行走状态申请GPS权限+开启持续GPS监听
*/
private void handleWalkingStatus(MainService mainService, Context context) {
// 检查GPS权限Android 6.0+动态权限)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&
context.checkSelfPermission(android.Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
// 发送权限申请广播由Activity接收并发起申请Receiver无法直接申请权限
Intent permissionIntent = new Intent("cc.winboll.studio.positions.ACTION_REQUEST_GPS_PERMISSION");
permissionIntent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
context.sendBroadcast(permissionIntent);
LogUtils.d(TAG, "行走中GPS权限未授予已发送权限申请广播");
return;
}
// 权限已授予开启持续GPS监听调用MainService原有方法
if (!mainService.isGpsListening()) { // 需在MainService中新增isGpsListening()方法
mainService.startGpsLocation();
LogUtils.d(TAG, "行走中已开启持续GPS监听");
}
// 停止静止时的GPS定时任务避免重复获取
mainService.stopGpsStaticTimer();
}
/**
* 处理静止状态关闭持续GPS监听+启动定时GPS获取
*/
private void handleStaticStatus(MainService mainService) {
// 关闭持续GPS监听避免耗电
if (mainService.isGpsListening()) {
mainService.stopGpsLocation();
LogUtils.d(TAG, "静止中已关闭持续GPS监听");
}
// 启动定时GPS获取获取一次后关闭间隔GPS_STATIC_INTERVAL分钟
mainService.startGpsStaticTimer(GPS_STATIC_INTERVAL);
}
/**
* 获取MainService实例通过绑定服务或单例确保线程安全
*/
private MainService getMainService(Context context) {
// 方式1若MainService单例有效直接获取推荐
MainService singleton = MainService.getInstance(context);
if (singleton != null && singleton.isServiceRunning()) {
return singleton;
}
// 方式2若单例无效尝试绑定服务备用需处理绑定回调
if (!ServiceUtil.isServiceAlive(context, MainService.class.getName())) {
// 启动服务(若未运行)
context.startService(new Intent(context, MainService.class));
// 等待服务启动短延时实际项目建议用ServiceConnection异步绑定
try {
Thread.sleep(500);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
return MainService.getInstance(context);
}
}