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

Posted

技术标签:

【中文标题】android从可用的最佳提供商处获取位置【英文标题】:android get location from best provider available 【发布时间】:2011-02-24 13:12:14 【问题描述】:

我有这个代码来获得最好的供应商

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。 这是一篇非常有趣的谷歌文章:developer.android.com/training/basics/location/… 【参考方案1】:

也许您可以尝试同时听网络提供商和 gps 提供商一段时间,然后检查两者的结果。如果您没有来自 GPS 的结果,请改用网络结果。我就是这样做的。

【讨论】:

所以我制作了 2 个位置监听器,一个用于 Gps,一个用于网络,并使用 requestLocationUpdates 初始化它们。我可以用一个 onLocationChanged 来听他们两个吗? 是的,你应该两个都听。您甚至可以在更新来自任何提供商之前使用 lastKnownLocation。 您可以在 MyLocationListener 中添加 Location 变量,并在 onLocationChanged() 中设置其值。在您的主要活动中,创建两个 MylocationListener 实例,一个用于 gps,一个用于网络提供商。从一定的时间开始监听(你可以通过创建一个定时器线程来实现),当时间到时,停止监听并首先检查 gpslistener 中的 location 变量(如果有的话),否则,检查 networklistener。 如果您不关心您的位置来自哪个提供商(例如 GPS 或网络),您可以为两者使用相同的 LocationListener。您可以使用以下方式订阅它们:manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, myLocationListener) 用于 GPS 或 manager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, myLocationListener) 用于网络位置。您可以更改零以调整性能(第一个零是更新之间的最短时间,第二个是在收到更新之前移动的最小米数)。【参考方案2】:

也许您可以使用LocationManager 中的getBestProvider (Criteria criteria, boolean enabledOnly) 和this other thread 中的条件。 请参阅official documentation。

希望对你有帮助

【讨论】:

以上是关于android从可用的最佳提供商处获取位置的主要内容,如果未能解决你的问题,请参考以下文章

仅从 GPRS 网络提供商 Android 获取位置

从网络提供商处获取准确的当前位置

如何从 iOS 中的不同来源获取位置?

从类android获取位置

如何从网络提供商处获取日期和时间?

Android API 30 及更高级别在后台获取 GPS 位置的最佳方式