Android - 在服务线程上获取 GPS 坐标
Posted
技术标签:
【中文标题】Android - 在服务线程上获取 GPS 坐标【英文标题】:Android - getting GPS coordinates on service thread 【发布时间】:2014-04-30 16:57:33 【问题描述】:我一直在开发一个跟踪用户 GPS 坐标并间歇性地向我的服务器发送更新的应用程序。这是在服务内的线程中完成的。大多数情况下,第一次读数是准确的,但在移动 GPS 时不会更新。我认为这是因为 LocationManager 需要一些时间来预热。设备上的位置设置也会影响结果(仅限设备,高精度),有时会导致返回 0.0。是否有一个简单的解决方案可以在确定值之前留出足够的时间?
服务线程:
new Thread()
public void run()
// prepare looper
Looper.prepare();
// send text messages
String numbersList = helper.getNumbers();
if (numbersList != "")
String numbersArray[] = numbersList.split(", ");
for (int i = 0; i < numbersArray.length; i++)
sendSMS(numbersArray[i], incident_id);
// run until told otherwise
while (active == true)
// check if GPS enabled
if (gps.canGetLocation())
latitude = gps.getLatitude();
longitude = gps.getLongitude();
accuracy = gps.getAccuracy();
else
// can't get location
// GPS or Network is not enabled
// Ask user to enable GPS/network in settings
gps.showSettingsAlert();
GPS 追踪器类:
public Location getLocation()
try
locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE);
// getting GPS status
isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
// getting network status
isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if (!isGPSEnabled && !isNetworkEnabled)
// no network provider is enabled
else
this.canGetLocation = true;
// if GPS Enabled get lat/long using GPS Services
if (isGPSEnabled)
if (location == null)
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
Log.d("GPS Enabled", "GPS Enabled");
if (locationManager != null)
location = locationManager
.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (location != null)
latitude = location.getLatitude();
longitude = location.getLongitude();
else if(isNetworkEnabled)
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
Log.d("Network", "Network");
if (locationManager != null)
location = locationManager
.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
if (location != null)
latitude = location.getLatitude();
longitude = location.getLongitude();
catch (Exception e)
e.printStackTrace();
return location;
【问题讨论】:
【参考方案1】:您的第一个位置始终是最后一个已知位置(locationManager.getLastKnownLocation(...))
。此位置可能相对较旧,例如 GPS 在关闭之前或您进入建筑物之前的最后一次修复。它相对于您当前位置的准确性或多或少是随机的(除非您没有移动或使用同一扇门离开建筑物)。
如果 GPS 关闭或卫星有一段时间不可见(例如在建筑物内),硬件将需要一些时间来修复当前位置。这是您看到的延迟。之后,您的位置监听器(上面未显示)将从 GPS 获取更新。
【讨论】:
以上是关于Android - 在服务线程上获取 GPS 坐标的主要内容,如果未能解决你的问题,请参考以下文章