在网络和 GPS 提供商之间切换
Posted
技术标签:
【中文标题】在网络和 GPS 提供商之间切换【英文标题】:Switching between network and GPS provider 【发布时间】:2011-07-27 04:48:16 【问题描述】:我想实现一个 locationListener,它将根据可用性。
例如,如果 GPS 未启用,我希望它使用网络,但一旦 GPS 开启,我希望它停止侦听来自网络的位置更新并开始侦听 GPS。
同样,我希望它在 GPS 关闭后立即开始监听来自网络的更新。
这可能吗?
子问题
GPS 在提供位置定位方面与网络一样快吗?
【问题讨论】:
【参考方案1】:当然,您只需获取网络和 GPS 的提供商,然后将您想要的任何一个传递给locationManager.requestLocationUpdates()
。
当您想停止侦听某个提供程序时,请使用您在locationManager.requestLocationUpdates()
中指定的侦听器对象调用locationManager.removeUpdates()
。
网络:
Criteria crit = new Criteria();
crit.setPowerRequirement(Criteria.POWER_LOW);
crit.setAccuracy(Criteria.ACCURACY_COARSE);
String provider = locationManager.getBestProvider(crit, false);
全球定位系统:
Criteria crit2 = new Criteria();
crit2.setAccuracy(Criteria.ACCURACY_FINE);
provider2 = locationManager.getBestProvider(crit2, false);
您可以使用LocationManager.isProviderEnabled() doc 查看是否启用/禁用了相应的提供程序。 LocationManager 文档中提供了更多信息。
GPS 通常比网络慢得多,因为您必须找到 3 颗以上遥远的卫星等。
【讨论】:
是的,但是当我初始化 locationManager 以请求位置更新时,它只会监听我传入的提供商。即locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, minTime, minDistance, listener)
只会监听来自网络的更新,而 onProviderEnabled 永远不会得到需要 GPS!
有一个LocationManager.addGpsStatusListener()
方法。当它告诉您发生了变化时,请采取相应的行动。
由于某种原因无法使其正常工作!尽管我将 gpsStatusListener 添加到 locationManager,但从未调用过 onGpsStatusChanged()
!
您可以请求两个提供商的位置更新。 API 支持多个提供者。他们的示例位置应用程序显示了用法:code.google.com/p/apps-for-android/source/browse/trunk/Radar/…>
哦,是的,我知道我可以做到,但我想使用其中一个!【参考方案2】:
我正在使用这个
LocationManager locationManager;
LocationListener locationListener;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
locationManager = (LocationManager) this
.getSystemService(Context.LOCATION_SERVICE);
String locationProvider = LocationManager.NETWORK_PROVIDER;
Location lastKnownLocation = locationManager
.getLastKnownLocation(locationProvider);
if (lastKnownLocation == null)
locationProvider = LocationManager.GPS_PROVIDER;
lastKnownLocation = locationManager
.getLastKnownLocation(locationProvider);
if (lastKnownLocation != null)
makeUseOfNewLocation(lastKnownLocation);
locationListener = new LocationListener()
public void onLocationChanged(Location location)
makeUseOfNewLocation(location);
public void onStatusChanged(String provider, int status,
Bundle extras)
public void onProviderEnabled(String provider)
public void onProviderDisabled(String provider)
;
// Register the listener with the Location Manager to receive location
// updates
if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER))
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER, 0, 0, locationListener);
else
locationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
【讨论】:
这不够灵活.. 最好两者兼而有之,然后决定哪个更好 @Vlad 你怎么能这样决定? @Hector 阅读:developer.android.com/guide/topics/location/strategies.html 无论您采用哪种策略,如果您选择的 GPS 定位方法会消耗他们设备上的少量或大量电池电量,您都需要通知您的用户。以上是关于在网络和 GPS 提供商之间切换的主要内容,如果未能解决你的问题,请参考以下文章
如何同时使用 GPS 和网络提供商在 Android 中获取当前位置的纬度和经度值