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

Posted

技术标签:

【中文标题】LocationManager、GPS 和网络提供商.. 都被触发了吗?【英文标题】:LocationManager, GPS and Network providers.. are triggered both? 【发布时间】: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 或网络提供商。 【参考方案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

【讨论】:

以上是关于LocationManager、GPS 和网络提供商.. 都被触发了吗?的主要内容,如果未能解决你的问题,请参考以下文章

LocationManager-定位方式原理解析

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

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

我如何知道LocationManager GPS检索的提供者?

试图通过网络提供商获得纬度和纬度

从 Fused Location Provider 获取 GPS 或网络提供商