【问题标题】:Switching between network and GPS provider在网络和 GPS 提供商之间切换
【发布时间】:2011-07-27 04:48:16
【问题描述】:

我想实现一个 locationListener,它将根据可用性在网络和 GPS 提供商之间切换。

例如,如果 GPS 未启用,我希望它使用网络,但一旦 GPS 开启,我希望它停止侦听来自网络的位置更新并开始侦听 GPS。

同样,我希望它在 GPS 关闭后立即开始监听来自网络的更新。

这可能吗?


子问题

GPS 在提供位置定位方面与网络一样快吗?


【问题讨论】:

    标签: android geolocation gps location locationlistener


    【解决方案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 你怎么能这样决定?
    • 无论您采用哪种策略,如果您选择的 GPS 定位方法会消耗他们设备上的少量或大量电池电量,您都需要通知您的用户。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    • 1970-01-01
    相关资源
    最近更新 更多