我想选择在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 返回“网络”, isProviderEnabled 报告“已启用”。 “网络”总是“启用”,即使它不是吗?
答案 0 :(得分:21)
经过一番挖掘,我可以回答我自己的问题。首先,我尝试使用飞机模式:
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 正确报告“false”,因为没有连接。这有助于检查您是否确实拥有网络,因此可以使用基于网络的位置提供程序。然后我再看一下我的设备设置。这是答案:
locationMgr.isProviderEnabled(LocationManager.NETWORK_PROVIDER)
报告用户是否已检查设备设置(在我的情况下位置 - 我的位置下)。如果您取消选中所有提供商,则会按预期返回 null 。它实际上记录在isProviderEnabled()中,但我一定忽略了它。案件结案。
答案 1 :(得分:1)
试试这个
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;
}
答案 2 :(得分:1)
您总是得到答案,因为您已在设置菜单中选择了“使用网络”选项。直到我发现这个问题,我才遇到这个问题。我希望你觉得这很有用。