我只有一台设备(HTC HD Deside)用于测试我的应用程序以及何时想要获取GPS数据
locationManager.requestLocationUpdate(criteria,0,0,this); //critera = "gps"
我的GPS图标出现在通知栏中,但它“闪烁”,好像这意味着我的设备正在寻找并获取GPS数据。 因此,我的应用程序在成功从GPS获取数据(~1mn到3mn!)之前需要花费太多“思考”时间(在图标停止闪烁之前)
所以,我不得不创建一个像这样的while指令:
do{
lastLocation = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
}while(System.currentTimeMillis() - lastLocation.getTime() > 5000);
谢谢,我肯定会找到最近的位置,但是我失去了太多时间。
有什么问题?是硬件吗? 我能找到更好的解决方法吗? 我可以“快速”获取GPS数据吗? :/(1~5秒)
答案 0 :(得分:2)
我认为您应该在开发位置感知应用之前阅读此http://developer.android.com/guide/topics/location/strategies.html指南。
GPS传感器需要1到3分钟才能修复,你无法快速修复(1-5秒)。
您应该使用上次已知的位置值并开始请求位置修复。如果有,则相应地刷新内容。
答案 1 :(得分:0)
当您进入建筑物或覆盖区域时,GPS传感器可能需要更长时间。有时如果你在建筑物内并且没有可用的GPS信号,它总是闪烁并且耗尽电池。尝试利用其他一些提供商。
答案 2 :(得分:0)
您是否已连接到数据网络?
我不知道HTC,但通常在数据连接可用时,设备会使用称为辅助GPS的东西。不是扫描地平线上的所有可见卫星,而是从服务器下载卫星星历,获得修复所需的时间是10-20秒。
您也可能在室内或低信号区域或天线不好。
使用市场上的GPS测试应用程序检查天线是否有问题(通过比较两个设备)。
答案 3 :(得分:0)
GPS提供商有时会消耗电池能量,并且还需要检索GPS信号,预热硬件然后获取位置,如果是第一次使用它,则可能需要一些时间。
我建议您使用新的LocationRequest,如果需要,它将在GPS或网络之间进行选择以获取位置。
在onCreate中解决我设置了我的locationRequest
private fun setupLocationRequest(){
locationCallback = LocationCallback()
locationRequest = LocationRequest.create()
locationRequest.interval = 10000
locationRequest.fastestInterval = 2000
locationRequest.priority = LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY
fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
}
如您在这里看到的PRIORITY_BALANCED_POWER_ACCURACY
将为我提供最大的经度和纬度距离,并且不仅会使用GPS,还会在需要时使用NETWORK。
然后,我首先请求lastKnowLocation
,如果未检索到此位置,则可以请求位置更新
fusedLocationClient.lastLocation.addOnSuccessListener { lastLocation ->
if(lastLocation != null){
calculateDistanceAndNavigate(lat,lng,lastLocation.latitude,lastLocation.longitude,radio)
}else{
startLocationUpdates()
locationCallback = object : LocationCallback() {
override fun onLocationResult(locationResult: LocationResult?) {
locationResult ?: return
for (location in locationResult.locations) {
calculateDistanceAndNavigate(lat,lng,location.latitude,location.longitude,radio)
}
}
}
}
}
private fun startLocationUpdates() {
fusedLocationClient.requestLocationUpdates(
locationRequest,
locationCallback,
Looper.getMainLooper()
)
}
对我来说,这是获取位置的最有效方法,首先我不只使用GPS,而是节省电池,如果需要的话还使用NETWORK或WIFI,然后如果保存了则请求lastKnownLocation(也许由另一个应用程序提供) ,例如:google maps),然后如果失败,我就开始请求位置更新(可能需要一点时间)