我正在寻找一种在我的应用程序中显示 GPS 时间的方法。最简单的方法是什么?
(由于 GPS 时间和内部系统时间之间存在微小的时间差异,因此必须是 GPS 时间)
谢谢
获取 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() 将返回:
本质上:“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)
}
每当您从 GPS 接收到修复时,onLocationChanged
都会调用该方法。此方法的参数是 的实例Location
。此参数的方法之一是getTime
为您提供所需的内容。那就是如果我得到了你正在寻找的东西。在这里阅读更多
我遇到了对 getTime 函数的描述,它是这样说的:
public long getTime () 返回此修复的 UTC 时间,以 1970 年 1 月 1 日以来的毫秒数为单位。请注意,设备上的 UTC 时间不是单调的:它可以不可预测地向前或向后跳跃。
哎呀!真的吗?即使它确实返回了一个包含毫秒值的时间对象,如果它“可以不可预测地向前或向后跳跃”,该值也是完全无用的。
我正在从事的项目绝对需要一个“精确到毫秒”的时间值(即使它是“自 1970 年 1 月 1 日以来的毫秒数”)。没有那个准确度,我就完蛋了!