Android位置提供了未来的时间戳,还是我很蠢?自己尝试一下吧

问题描述 投票:0回答:1

我正在编写一个慢跑应用程序,并整合了 GPS 的行驶距离。它运作得很好。我添加了各种可配置的过滤器,并且正在尝试最小化抖动和其他错误的方法,尤其是在步行速度下。我读到的一个建议是在启动时放弃“旧”修复,因此我根据返回的 location.time 与现在的比较,实现了年龄过滤器。我的问题是我看到负年龄,这意味着位置时间戳是未来的!!!

我发现了时光机器吗?

这是我可以编写的最短的完整演示程序,用于演示我的时间机器。

活动

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)
    }
}

布局

<?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>

清单

    <?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>

该程序比较 Calendar.timeInMillis 和 Location.time,两者在文档中定义为 Unix 纪元时间 UTC,并且位置文档进一步指出“通过 LocationManager 生成的所有位置都保证具有有效的纬度、经度、时间戳”

所以对于你们所有人Android GPS 专家我们在那里:- 任何一个 a) 我发现了一台时光机器 b)我真的很愚蠢,错过了一些明显的东西(不是第一次哈哈哈!) c) 有一个我看不到的错误 d) 还有别的吗?

是哪一个???

对于其他人,请在您的真实手机上运行此程序,并告诉我手机型号以及您的年龄。也许这只是我的两辆摩托?

android time geolocation gps
1个回答
0
投票

好吧,我猜我很蠢。

位置中提供的时间戳必须来自 GPS 星座,我将其与手机中的时钟进行比较,手机中的时钟必须通过移动服务提供商从计时器服务器设置,并且由于设置过程中的各种延迟,相对于 GPS 导出的时间,运行速度必须始终有点慢。

© www.soinside.com 2019 - 2024. All rights reserved.