优化GPS坐标解析逻辑,使用strtod实现无异常解析,并添加解析失败的日志记录

This commit is contained in:
2025-09-19 01:54:56 +08:00
parent e3fddbd365
commit 77fa630b9d

View File

@@ -18,7 +18,7 @@ index a95a4a8..10eae12 100644
static jclass class_gnssPowerStats; static jclass class_gnssPowerStats;
@@ -75,6 +78,75 @@ static jmethodID method_isInEmergencySession; @@ -75,6 +78,79 @@ static jmethodID method_isInEmergencySession;
static jmethodID method_gnssPowerStatsCtor; static jmethodID method_gnssPowerStatsCtor;
static jmethodID method_setSubHalPowerIndicationCapabilities; static jmethodID method_setSubHalPowerIndicationCapabilities;
@@ -65,10 +65,14 @@ index a95a4a8..10eae12 100644
+ iss >> latStr >> lonStr; + iss >> latStr >> lonStr;
+ } + }
+ +
+ try { + // Use strtod for exception-free parsing
+ double lat = std::stod(latStr); + char* latEnd;
+ double lon = std::stod(lonStr); + char* lonEnd;
+ double lat = strtod(latStr.c_str(), &latEnd);
+ double lon = strtod(lonStr.c_str(), &lonEnd);
+ +
+ // Check if parsing was successful (no leftover characters)
+ if (*latEnd == '\0' && *lonEnd == '\0') {
+ // Validate coordinates + // Validate coordinates
+ if (lat >= -90.0 && lat <= 90.0 && lon >= -180.0 && lon <= 180.0) { + if (lat >= -90.0 && lat <= 90.0 && lon >= -180.0 && lon <= 180.0) {
+ customLatitude = lat; + customLatitude = lat;
@@ -81,8 +85,8 @@ index a95a4a8..10eae12 100644
+ } else { + } else {
+ ALOGE("Invalid GPS coordinates: lat=%.6f, lon=%.6f", lat, lon); + ALOGE("Invalid GPS coordinates: lat=%.6f, lon=%.6f", lat, lon);
+ } + }
+ } catch (const std::exception& e) { + } else {
+ ALOGE("Failed to parse GPS coordinates: %s", e.what()); + ALOGE("Failed to parse GPS coordinates from file");
+ } + }
+ } + }
+ +
@@ -94,7 +98,7 @@ index a95a4a8..10eae12 100644
using android::OK; using android::OK;
using android::sp; using android::sp;
using android::status_t; using android::status_t;
@@ -377,6 +449,9 @@ static jboolean android_location_gnss_hal_GnssNative_set_position_mode( @@ -377,6 +453,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) {
@@ -104,7 +108,7 @@ index a95a4a8..10eae12 100644
return gnssHal->start(); return gnssHal->start();
} }
@@ -457,12 +532,24 @@ static void android_location_gnss_hal_GnssNative_inject_best_location( @@ -457,12 +536,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) {
@@ -135,7 +139,7 @@ index a95a4a8..10eae12 100644
} }
static void android_location_gnss_hal_GnssNative_inject_location( static void android_location_gnss_hal_GnssNative_inject_location(
@@ -472,11 +559,22 @@ static void android_location_gnss_hal_GnssNative_inject_location( @@ -472,11 +563,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) {