2011-02-05 23 views
17

我想选择在Android中启用的LocationProvider。项目构建目标是Android 2.1。LocationManager:是否始终启用“网络”提供程序?

这就是我在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

这也可能是由于Android缓存网络位置造成的,因为粗略粒度,它不可能很快发生变化。这只是一个猜测。 –

回答

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报道正确“假”,因为没有任何联系。这对于检查您是否确实拥有网络以及可用的基于网络的位置提供程序很有用。然后我再看看我的设备设置。这里是答案:

locationMgr.isProviderEnabled(LocationManager.NETWORK_PROVIDER) 

报告,如果用户检查设备设置(下位置在我的情况 - 我的位置)。如果您取消选中所有供应商,则确实如预期的那样返回null。它实际上记录在isProviderEnabled(),但我一定忽略了它。案件结案。

+1

感谢您的跟进! –

+0

'isProviderEnabled()'应该在这个例子中返回false,对吧?您不能拥有返回null的基本返回类型的方法。也许你的意思是'getBestProvider()'? –

+0

你有没有找到解决这个问题的方法?在我的Galaxy S IV手机设置下,我设置了“权限” - >“位置服务” - >“使用无线网络”为真。但是,如果我关闭所有功能(关闭GPS,WiFi和蜂窝无线电,并启用飞行模式),则isProviderEnabled(LocationManager.NETWORK_PROVIDER)仍然返回TRUE。 – stackoverflowuser2010

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; 
} 
+0

感谢您的快速回复。我应该补充一点,我知道如何解决这个问题。如果** getBestProvider **和** isLocationProviderEnabled **的结果总是像我描述的那样,即使“网络”总是被报告为“启用”,即使它不是,我也有兴趣得到答案。 –

1

因为您在设置菜单中选择了“使用网络”选项,所以您始终可以获得答案。我也有这个问题,直到我发现了这一点。希望这个对你有帮助。

相关问题