2013-05-25 10 views
7

Un utente della mia app ha segnalato che l'app comunica alla rete che la posizione non è attiva anche se l'ha accesa. Mi ha mandato poche schermate e mi hanno fatto riflettere;LocationManager.isProviderEnabled (LocationManager.NETWORK_PROVIDER) non è affidabile, perché?

LocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER) 

non funziona correttamente. Il suo telefono ha Android 4.1.2 e per prima cosa ho pensato che lo this sia la causa di questo problema. Ma non era il caso. Mi ha mandato anche una schermata di quell'ambientazione.

Quindi ho cercato su Google e ho trovato this. La domanda sembra aiutarmi, ma sfortunatamente la risposta non è stata utile per questo caso e l'interrogante non ha proseguito.

La mia app è correlata all'ubicazione e utilizza LocationManager.isProviderEnabled per sapere che GPS e rete sono attivati ​​o disattivati. Non mi è mai stato detto che la mia app non conosca correttamente tali impostazioni fino a poco tempo fa. È il primo utente a segnalare il problema. Ho imparato che esiste un altro metodo per conoscere il GPS e la rete per le impostazioni di posizione, visualizzando Secure.LOCATION_PROVIDERS_ALLOWED. Per vedere come funziona questo metodo sul suo telefono, ho scritto una semplice app e gli ho chiesto di correre. Questa app svolge un'attività semplice e mostra il testo sullo schermo.

LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
if(locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) 
{ 
    string = "GPS=on\n"; 
} 
else 
{ 
    string = "GPS=off\n"; 
} 
if(locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) 
{ 
    string += "Network=on\n"; 
} 
else 
{ 
    string += "Network=off\n"; 
} 
String status = android.provider.Settings.Secure.getString(getContentResolver(), Secure.LOCATION_PROVIDERS_ALLOWED); 
if(status.contains("gps")) 
{ 
    string += "GPS=on\n"; 
} 
else 
{ 
    string += "GPS=off\n"; 
} 
if(status.contains("network")) 
{ 
    string += "Network=on\n"; 
} 
else 
{ 
    string += "Network=off\n"; 
} 

Ha inviato di nuovo la schermata. Sembra;

Questo risultato non mi ha reso felice. Ci potrebbero essere alcune possibilità per questo.

  • Come altre persone interrogate prima, questo problema è stato presente su alcuni telefoni.
  • Google ha infranto questo con 4.1.2. isProviderEnabled non funziona su questa versione.
  • Anche se non è documentato, a partire da 4.1.2, isProviderEnabled non funzionerà come prima.
  • No, Google ha cambiato nulla. Questo è un bug per questo particolare telefono.

Ora le mie domande sono;

  1. Is LocationManager.isProviderEnabled è ancora valido per Android 4.1.2 e versioni successive?
  2. Does vedendo Secure.LOCATION_PROVIDERS_ALLOWED avere degli svantaggi/fori pit (quando ho rinunciato usando LocationManager.isProviderEnabled

Grazie in anticipo

Edit1:?.

Here è possibile scaricare prova l'app da Google Play per provare o chiedere a qualcuno di provare.

EDIT6:

Ho rimosso l'app di test da quando si risponde a questa domanda.

EDIT2:

ho rilasciato la mia app che controlla provider di rete è utilizzabile da vedere Secure.LOCATION_PROVIDERS_ALLOWED e ottenuto eccezione sui telefoni limitato. Questi sono i rapporti dell'ACRA.

Alcuni telefoni con sistema operativo 4.1.1.

java.lang.IllegalArgumentException: requested provider network doesn't exisit 
    at android.os.Parcel.readException(Parcel.java:1434) 
    at android.os.Parcel.readException(Parcel.java:1384) 
    at android.location.ILocationManager$Stub$Proxy.requestLocationUpdates(ILocationManager.java:675) 
    at android.location.LocationManager._requestLocationUpdates(LocationManager.java:686) 
    at android.location.LocationManager.requestLocationUpdates(LocationManager.java:508) 

Alcuni telefoni con sistema operativo 4.1.2.

java.lang.IllegalArgumentException: provider=network 
    at android.os.Parcel.readException(Parcel.java:1439) 
    at android.os.Parcel.readException(Parcel.java:1389) 
    at android.location.ILocationManager$Stub$Proxy.requestLocationUpdates(ILocationManager.java:659) 
    at android.location.LocationManager._requestLocationUpdates(LocationManager.java:690) 
    at android.location.LocationManager.requestLocationUpdates(LocationManager.java:512) 

non ho mai visto tali eccezioni fino a quando ho cambiato un metodo per controllare fornitore di rete per la posizione è utilizzabile o meno. Quindi penso che LocationManager.isProviderEnabled sia sicuro e vedere Secure.LOCATION_PROVIDERS_ALLOWED sia rischioso. Ma questo mi riporterà al problema originale. Perché LocationManager.isProviderEnabled (LocationManager.NETWORK_PROVIDER) restituisce false (e in realtà non lo è) quando Secure.LOCATION_PROVIDERS_ALLOWED indica che IS è. Il sistema operativo Android è progettato male? O ho appena visto problemi legati solo a telefoni specifici (ma ce ne sono almeno 2)?

Edit3:

ho aggiornato applicazione di test per mostrare/Rete GPS fornitore di posizione sembra realmente utilizzabile o meno accedendo con requestLocationUpdates().

E divulgo il nome di 2 telefoni.

1) SBM200SH, OS4.1.2, Softbank mobili, Sharp Corporation
2) HTX21 (Infobar A02), OS4.1.1, KDDI, HTC

