LocationManager.isProviderEnabled (LocationManager.NETWORK_PROVIDER) nie jest wiarygodny, dlaczego?

Jeden użytkownik mojej aplikacji zgłosił, że aplikacja informuje sieć, że lokalizacja jest wyłączona, nawet jeśli ją włączył. Wysłał mi kilka zrzutów ekranu i kazali mi myśleć;

LocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)

nie działa poprawnie. Jego telefon działa pod kontrolą systemu Android 4.1.2 i najpierw pomyślałemto jest przyczyną tego problemu. Ale tak nie było. Wysłał mi też zrzut ekranu tego ustawienia.

Potem znalazłem google i znalazłemto. Pytanie wydaje mi się pomocne, ale niestety odpowiedź nie była pomocna w tej sprawie, a pytający nie poszedł dalej.

Moja aplikacja jest powiązana z lokalizacją i używałem LocationManager.isProviderEnabled, aby wiedzieć, czy GPS i sieć są włączone lub wyłączone. Nigdy nie powiedziano mi, że moja aplikacja do niedawna nie zna tych ustawień. Jest pierwszym użytkownikiem, który zgłosił problem. Dowiedziałem się, że istnieje inna metoda poznawania GPS i sieci dla ustawień lokalizacji, widząc Secure.LOCATION_PROVIDERS_ALLOWED. Aby zobaczyć, jak ta metoda działa na jego telefonie, napisałem prostą aplikację i poprosiłem go o uruchomienie. Ta aplikacja wykonuje proste zadanie i wyświetla tekst na ekranie.

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";
}

Odesłał ponownie zrzut ekranu. To wygląda;

GPS=on
Network=off
GPS=on
Network=on

Ten wynik nie uszczęśliwiał mnie. Mogą to być pewne możliwości.

Jak ktoś inny pytał wcześniej, ten problem pojawił się na niektórych telefonach.Google złamało to z 4.1.2. isProviderEnabled nie działa w tej wersji.Chociaż nie jest to udokumentowane, począwszy od wersji 4.1.2, isProviderEnabled nie będzie działać tak jak wcześniej.Nie, Google coś zmieniło. To jest błąd dla tego konkretnego telefonu.

Teraz moje pytania są;

Czy LocationManager.isProviderEnabled jest nadal ważny dla Androida 4.1.2 i nowszych?Czy widzenie Secure.LOCATION_PROVIDERS_ALLOWED ma pewne wady / dziury w jamie (kiedy zrezygnowałem z używania LocationManager.isProviderEnabled?

Z góry dziękuję.

EDIT1:

Tutaj możesz pobrać aplikację testową z Google Play, aby spróbować poprosić kogoś o wypróbowanie.

EDIT6:

Usunąłem aplikację testową od czasu odpowiedzi na to pytanie.

EDIT2:

Wydałem moją aplikację, która sprawdza, czy operator sieci jest użyteczny, widząc Secure.LOCATION_PROVIDERS_ALLOWED i otrzymałem wyjątek w przypadku ograniczonych telefonów. Oto raport ACRA.

Niektóre telefony z systemem operacyjnym 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)

Niektóre telefony z systemem operacyjnym 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)

Nigdy nie widziałem tych wyjątków, dopóki nie zmieniłem metody sprawdzania dostawcy sieci, czy lokalizacja jest użyteczna, czy nie. Myślę więc, że LocationManager.isProviderEnabled jest bezpieczny i zobaczenie Secure.LOCATION_PROVIDERS_ALLOWED jest ryzykowne. Ale to przywróci mi pierwotny problem. Dlaczego LocationManager.isProviderEnabled (LocationManager.NETWORK_PROVIDER) zwraca false (i tak naprawdę nie jest), gdy Secure.LOCATION_PROVIDERS_ALLOWED mówi, że IS. Czy system operacyjny Android jest źle zaprojektowany? A może widzę tylko problemy związane z konkretnymi (ale przynajmniej 2 z nich) telefonami?

EDIT3:

Zaktualizowałem aplikację testową, aby pokazać, że dostawca lokalizacji GPS / sieci jest naprawdę użyteczny lub nie, uzyskując dostęp za pomocą requestLocationUpdates ().

I ujawniam nazwę 2 telefonów.

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

EDIT4:

Znalazłem trzeci telefon.

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

EDIT5:

Sharp Corporation prowadzi przestrzeń dyskusyjną dla programistów mobilnych. Wysłałem temat, przedstawiając to pytanie SO. Mam nadzieję, że ktoś w Sharp Corporation podejmie działania w tym kierunku. Będę to aktualizował.

questionAnswers(4)

yourAnswerToTheQuestion