2011-02-05 19 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

因爲您在設置菜單中選擇了「使用網絡」選項,所以您始終可以獲得答案。我也有這個問題,直到我發現了這一點。希望這個對你有幫助。

相關問題