LocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER) ist nicht zuverlässig, warum?
Einen Benutzer meiner app berichtet, dass die app erzählt-Netzwerk für den Standort ab, auch er Tat es einzuschalten. Er schickte mir einige screenshots und Sie hat mich zum nachdenken;
LocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)
nicht richtig funktioniert. Sein Telefon läuft Android 4.1.2 und ich dachte erst, dass diese ist die Ursache für dieses Problem. Aber es war nicht der Fall. Er schickte mir einen Screenshot, dass die Einstellung zu.
Dann habe ich gegoogelt und gefunden diese. Die Frage scheint mir zu helfen, aber leider die Antwort war nicht hilfreich für diesen Fall und Frager nicht weiter verfolgen.
Meine app ist in Bezug auf Lage und wurden mit LocationManager.isProviderEnabled zu wissen, GPS und Netzwerk für den Standort ein-oder ausschalten. Ich habe nie gesagt, meine app nicht richtig zu wissen, die Einstellungen, bis vor kurzem. Er ist der erste Benutzer, der berichtet der Ausgabe. Ich habe gelernt, es gibt eine andere Methode, um zu wissen, GPS und Netzwerk für Standort-Einstellungen, indem Sie sehen, Sichern.LOCATION_PROVIDERS_ALLOWED. Um zu sehen, wie diese Methode arbeiten auf seinem Handy, ich schrieb einfach, app zu und fragte ihn, zu laufen. Diese app funktioniert einfach und zeigt text auf dem Bildschirm.
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";
}
Er zurück geschickt Screenshot wieder. Es sieht;
GPS=on
Network=off
GPS=on
Network=on
Dieses Ergebnis hat mich nicht glücklich gemacht. Könnte es einige Möglichkeiten.
- Als andere befragte person vor, dieses Problem wurde es auf einigen Telefonen.
- Google brach diese mit 4.1.2. isProviderEnabled funktioniert nicht auf diese version.
- Obwohl nicht dokumentiert ist, ab 4.1.2, isProviderEnabled nicht so funktionieren, wie vorher auch.
- Nein, Google nichts geändert hat. Dies ist ein Fehler, der für diesen speziellen Telefon.
Nun meine Fragen sind;
- Ist LocationManager.isProviderEnabled noch gültig für die Android 4.1.2 und höher?
- Nicht sehen zu Sichern.LOCATION_PROVIDERS_ALLOWED haben einige Nachteile/pit-Löchern (wenn ich es aufgab, mit LocationManager.isProviderEnabled?
Vielen Dank im Voraus.
EDIT1:
Hier Sie können download-test-app von Google Spielen, um zu versuchen, oder Fragen Sie jemanden, um zu versuchen.
EDIT6:
Ich entfernte test-app, da diese Frage beantwortet ist.
EDIT2:
Ich veröffentlichte meine app, die prüft Netzwerk-Anbieter nutzbar ist, durch den Anblick Sicher.LOCATION_PROVIDERS_ALLOWED und bekam Ausnahme auf Handys beschränkt.
Diese sind ACRA ' s Bericht.
Einige Handy mit OS 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)
Einige Telefon-OS 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)
Habe ich noch nie gesehen die Ausnahmen, bis ich verändert eine Methode, um zu überprüfen, Netzwerk-provider für location brauchbar ist oder nicht. Also ich denke LocationManager.isProviderEnabled ist sicher und sehen Sicher.LOCATION_PROVIDERS_ALLOWED ist riskant. Aber das wird mich wieder zum ursprünglichen Problem. Warum LocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER) gibt false zurück (und es ist nicht wirklich), wenn man die Sicherheit.LOCATION_PROVIDERS_ALLOWED sagt, es IST. Ist Android OS schlecht konzipiert? Oder habe ich nur sehen, Fragen gebunden, die nur auf bestimmte (aber es sind zumindest 2 von Ihnen) Handys?
EDIT3:
Ich aktualisierte test-app, um zu zeigen, GPS/Network location provider scheint wirklich brauchbar ist oder nicht, zugreifen mit requestLocationUpdates().
Und ichs 2 Handys Namen.
1) SBM200SH, OS4.1.2, Softbank mobile, Sharp Corporation
2) HTX21 (INFOBAR A02), OS4.1.1, KDDI HTC
EDIT4:
Fand ich 3. Telefon.
3) SBM203SH, OS4.1.2, Softbank mobile, Sharp Corporation
EDIT5:
Sharp Corporation läuft die Diskussion Raum für mobile-Entwickler. Ich geschrieben Thema zu präsentieren, SO die Frage. Ich hoffe, dass jemand bei der Sharp Corporation, führt die entsprechende Aktion für diesen. Ich halte dies aktualisiert.
- Ich habe es gerade getestet auf beiden 4.1.2 (galaxy s2) und 4.2.2 (nexus 7), funktioniert einwandfrei auf beiden Geräten. Ist es nur dieser Benutzer? Welches Telefon nutzt er?
- Einfach ein Kommentar schreiben, aber Bedenken Sie zu verwenden verschmolzen.
- Sah ich mindestens 2 Handys haben dieses Problem. Und ich bin relactant anzeigen Telefon name jetzt.
- Samsung-Handys sind bekannt für die Netzbetreiber Ort Probleme. Nennen Sie das Telefon so, dass u kann hier geholfen werden.
- Finden Sie bearbeiteten Frage.
- Bitte Lesen Sie meinen Kommentar zu Ihrer Antwort.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Entwickler-support durch Sharp corporation ist ausgezeichnet, und Sie antwortete auf meine Frage in weniger als 48 Stunden.
Dies ist, was ich von Ihnen bekam.
Gibt es 2 Bedingungen müssen erfüllt sein, dass LocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER) gibt true zurück.
Zweite ist offensichtlich. Aber ersten ist nicht. Sie erzählte, wie Sie zu simulieren, die erste ist negativ. Können Sie bestätigen, dass das Problem mit den unten aufgeführten Schritte und laufen meine test-app (siehe meine Frage zum link für den download).
Für Grund kann ich nicht verstehen die Benutzer das Handy nicht zu tun, etwas, das in Bezug auf die erste Bedingung, die oben gezeigt wird, und zeigt die Ausgabe.
Fazit:
LocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER) ist zuverlässig. Und sich bewusst sein, Sicher.LOCATION_PROVIDERS_ALLOWED ist weniger zuverlässig.
Die moderne Art zu markieren Sie die Benutzer, Speicherort der Einstellungen ist durch
LOCATION_MODE
imSettings.Secure
Zum Beispiel, wenn Sie einfach wissen wollen, ob der Benutzer deaktiviert hat oder nicht, können Sie tun:
Diese gibt true zurück, wenn die Lage aktiviert ist. Wenn Sie brauchen eine feinere Granularität siehe die Dokumentation für details.
Diese Methode ist besser geeignet, bei der Nutzung der Google Services Location-APIs als das alte NETWORK_PROVIDER und GPS_PROVIDER Möglichkeiten. Hinweis: Erfordert KitKat /API19
Nicht direkt eine Antwort auf Ihre Frage(N), aber schauen Sie sich die neue Location API, startete Google Letzte Woche. Es ist wirklich einfach zu implementieren, und es wird geprüft, für die optimale Lage, ohne teure Batterie.
http://developer.android.com/google/play-services/location.html
und hier ist eine session auf der Google I/O über diese neue API und wie man es benutzt.
http://www.youtube.com/watch?v=Bte_GHuxUGc
Diese Weise brauchen Sie nicht zu befürchten, zu prüfen, ob das GPS eingeschaltet ist oder nicht und Dinge wie, dass
Location Manager ist nicht zuverlässig auf einigen Telefonen. Sie können feststellen, dass, wenn Sie starten Sie google maps plötzlich Ihre app funktioniert. Das ist, weil Google Maps trat den LocationManager. Das bedeutet auch, dass es programmgesteuerte Möglichkeit, um kick, dude lebendig. So habe ich
Nach dem obigen code, rief ich, was immer ich brauchte, LocationManager und es irgendwie funktionierte. Wenn nicht, probieren Sie die neuen API ' s
LocationClient
. Dies ist wohl viel besser, Akku, Genauigkeit und Zuverlässigkeit.