在网络和 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 位置提供程序

gps 使用网络提供商和 gps 提供商?

Android 网络提供商和 GPS 提供商返回 null

如何同时使用 GPS 和网络提供商在 Android 中获取当前位置的纬度和经度值

LocationManager、GPS 和网络提供商.. 都被触发了吗?

从 GPS 或网络提供商处获取速度