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 和网络提供商.. 都被触发了吗?的主要内容,如果未能解决你的问题,请参考以下文章