edit4:

ho trovato 3 ° di telefono .

3) SBM203SH, OS4.1.2, Softbank mobili, Sharp Corporation

EDIT5:

Sharp Corporation è in esecuzione spazio di discussione per gli sviluppatori mobili. Ho postato l'argomento presentando la domanda di questo SO. Spero che qualcuno della Sharp Corporation agisca per questo. Terrò questo aggiornato.

+0

L'ho appena testato su entrambi 4.1.2 (galaxy s2) e 4.2.2 (nexus 7), funziona bene su entrambi i dispositivi. È solo questo utente? Che telefono usa? – dumazy

+1

Solo un commento, ma si consideri di usare fuso. – cremy

+0

@dumazy, ho visto che almeno 2 telefoni hanno questo problema. E sono riluttante a mostrare il nome del telefono ora. – Tomcat

risposta

6

Il supporto per gli sviluppatori fornito da Sharp Corporation è eccellente e hanno risposto alla mia domanda in meno di 48 ore.

Questo è quello che ho ricevuto da loro.

È necessario soddisfare 2 condizioni che LocationManager.isProviderEnabled (LocationManager.NETWORK_PROVIDER) restituisce true.

  1. Alcuni stati interni sono pronti per la posizione di rete.
  2. La posizione di rete è abilitata sulla schermata delle impostazioni.

Il secondo è ovvio. Ma il primo non lo è. Hanno detto come simulare il primo è negativo. È possibile confermare il problema con i passaggi indicati di seguito e eseguire la mia app di test (vedere la mia domanda per il collegamento al download).

  • Apre le impostazioni del telefono.
  • Toccare Applicazioni.
  • Seleziona tutto.
  • Trova "Posizione di rete", toccalo.
  • Toccare "Disabilita".
  • Riavviare il telefono.
  • Esegui test di app.

Per motivo non riesco a capire che il telefono dell'utente non è riuscito a fare qualcosa relativo alla prima condizione mostrata sopra e presenta il problema.

Conclusione:

LocationManager.isProviderEnabled (LocationManager.NETWORK_PROVIDER) è affidabile. E sappi che Secure.LOCATION_PROVIDERS_ALLOWED è meno affidabile.

+1

Il cliente farà tutti questi passaggi? E hai testato la tua app su altri telefoni? Samsung 2.3.6 e 4.0? Secondo me è necessario un modo programmatico per attivare l'aggiornamento. Pensaci. – Siddharth

+0

Un utente ha utilizzato la mia app di prova e ha dimostrato quale era la causa di questo problema. La mia risposta potrebbe non sembrare corretta dato che non è possibile leggere le conversazioni sul forum di supporto degli utenti gestito da Sharp Corporation. Hanno chiaramente indicato il problema ed è stato risolto. – Tomcat

2

Non direttamente una risposta alle tue domande, ma controlla la nuova API di posizione che Google ha lanciato la scorsa settimana. È davvero facile da implementare e controllerà la migliore posizione possibile senza sprecare la batteria. http://developer.android.com/google/play-services/location.html ed ecco una sessione di Google I/O su questa nuova API e su come utilizzarla. http://www.youtube.com/watch?v=Bte_GHuxUGc

In questo modo non c'è bisogno di preoccuparsi di verificare se il GPS è on o no e cose del genere

+5

Questa risposta è fuori dal contesto della mia domanda. – Tomcat

0

Location Manager non è affidabile su alcuni telefoni. Potresti notare che se avvii google maps all'improvviso la tua app funziona. Questo perché Google Maps ha lanciato il LocationManager. Il che significa anche che esiste un modo programmatico per cacciare quel tizio vivo.Così ho usato

HomeScreen.getLocationManager().requestLocationUpdates(
    LocationManager.NETWORK_PROVIDER, 0, 0, new LocationListener() { 
     @Override 
     public void onStatusChanged(String provider, int status, Bundle extras) { 
     } 
     @Override 
     public void onProviderEnabled(String provider) { 
     } 
     @Override 
     public void onProviderDisabled(String provider) { 
     } 
     @Override 
     public void onLocationChanged(final Location location) { 
     } 
    }); 

Dopo il codice di cui sopra, ho chiamato cosa mai mi serviva da LocationManager e kinda funzionato. Se non prova la nuova API LocationClient. Questo dovrebbe essere molto meglio, batteria, precisione e affidabilità.

+0

calling requestLocationUpdates genera un'eccezione. Per favore vedi di nuovo la domanda. Immagino che il problema che sto affrontando sia diverso da quello che sai. – Tomcat

+0

@Tomcat potresti avere ragione ma dovrei anche notare che in alcuni casi la soluzione sopra funziona come un incantesimo. – holgac

2

Il modo moderno di controllare le impostazioni degli utenti Posizione è attraverso LOCATION_MODE in Settings.Secure

Per esempio, se si vuole semplicemente sapere se l'utente li ha disattivato o no, si può fare:

public static boolean isLocationEnabled(Context context) { 
     return getLocationMode(context) != Settings.Secure.LOCATION_MODE_OFF; 
    } 

    private static int getLocationMode(Context context) { 
     return Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_OFF); 
    } 

Questo restituirà true se Location è abilitato. Se hai bisogno di una granularità più fine see the docs per i dettagli.

Questo metodo è più adatto quando si utilizzano le API di posizione dei servizi di Google rispetto alle precedenti modalità NETWORK_PROVIDER e GPS_PROVIDER. Nota: richiede KitKat/API19

Problemi correlati