从可用的最佳提供商获取Android位置

13

我有这段代码来获取最佳可用的提供者

lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

locationListener = new MyLocationListener();
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
String provider = lm.getBestProvider(criteria, true);
Location mostRecentLocation = lm.getLastKnownLocation(provider);
if(mostRecentLocation != null) {
    latid=mostRecentLocation.getLatitude();
    longid=mostRecentLocation.getLongitude();
}
lm.requestLocationUpdates(provider, 1, 0, locationListener);

然后是监听器

private class MyLocationListener implements LocationListener {

@Override
public void onLocationChanged(Location loc) {
  if (loc != null) {
    latid = loc.getLatitude();
    longid = loc.getLongitude();
    // if(loc.hasAccuracy()==true){
    accuracyd = loc.getAccuracy();
    String providershown = loc.getProvider();    
    accuracy.setText("Location Acquired. Accuracy:"
      + Double.toString(accuracyd) + "m\nProvider: "+providershown);
    accuracy.setBackgroundColor(Color.GREEN);
    // }
    userinfo=usernamevalue+"&"+Double.toString(latid)+"&"+Double.toString(longid);
    submituserlocation(userinfo);
   }
}

我测试了一个设备(htc magic),发现当GPS被禁用时,它立即从网络上锁定位置。当我启用GPS时,它不会从网络接收数据,只要等待GPS锁定。
我想像谷歌地图一样锁定位置,即在获得良好的GPS信号之前使用网络来确定我的位置。
我认为最好的标准就是这样做,但他们挑选一个提供商。
我的代码有问题还是我需要使用线程和超时等方法来实现它?


spagi你的代码帮了我大忙——在Android开发网站上没有解释如何获得最佳提供商。一些设备可能有GPS,一些可能有GSM,一些可能有WiFi。 - Hein du Plessis
这是一篇非常有趣的谷歌文章:http://developer.android.com/training/basics/location/currentlocation.html - shkschneider
2个回答

14

也许你可以尝试同时监听网络提供商和 GPS 提供商一段时间,然后检查两者的结果。如果没有 GPS 结果,则使用网络结果。这就是我的做法。


我创建了两个位置监听器,一个用于 GPS,另一个用于网络,并使用 requestLocationUpdates 初始化它们。然后我可以通过一个 onLocationChanged 监听它们吗? - spagi
是的,你应该同时听取两者。在任何提供程序更新之前,甚至可以使用lastKnownLocation。 - Fedor
1
你可以在 MyLocationListener 中添加一个 Location 变量,并在 onLocationChanged() 中设置其值。在主活动中,创建两个 MylocationListener 实例,一个用于 GPS,另一个用于网络提供者。监听一定数量的时间(可以通过创建计时器线程来实现),时间到后停止监听并首先检查 gpslistener 中的位置变量是否有任何内容,否则检查网络监听器。 - capecrawler
如果您不关心位置提供程序(例如GPS或网络)来自哪个,您可以同时使用相同的LocationListener。您可以使用以下方式订阅它们:manager.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,myLocationListener)用于GPS或manager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,0,0,myLocationListener)用于网络位置。您可以更改零以调整性能(第一个零是更新之间的最小时间,第二个是在接收更新之前移动的最小米数)。 - AgentKnopf

3
也许你可以使用 LocationManagergetBestProvider(Criteria criteria, boolean enabledOnly) 方法,其中的 criteria 参考这个帖子。 详见官方文档。 希望能有所帮助。

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