2011-02-05 11 views
17

Chcę wybrać LocationProvider, który jest włączony w systemie Android. Celem budowy projektu jest system Android 2.1.Menedżer lokalizacji: czy dostawca "sieci" jest zawsze włączony?

To jest to, co robię w 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(); 
// ... 

Teraz przełączam każdy interfejs sieciowy i ustaw tryb samolotowy na moim urządzeniu (HTC Desire, Android 2.2). Odłączam urządzenie od USB. Nie ma oczywiście żywego dostawcy, który mógłby rzeczywiście dostarczyć dane o lokalizacji do urządzenia. Pytam konkretnie getBestProvider tylko dla dostawców z włączoną obsługą, więc oczekuję, że w takim przypadku zwróci wartość null lub pusty ciąg znaków. Oczekuję, że isProviderEnabled zwróci false.

Rzeczywisty wynik jest, że getBestProvider „sieć” powraca i isProviderEnabled raporty to być „włączone”. Czy "sieć" jest zawsze "włączona", nawet jeśli nie jest?

+0

Przyczyną może być również lokalizacja sieciowa pamięci podręcznej Androida, ponieważ jest mało prawdopodobne, aby uległa zmianie wkrótce ze względu na zgrubną ziarnistość. Ale to tylko przypuszczenie. –

Odpowiedz

21

Po pewnym kopania mogę odpowiedzieć na moje własne pytanie. Pierwszy próbowałem tryb samolot z:

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()); 
} 

W ConnectivityManager raporty poprawnie „false”, ponieważ nie ma połączenia. Jest to przydatne do sprawdzenia, czy rzeczywiście masz sieć, a zatem dostępny jest dostawca sieciowy. Potem rzuciłem okiem na moje ustawienia urządzenia. A oto odpowiedź:

locationMgr.isProviderEnabled(LocationManager.NETWORK_PROVIDER) 

raporty jeśli użytkownik sprawdził ustawienie urządzenia (w moim przypadku pod Lokalizacja - Moja lokalizacja). Jeśli usuniesz zaznaczenie wszystkich dostawców tam, to zgodnie z oczekiwaniami zwraca on null. Jest to faktycznie udokumentowane w isProviderEnabled(), ale musiałem to przeoczyć. Sprawa zamknięta.

+1

Dzięki za kontynuację! –

+0

'isProviderEnabled()' powinien zwrócić wartość false w tym przykładzie, prawda? Nie można mieć metody z pierwotnym typem zwracanym, który zwraca wartość null. Być może masz na myśli 'getBestProvider()'? –

+0

Czy kiedykolwiek znalazłeś rozwiązanie tego problemu? Na moim telefonie Galaxy S IV w ustawieniach ustawiłem "Uprawnienia" -> "Usługi lokalizacyjne" -> "Korzystaj z sieci bezprzewodowych", aby mieć wartość PRAWDA. Jeśli jednak wyłączyłem wszystko (wyłączyć GPS, WiFi i radio komórkowe, a także włączyć tryb samolotowy), to 'isProviderEnabled (LocationManager.NETWORK_PROVIDER)' nadal zwraca TRUE. – stackoverflowuser2010

1

Spróbuj

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

Dzięki za szybką reakcję Ollie. Powinienem dodać, że wiem, jak obejść sytuację. Jestem zainteresowany uzyskaniem odpowiedzi, jeśli wynik ** getBestProvider ** i ** isLocationProviderEnabled ** są zawsze takie, jak opisałem, tj. Jeśli "sieć" jest zawsze zgłaszana jako "włączona", nawet jeśli nie jest. –

1

Zawsze odpowiadasz jako odpowiedź, ponieważ wybrałeś opcję "Użyj sieci" w menu ustawień. Miałem również ten problem, dopóki tego nie odkryłem. Mam nadzieję, że okaże się to przydatne.

Powiązane problemy