Android定位时间戳与当前时间对比出现负值问题求助
问题描述
我正在开发一款慢跑App,集成GPS来计算行进距离。为了减少抖动及其他误差(尤其是步行速度下),我设置了可配置过滤器,并尝试了多种优化方法。其中一个方案是在启动时丢弃“旧”定位结果,因此我实现了一个老化过滤器,通过对比location.time与当前时间来判断。但我发现出现了负的定位时长,这意味着定位时间戳显示为未来时间。
程序对比了Calendar.timeInMillis和Location.time,根据文档说明,二者均为UTC Unix纪元时间,且Location文档指出“所有通过LocationManager生成的定位信息都保证包含有效的纬度、经度和时间戳”。
完整演示代码
Activity代码(Kotlin)
package com.example.locationagedemo import android.Manifest import android.content.Context import android.content.pm.PackageManager import android.location.Location import android.location.LocationListener import android.location.LocationManager import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.os.Looper import android.util.Log import android.widget.TextView import android.widget.Toast import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat import java.util.Calendar class MainActivity : AppCompatActivity() { private lateinit var locationManager: LocationManager private lateinit var locationListener : LocationListener private lateinit var ageTextView: TextView override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) ageTextView = findViewById(R.id.ageTextView) locationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager nowListen() } fun nowListen() { if (ContextCompat.checkSelfPermission( this, Manifest.permission.ACCESS_FINE_LOCATION ) == PackageManager.PERMISSION_GRANTED ) { locationListener = object : LocationListener { override fun onLocationChanged(location: Location) { var locationAge = Calendar.getInstance().timeInMillis - location.time ageTextView.setText(String.format("Location Age %d ms", locationAge)) } @Deprecated("Deprecated in Java") override fun onStatusChanged(provider: String?, status: Int, extras: Bundle?) { } override fun onProviderEnabled(provider: String) {} override fun onProviderDisabled(provider: String) {} } locationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 2000L, 0.0F, locationListener, Looper.getMainLooper() ) } else ActivityCompat.requestPermissions( this, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), 1234 ) } override fun onRequestPermissionsResult( requestCode: Int, permissions: Array<String>, grantResults: IntArray ) { nowListen() super.onRequestPermissionsResult(requestCode, permissions, grantResults) } }
Layout布局代码(XML)
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:id="@+id/ageTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Location Age Here ms" android:textAppearance="@style/TextAppearance.AppCompat.Large" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
Manifest配置代码(XML)
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <application android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.LocationAgeDemo" tools:targetApi="31"> <activity android:name=".MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
内容的提问来源于stack exchange,提问作者GlintShadow
相关产品推荐
相关产品推荐

