【问题标题】:LocationManager, GPS and Network providers.. are triggered both?LocationManager、GPS 和网络提供商.. 都被触发了吗?
【发布时间】:2013-09-29 12:36:10
【问题描述】:

这段代码:

ServiceListener mlistener = new SosServiceListener(getApplicationContext());

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

manager.requestSingleUpdate(LocationManager.GPS_PROVIDER, mlistener, null);
manager.requestSingleUpdate(LocationManager.NETWORK_PROVIDER, mlistener, null);

将一个侦听器一次附加到两个事件。事实是:如果两个事件都被触发,监听器会被调用两次?如果是,您将如何预防?

谢谢!

【问题讨论】:

  • 为此只创建了 if-else 循环...
  • 创建两个差异侦听器,一个用于网络提供商,另一个用于 GPS 提供商,并读取两个结果。根据您的兴趣,您可以取消/停止列出 GPS 或网络提供商。

标签: android network-programming gps android-location


【解决方案1】:

这是我在我的一个项目中使用的并且运行良好:

public Location getLocation() {
        try {
            mLocationManager = (LocationManager) context.getSystemService(LOCATION_SERVICE);

            // getting GPS status
            boolean isGPSEnabled = mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);

            // getting network status
            boolean isNetworkEnabled = mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

            if (!isGPSEnabled && !isNetworkEnabled) {
                // no network provider is enabled
            } else {
                // First get location from Network Provider
                if (isNetworkEnabled) {
                    mLocationManager.requestLocationUpdates( LocationManager.NETWORK_PROVIDER,  MIN_TIME_BW_UPDATES,  MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                    Log.d("Network", "Network");
                    if (mLocationManager != null) {
                        location = mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                        if (location != null) {
                            lat = location.getLatitude();
                            lng = location.getLongitude();
                        }
                    }
                }
                //get the location by gps
                if (isGPSEnabled) {
                    if (location == null) {
                        mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,MIN_TIME_BW_UPDATES,MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                        Log.d("GPS Enabled", "GPS Enabled");
                        if (mLocationManager != null) {location = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                            if (location != null) {
                                lat = location.getLatitude();
                                lng = location.getLongitude();
                            }
                        }
                    }
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        return location;
    }

【讨论】:

  • 这些常量是在某处定义的,还是我可以设置我认为合适的值?如果是这种情况,我应该为它们分配什么值?
  • 这里没有常量,lat 和 lng 是双变量,isGPSEnabled 和 isNetworkEnabled 是布尔变量,初始设置为 false,mLocationManager 是 LocationManager 的一个实例。
  • @TharakaNirmana 我认为他的意思是,这些常量 MIN_TIME_BW_UPDATES、MIN_DISTANCE_CHANGE_FOR_UPDATES。 @libathos 如果是这样,是的,你可以改变。 MIN_TIME_BW_UPDATES 以毫秒为单位,MIN_DISTANCE_CHANGE_FOR_UPDATES 以米为单位。 See here
【解决方案2】:

如果您可以假设设备将在安装了 Google Play 的设备上运行 - 更好的方法是使用此服务:https://developer.android.com/training/location/retrieve-current.html

【讨论】:

    猜你喜欢
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    相关资源
    最近更新 更多