安卓中的GPS时间

14

我正在寻找一种在我的应用程序中显示GPS时间的方法。

最简单的方法是什么?

(由于GPS时间和内部系统时间之间存在轻微时间差,因此必须使用GPS时间)

谢谢

2个回答

32

获取GPS时间可能会令人困惑!为了扩展接受答案中的讨论,在onLocationChanged()回调中使用getTime()根据位置(不一定是GPS)信息的获取方式,将得到不同的答案(基于Nexus 5测试):

(a) 如果使用Google FusedLocationProviderApi(Google位置服务API),则getProvider()将返回“fused”,而getTime()将返回设备的时间(System.currentTimeMillis())

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

  • 要么是“network”,此时getTime()将返回设备的时间(System.currentTimeMillis())。
  • 或者是“gps”,此时getTime()将返回GPS(卫星)时间。

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

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

以下是一个使用Android LocationManager(Android位置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)
}

3
很遗憾,返回GPS违反了位置规范的要求,该规范规定gpsTime应“以自1970年1月1日以来的毫秒数返回此修复的UTC时间。”因为GPS时间并不是UTC时间(由于在GPS时间中缺少UTC时间中的闰秒)。 - Michael

11
每当您从GPS接收到修正时,会调用方法onLocationChanged。该方法的参数是Location类的实例。该参数的一个方法是getTime,它将为您提供您所寻找的内容。如果我理解正确您要查找的内容就在这里。了解更多点击这里

5
实际上,这并没有给你卫星的时间。这是设备定位时的系统时间。 - cbrulak
2
@cbrulak:你确定吗?文档中措辞非常模糊。例如,它说“getTime()对于仔细比较重新启动或跨设备的位置修复非常有用”。 - Timmmm
12
经过测试,我可以确认 getTime() 函数返回的时间是 GPS 推导出的 UTC 时间,而非设备时间。显然,这只适用于您使用 GPS 位置提供程序的情况 - 如果您使用 Wi-Fi,则可能是设备时间。请注意,真正的“GPS时间”比UTC提前16秒。getTime() 返回从GPS推导出的UTC时间,而不是GPS时间本身。 - Timmmm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接