实现从文件读取自定义GPS位置的功能,增强了GPS定位的灵活性

This commit is contained in:
2025-09-19 00:41:11 +08:00
parent 7fa744139d
commit 0c785fa9ce

View File

@@ -1,18 +1,16 @@
--- a/frameworks/base/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
+++ b/frameworks/base/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
@@ -66,6 +66,11 @@
@@ -66,6 +66,9 @@
#include "jni.h"
#include "utils/Log.h"
#include "utils/misc.h"
+#include <fstream>
+#include <sstream>
+#include <sys/stat.h>
+
+// Custom GPS location from file support
static jclass class_gnssPowerStats;
@@ -78,6 +83,15 @@
@@ -75,6 +78,75 @@ static jmethodID method_isInEmergencySession;
static jmethodID method_gnssPowerStatsCtor;
static jmethodID method_setSubHalPowerIndicationCapabilities;
@@ -23,16 +21,6 @@
+static time_t lastFileModTime = 0;
+static const char* GPS_LOCATION_FILE = "/data/vendor/gps/custom_location.txt";
+
+// Function to read GPS coordinates from file
+static bool readGpsLocationFromFile();
+
using android::OK;
using android::sp;
using android::status_t;
@@ -200,6 +214,64 @@
std::unique_ptr<android::gnss::MeasurementCorrectionsInterface> gnssMeasurementCorrectionsIface =
nullptr;
+// Function to read GPS coordinates from file
+static bool readGpsLocationFromFile() {
+ struct stat fileStat;
@@ -95,10 +83,10 @@
+ return false;
+}
+
namespace android {
namespace {
@@ -367,6 +439,9 @@
using android::OK;
using android::sp;
using android::status_t;
@@ -377,6 +449,9 @@ static jboolean android_location_gnss_hal_GnssNative_set_position_mode(
}
static jboolean android_location_gnss_hal_GnssNative_start(JNIEnv* /* env */, jclass) {
@@ -108,11 +96,16 @@
return gnssHal->start();
}
@@ -443,8 +518,17 @@
@@ -457,12 +532,24 @@ static void android_location_gnss_hal_GnssNative_inject_best_location(
jfloat speedAccuracyMetersPerSecond, jfloat bearingAccuracyDegrees, jlong timestamp,
jint elapsedRealtimeFlags, jlong elapsedRealtimeNanos,
jdouble elapsedRealtimeUncertaintyNanos) {
- gnssHal->injectBestLocation(gnssLocationFlags, latitudeDegrees, longitudeDegrees,
- altitudeMeters, speedMetersPerSec, bearingDegrees,
- horizontalAccuracyMeters, verticalAccuracyMeters,
- speedAccuracyMetersPerSecond, bearingAccuracyDegrees, timestamp,
- elapsedRealtimeFlags, elapsedRealtimeNanos,
- elapsedRealtimeUncertaintyNanos);
+
+ // Check for custom GPS location from file
+ if (readGpsLocationFromFile()) {
@@ -125,20 +118,24 @@
+ elapsedRealtimeUncertaintyNanos);
+ } else {
+ gnssHal->injectBestLocation(gnssLocationFlags, latitudeDegrees, longitudeDegrees,
altitudeMeters, speedMetersPerSec, bearingDegrees,
horizontalAccuracyMeters, verticalAccuracyMeters,
speedAccuracyMetersPerSecond, bearingAccuracyDegrees, timestamp,
elapsedRealtimeFlags, elapsedRealtimeNanos,
elapsedRealtimeUncertaintyNanos);
+ altitudeMeters, speedMetersPerSec, bearingDegrees,
+ horizontalAccuracyMeters, verticalAccuracyMeters,
+ speedAccuracyMetersPerSecond, bearingAccuracyDegrees, timestamp,
+ elapsedRealtimeFlags, elapsedRealtimeNanos,
+ elapsedRealtimeUncertaintyNanos);
+ }
}
static void android_location_gnss_hal_GnssNative_inject_location(
@@ -455,8 +539,17 @@
@@ -472,11 +559,22 @@ static void android_location_gnss_hal_GnssNative_inject_location(
jfloat speedAccuracyMetersPerSecond, jfloat bearingAccuracyDegrees, jlong timestamp,
jint elapsedRealtimeFlags, jlong elapsedRealtimeNanos,
jdouble elapsedRealtimeUncertaintyNanos) {
- gnssHal->injectLocation(gnssLocationFlags, latitudeDegrees, longitudeDegrees, altitudeMeters,
- speedMetersPerSec, bearingDegrees, horizontalAccuracyMeters,
- verticalAccuracyMeters, speedAccuracyMetersPerSecond,
- bearingAccuracyDegrees, timestamp, elapsedRealtimeFlags,
- elapsedRealtimeNanos, elapsedRealtimeUncertaintyNanos);
+
+ // Check for custom GPS location from file
+ if (readGpsLocationFromFile()) {
@@ -150,10 +147,10 @@
+ elapsedRealtimeNanos, elapsedRealtimeUncertaintyNanos);
+ } else {
+ gnssHal->injectLocation(gnssLocationFlags, latitudeDegrees, longitudeDegrees, altitudeMeters,
speedMetersPerSec, bearingDegrees, horizontalAccuracyMeters,
verticalAccuracyMeters, speedAccuracyMetersPerSecond,
bearingAccuracyDegrees, timestamp, elapsedRealtimeFlags,
elapsedRealtimeNanos, elapsedRealtimeUncertaintyNanos);
+ speedMetersPerSec, bearingDegrees, horizontalAccuracyMeters,
+ verticalAccuracyMeters, speedAccuracyMetersPerSecond,
+ bearingAccuracyDegrees, timestamp, elapsedRealtimeFlags,
+ elapsedRealtimeNanos, elapsedRealtimeUncertaintyNanos);
+ }
}