Android中的GPS时间

And*_*eas 10 android gps-time

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

(由于gps时间和内部系统时间之间的微小时间差异,它必须是GPS时间)

谢谢

Ken*_*Ken 24

获得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(卫星)时间.

基本上:'融合'使用GPS和Wi-Fi /网络,'网络'使用Wi-Fi /网络,'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)
}
Run Code Online (Sandbox Code Playgroud)

  • 遗憾的是,返回GPS违反了位置规范,该规定指出gpsTime将"返回此修复的UTC时间,自1970年1月1日起以毫秒为单位."由于GPS时间不是UTC时间(由于UTC时间的闰秒,因此GPS时间丢失) (2认同)

Eli*_*ine 8

每当您从GPS收到修复程序时,onLocationChanged都会调用该方法.此方法的参数是.的实例Location.此参数的一种方法是为getTime您提供所需的信息.那就是如果我找对了你想要的东西.在这里阅读更多

  • 在测试之后,我可以确认你从`getTime()`*获得的时间是*GPS导出的UTC时间,*不是*设备时间.(显然这仅适用于您使用GPS位置提供商 - 对于wifi我想象它是设备时间.)请注意,真正的"GPS时间"是[在UTC之前16秒](http://leapsecond.com/java /gpsclock.htm).`getTime()`返回从GPS导出的UTC时间,而不是GPS时间本身. (8认同)
  • 这实际上并没有给你卫星的时间.这是设备修复的系统时间. (4认同)
  • @cbrulak:你确定吗?文档中的措辞非常含糊不清.例如,它说"getTime()对于...仔细比较重启或跨设备的位置修复是有用的." (2认同)