14

我正在寻找一种在我的应用程序中显示 GPS 时间的方法。最简单的方法是什么?

(由于 GPS 时间和内部系统时间之间存在微小的时间差异,因此必须是 GPS 时间)

谢谢

4

3 回答 3

29

获取 GPS 时间可能会相当混乱!为了在接受的答案中扩展讨论,onLocationChanged() 回调中的 getTime() 会根据位置(不一定是 GPS)信息的检索方式给出不同的答案,(基于 Nexus 5 测试):

(a)如果使用Google FusedLocationProviderApi (Google Location Services API),那么 getProvider() 将返回“fused”,而 getTime() 将返回设备时间 (System.currentTimeMillis())

(b)如果使用Android LocationManager (Android Location API),则根据手机的“位置”设置和 requestLocationUpdates 设置(LocationManager.NETWORK_PROVIDER 和/或 LocationManager.GPS_PROVIDER),getProvider() 将返回:

  • 要么是“网络”,在这种情况下 getTime() 将返回设备时间 (System.currentTimeMillis())。
  • 或者,'gps',在这种情况下 getTime 将返回 GPS(卫星)时间。

本质上:“fused”使用 GPS 和 Wi-Fi/Network,“network”使用 Wi-Fi/Network,“gps”使用 GPS。

因此,要获取 GPS 时间,请使用 Android LocationManager 并将 requestLocationUpdates 设置为 LocationManager.GPS_PROVIDER。(注意在这种情况下 getTime() 毫秒部分始终为 000)

这是一个使用 Android LocationManager (Android Location API) 的示例:

public void InitialiseLocationListener(android.content.Context context) {

    android.location.LocationManager locationManager = (android.location.LocationManager)
            context.getSystemService(android.content.Context.LOCATION_SERVICE);

    android.location.LocationListener locationListener = new android.location.LocationListener() {

        public void onLocationChanged(android.location.Location location) {

            String time = new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss.SSS").format(location.getTime());

            if( location.getProvider().equals(android.location.LocationManager.GPS_PROVIDER))
                android.util.Log.d("Location", "Time GPS: " + time); // This is what we want!
            else
                android.util.Log.d("Location", "Time Device (" + location.getProvider() + "): " + time);
        }

        public void onStatusChanged(String provider, int status, android.os.Bundle extras) {
        }
        public void onProviderEnabled(String provider) {
        }
        public void onProviderDisabled(String provider) {
        }
    };

    if (android.support.v4.content.ContextCompat.checkSelfPermission(context,
            android.Manifest.permission.ACCESS_FINE_LOCATION) != android.content.pm.PackageManager.PERMISSION_GRANTED) {
        android.util.Log.d("Location", "Incorrect 'uses-permission', requires 'ACCESS_FINE_LOCATION'");
        return;
    }

    locationManager.requestLocationUpdates(android.location.LocationManager.NETWORK_PROVIDER, 1000, 0, locationListener);
    locationManager.requestLocationUpdates(android.location.LocationManager.GPS_PROVIDER, 1000, 0, locationListener);
    // Note: To Stop listening use: locationManager.removeUpdates(locationListener)
}
于 2016-04-07T07:58:42.373 回答
11

每当您从 GPS 接收到修复时,onLocationChanged都会调用该方法。此方法的参数是 的实例Location。此参数的方法之一是getTime为您提供所需的内容。那就是如果我得到了你正在寻找的东西。在这里阅读更多

于 2011-08-10T20:13:15.967 回答
1

我遇到了对 getTime 函数的描述,它是这样说的:

public long getTime () 返回此修复的 UTC 时间,以 1970 年 1 月 1 日以来的毫秒数为单位。请注意,设备上的 UTC 时间不是单调的:它可以不可预测地向前或向后跳跃。

哎呀!真的吗?即使它确实返回了一个包含毫秒值的时间对象,如果它“可以不可预测地向前或向后跳跃”,该值也是完全无用的。

我正在从事的项目绝对需要一个“精确到毫秒”的时间值(即使它是“自 1970 年 1 月 1 日以来的毫秒数”)。没有那个准确度,我就完蛋了!

于 2021-01-12T18:23:21.220 回答