You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 07:55:30