LocationManager:是否始终启用“网络”提供程序?

时间:2011-02-05 15:40:44

标签: android location

我想选择在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 报告“已启用”。 “网络”总是“启用”,即使它不是吗?

3 个答案:

答案 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)

您总是得到答案,因为您已在设置菜单中选择了“使用网络”选项。直到我发现这个问题,我才遇到这个问题。我希望你觉得这很有用。