实现从文件读取自定义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 --- a/frameworks/base/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
+++ b/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 "jni.h"
#include "utils/Log.h" #include "utils/Log.h"
#include "utils/misc.h" #include "utils/misc.h"
+#include <fstream> +#include <fstream>
+#include <sstream> +#include <sstream>
+#include <sys/stat.h> +#include <sys/stat.h>
+
+// Custom GPS location from file support
static jclass class_gnssPowerStats; static jclass class_gnssPowerStats;
@@ -78,6 +83,15 @@ @@ -75,6 +78,75 @@ static jmethodID method_isInEmergencySession;
static jmethodID method_gnssPowerStatsCtor; static jmethodID method_gnssPowerStatsCtor;
static jmethodID method_setSubHalPowerIndicationCapabilities; static jmethodID method_setSubHalPowerIndicationCapabilities;
@@ -23,16 +21,6 @@
+static time_t lastFileModTime = 0; +static time_t lastFileModTime = 0;
+static const char* GPS_LOCATION_FILE = "/data/vendor/gps/custom_location.txt"; +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 +// Function to read GPS coordinates from file
+static bool readGpsLocationFromFile() { +static bool readGpsLocationFromFile() {
+ struct stat fileStat; + struct stat fileStat;
@@ -95,10 +83,10 @@
+ return false; + return false;
+} +}
+ +
namespace android { using android::OK;
using android::sp;
namespace { using android::status_t;
@@ -367,6 +439,9 @@ @@ -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) { static jboolean android_location_gnss_hal_GnssNative_start(JNIEnv* /* env */, jclass) {
@@ -108,11 +96,16 @@
return gnssHal->start(); 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, jfloat speedAccuracyMetersPerSecond, jfloat bearingAccuracyDegrees, jlong timestamp,
jint elapsedRealtimeFlags, jlong elapsedRealtimeNanos, jint elapsedRealtimeFlags, jlong elapsedRealtimeNanos,
jdouble elapsedRealtimeUncertaintyNanos) { jdouble elapsedRealtimeUncertaintyNanos) {
- gnssHal->injectBestLocation(gnssLocationFlags, latitudeDegrees, longitudeDegrees, - gnssHal->injectBestLocation(gnssLocationFlags, latitudeDegrees, longitudeDegrees,
- altitudeMeters, speedMetersPerSec, bearingDegrees,
- horizontalAccuracyMeters, verticalAccuracyMeters,
- speedAccuracyMetersPerSecond, bearingAccuracyDegrees, timestamp,
- elapsedRealtimeFlags, elapsedRealtimeNanos,
- elapsedRealtimeUncertaintyNanos);
+ +
+ // Check for custom GPS location from file + // Check for custom GPS location from file
+ if (readGpsLocationFromFile()) { + if (readGpsLocationFromFile()) {
@@ -125,20 +118,24 @@
+ elapsedRealtimeUncertaintyNanos); + elapsedRealtimeUncertaintyNanos);
+ } else { + } else {
+ gnssHal->injectBestLocation(gnssLocationFlags, latitudeDegrees, longitudeDegrees, + gnssHal->injectBestLocation(gnssLocationFlags, latitudeDegrees, longitudeDegrees,
altitudeMeters, speedMetersPerSec, bearingDegrees, + altitudeMeters, speedMetersPerSec, bearingDegrees,
horizontalAccuracyMeters, verticalAccuracyMeters, + horizontalAccuracyMeters, verticalAccuracyMeters,
speedAccuracyMetersPerSecond, bearingAccuracyDegrees, timestamp, + speedAccuracyMetersPerSecond, bearingAccuracyDegrees, timestamp,
elapsedRealtimeFlags, elapsedRealtimeNanos, + elapsedRealtimeFlags, elapsedRealtimeNanos,
elapsedRealtimeUncertaintyNanos); + elapsedRealtimeUncertaintyNanos);
+ } + }
} }
static void android_location_gnss_hal_GnssNative_inject_location( 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, jfloat speedAccuracyMetersPerSecond, jfloat bearingAccuracyDegrees, jlong timestamp,
jint elapsedRealtimeFlags, jlong elapsedRealtimeNanos, jint elapsedRealtimeFlags, jlong elapsedRealtimeNanos,
jdouble elapsedRealtimeUncertaintyNanos) { jdouble elapsedRealtimeUncertaintyNanos) {
- gnssHal->injectLocation(gnssLocationFlags, latitudeDegrees, longitudeDegrees, altitudeMeters, - gnssHal->injectLocation(gnssLocationFlags, latitudeDegrees, longitudeDegrees, altitudeMeters,
- speedMetersPerSec, bearingDegrees, horizontalAccuracyMeters,
- verticalAccuracyMeters, speedAccuracyMetersPerSecond,
- bearingAccuracyDegrees, timestamp, elapsedRealtimeFlags,
- elapsedRealtimeNanos, elapsedRealtimeUncertaintyNanos);
+ +
+ // Check for custom GPS location from file + // Check for custom GPS location from file
+ if (readGpsLocationFromFile()) { + if (readGpsLocationFromFile()) {
@@ -150,10 +147,10 @@
+ elapsedRealtimeNanos, elapsedRealtimeUncertaintyNanos); + elapsedRealtimeNanos, elapsedRealtimeUncertaintyNanos);
+ } else { + } else {
+ gnssHal->injectLocation(gnssLocationFlags, latitudeDegrees, longitudeDegrees, altitudeMeters, + gnssHal->injectLocation(gnssLocationFlags, latitudeDegrees, longitudeDegrees, altitudeMeters,
speedMetersPerSec, bearingDegrees, horizontalAccuracyMeters, + speedMetersPerSec, bearingDegrees, horizontalAccuracyMeters,
verticalAccuracyMeters, speedAccuracyMetersPerSecond, + verticalAccuracyMeters, speedAccuracyMetersPerSecond,
bearingAccuracyDegrees, timestamp, elapsedRealtimeFlags, + bearingAccuracyDegrees, timestamp, elapsedRealtimeFlags,
elapsedRealtimeNanos, elapsedRealtimeUncertaintyNanos); + elapsedRealtimeNanos, elapsedRealtimeUncertaintyNanos);
+ } + }
} }