2011-02-05 18 views
17

Desidero selezionare un LocationProvider abilitato in Android. L'obiettivo di costruzione del progetto è Android 2.1.LocationManager: il provider "rete" è sempre abilitato?

Questo è quello che faccio in 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(); 
// ... 

Ora, posso passare ogni interfaccia di rete off e impostare la modalità di volo sul mio dispositivo (HTC Desire, Android 2.2). Scollego il dispositivo da USB. Non esiste chiaramente alcun fornitore attivo che possa effettivamente fornire dati sulla posizione al dispositivo. Chiedo esplicitamente a getBestProvider solo per i provider abilitati, quindi mi aspetto che restituisca null o una stringa vuota in quel caso. Mi aspetto che isProviderEnabled restituisca false.

Il risultato effettivo è che getBestProvider restituisce "rete" e isProviderEnabled rapporti di essere "attivata". "Network" è sempre "abilitato" anche quando non lo è?

+0

Questo potrebbe essere causato anche dalla posizione di rete del caching di Android, poiché è improbabile che cambi presto a causa della granularità grossolana. Questa è solo un'ipotesi. –

risposta

21

Dopo qualche scavo posso rispondere alla mia domanda. Per prima cosa ho provato la modalità aereo con:

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

I ConnectivityManager rapporti correttamente "false" in quanto non v'è alcuna connessione. Questo è utile per verificare se si dispone effettivamente di una rete e quindi di un fornitore di posizione basato su rete disponibile. Poi ho dato una seconda occhiata alle impostazioni del mio dispositivo. Ed ecco la risposta:

locationMgr.isProviderEnabled(LocationManager.NETWORK_PROVIDER) 

report se l'utente ha controllato l'impostazione del dispositivo (nel mio caso sotto posizione - My Location). Se deselezionate tutti i provider, restituisce null come previsto. In realtà è documentato in isProviderEnabled() ma devo averlo trascurato. Caso chiuso.

+1

Grazie per il follow-up! –

+0

'isProviderEnabled()' dovrebbe restituire false in questo esempio, giusto? Non è possibile avere un metodo con un tipo di ritorno primitivo che restituisce null. Forse vuoi dire 'getBestProvider()'? –

+0

Hai mai trovato una soluzione a questo problema? Sul mio telefono Galaxy S IV sotto le impostazioni, ho impostato 'Permessi' -> 'Servizi di localizzazione' -> 'Usa reti wireless' per essere vero. Tuttavia, se spengo tutto (spegni GPS, WiFi e radio cellulare e abiliti anche la modalità aereo), quindi 'isProviderEnabled (LocationManager.NETWORK_PROVIDER)' restituisce VERO. – stackoverflowuser2010

1

Prova questa

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

Grazie per la rapida risposta Ollie. Devo aggiungere che so come aggirare la situazione. Sono interessato a ottenere una risposta se il risultato di ** getBestProvider ** e ** isLocationProviderEnabled ** sono sempre come ho descritto, vale a dire se "rete" viene sempre segnalato come "abilitato" anche quando non lo è. –

1

Si ottiene sempre true come risposta perché è stata selezionata l'opzione "Usa reti" nel menu delle impostazioni. Ho anche avuto questo problema fino a quando ho trovato questo fuori. Spero che tu lo trovi utile

Problemi correlati