LocationManager:是不是始终启用“网络”提供程序?
Posted
技术标签:
【中文标题】LocationManager:是不是始终启用“网络”提供程序?【英文标题】:LocationManager: is the "network" provider always enabled?LocationManager:是否始终启用“网络”提供程序? 【发布时间】:2011-06-21 22:07:10 【问题描述】:我想选择一个在 android 中启用的 LocationProvider。项目构建目标为 Android 2.1。
这就是我在 onCreate() 中所做的。
// ...
LocationManager locationMgr = (LocationManager)
getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.NO_REQUIREMENT);
criteria.setPowerRequirement(Criteria.NO_REQUIREMENT);
criteria.setCostAllowed(false);
String bestProvider = locationMgr.getBestProvider(criteria, true);
Toast.makeText(getApplicationContext(), "Provider = " + bestProvider + " enabled= " + locationMgr.isProviderEnabled(bestProvider), Toast.LENGTH_LONG).show();
// ...
现在,我关闭每个网络接口并在我的设备上设置飞行模式(HTC Desire,Android 2.2)。我断开设备与 USB 的连接。显然,目前还没有提供者可以实际向设备提供位置数据。我特别要求 getBestProvider 仅针对启用的提供程序,因此我希望它在这种情况下返回 null 或空字符串。我希望 isProviderEnabled 返回 false。
实际结果是 getBestProvider 返回“network”,而 isProviderEnabled 报告它已“启用”。 “网络”是否总是“启用”,即使不是?
【问题讨论】:
这也可能是由于Android缓存网络位置造成的,因为粒度很粗,不太可能很快改变。不过这只是猜测。 【参考方案1】:经过一番挖掘,我可以回答我自己的问题。首先我尝试了飞行模式:
ConnectivityManager connectivityMgr = (ConnectivityManager)
getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo[] nwInfos = connectivityMgr.getAllNetworkInfo();
for (NetworkInfo nwInfo : nwInfos)
Log.d(TAG, "Network Type Name: " + nwInfo.getTypeName());
Log.d(TAG, "Network available: " + nwInfo.isAvailable());
Log.d(TAG, "Network c_or-c: " + nwInfo.isConnectedOrConnecting());
Log.d(TAG, "Network connected: " + nwInfo.isConnected());
ConnectivityManager 正确报告“错误”,因为没有连接。这对于检查您是否真的有网络以及因此是否有可用的基于网络的位置提供程序很有用。然后我再次查看了我的设备设置。这是答案:
locationMgr.isProviderEnabled(LocationManager.NETWORK_PROVIDER)
报告用户是否检查了设备设置(在我的情况下,在 Location - My Location 下)。如果您取消选中那里的所有提供程序,它会按预期返回 null。它实际上记录在isProviderEnabled() 中,但我一定忽略了它。结案。
【讨论】:
isProviderEnabled()
在这个例子中应该返回 false,对吧?您不能有一个返回 null 的原始返回类型的方法。也许你的意思是getBestProvider()
?
你有没有找到解决这个问题的方法?在我的 Galaxy S IV 手机的设置下,我已将“权限”-->“定位服务”-->“使用无线网络”设置为 TRUE。但是,如果我关闭所有功能(关闭 GPS、WiFi 和蜂窝无线电,并启用飞行模式),那么 isProviderEnabled(LocationManager.NETWORK_PROVIDER)
仍然返回 TRUE。【参考方案2】:
试试这个
public static boolean isLocationSensingAvailable()
boolean hasActiveLocationProvider = false;
List<String> providers = locationManager.getProviders(true);
for (String providerName:providers)
if (providerName.equals(LocationManager.GPS_PROVIDER))
hasActiveLocationProvider = isLocationProviderEnabled(providerName);
if (providerName.equals(LocationManager.NETWORK_PROVIDER))
hasActiveLocationProvider = ( SpondleApplication.isOnline() && isLocationProviderEnabled(providerName));
return hasActiveLocationProvider;
【讨论】:
感谢奥利的快速回复。我应该补充一点,我知道如何解决这种情况。如果 getBestProvider 和 isLocationProviderEnabled 的结果总是像我描述的那样,我有兴趣得到答案,即如果“网络”总是报告为“启用”,即使它是不是。【参考方案3】:因为您在设置菜单中选择了“使用网络”选项,所以您的答案总是正确的。在我发现这一点之前,我也遇到了这个问题。我希望你觉得这很有用。
【讨论】:
以上是关于LocationManager:是不是始终启用“网络”提供程序?的主要内容,如果未能解决你的问题,请参考以下文章
.isProviderEnabled(LocationManager.NETWORK_PROVIDER) 在 Android 中始终为真
如何检查 LocationManager.NETWORK_PROVIDER 是不是可用?