Một người dùng ứng dụng của tôi đã báo cáo rằng ứng dụng thông báo cho vị trí mạng bị tắt ngay cả khi anh ấy bật tính năng này. Anh ấy gửi cho tôi vài bức ảnh chụp màn hình và họ khiến tôi nghĩ;LocationManager.isProviderEnabled (LocationManager.NETWORK_PROVIDER) không đáng tin cậy, tại sao?
LocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)
không hoạt động bình thường. Điện thoại của anh ấy đang chạy Android 4.1.2 và đầu tiên tôi nghĩ this là nguyên nhân của vấn đề này. Nhưng không phải vậy. Anh ấy cũng gửi cho tôi một ảnh chụp màn hình của khung cảnh đó.
Sau đó, tôi googled và tìm thấy this. Câu hỏi dường như giúp tôi nhưng tiếc là câu trả lời không hữu ích cho trường hợp này và người hỏi không theo đuổi xa hơn.
Ứng dụng của tôi liên quan đến vị trí và đã sử dụng LocationManager.isProviderEnabled để biết GPS và Mạng cho vị trí đang bật hoặc tắt. Tôi chưa bao giờ được thông báo rằng ứng dụng của tôi chưa biết chính xác các cài đặt đó cho đến gần đây. Anh ấy là người dùng đầu tiên báo cáo vấn đề. Tôi đã học được có một phương pháp khác để biết GPS và Mạng cho cài đặt vị trí, bằng cách xem Secure.LOCATION_PROVIDERS_ALLOWED. Để xem cách thức hoạt động của phương pháp này trên điện thoại của anh ấy, tôi đã viết ứng dụng đơn giản và yêu cầu anh ấy chạy. Ứng dụng này thực hiện nhiệm vụ đơn giản và hiển thị văn bản trên màn hình.
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";
}
Anh ấy đã gửi lại ảnh chụp màn hình. Nó trông;
GPS=on
Network=off
GPS=on
Network=on
Kết quả này không làm tôi hài lòng. Có thể có một số khả năng cho việc này.
- Khi người khác đặt câu hỏi trước, sự cố này đã xảy ra ở một số điện thoại.
- Google đã phá vỡ điều này với 4.1.2. isProviderEnabled không hoạt động trên phiên bản này.
- Mặc dù không được ghi lại tài liệu, bắt đầu từ phiên bản 4.1.2, isProviderEnabled sẽ không hoạt động như trước đây.
- Không, Google đã thay đổi mọi thứ. Đây là lỗi cho điện thoại cụ thể này.
Bây giờ, câu hỏi của tôi là;
- Vị tríManager.isProviderEnabled vẫn hợp lệ cho Android 4.1.2 trở lên?
- Liệu Thấy Secure.LOCATION_PROVIDERS_ALLOWED có một số nhược điểm/lỗ hố (khi tôi đã từ bỏ sử dụng LocationManager.isProviderEnabled
Cảm ơn trước
EDIT1:?.
Here bạn có thể tải về thử nghiệm ứng dụng từ Google Play để thử hoặc yêu cầu ai đó thử.
EDIT6:
Tôi đã xóa ứng dụng thử nghiệm vì câu hỏi này được trả lời.
EDIT2:
tôi phát hành ứng dụng của tôi mà kiểm tra nhà cung cấp mạng là có thể sử dụng bằng cách nhìn thấy Secure.LOCATION_PROVIDERS_ALLOWED và có ngoại lệ trên điện thoại hạn chế. Đây là báo cáo của ACRA.
Một số điện thoại chạy hệ điều hành 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)
Một số điện thoại đang chạy 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)
Tôi chưa bao giờ thấy những ngoại lệ đó cho đến khi tôi thay đổi phương thức để kiểm tra nhà cung cấp mạng cho vị trí có thể sử dụng được hay không. Vì vậy, tôi nghĩ LocationManager.isProviderEnabled là an toàn và thấy Secure.LOCATION_PROVIDERS_ALLOWED là nguy hiểm. Nhưng điều này sẽ đưa tôi trở lại vấn đề ban đầu. Tại sao LocationManager.isProviderEnabled (LocationManager.NETWORK_PROVIDER) trả về false (và không thực sự) khi Secure.LOCATION_PROVIDERS_ALLOWED cho biết IS. Hệ điều hành Android có được thiết kế kém không? Hoặc tôi chỉ nhìn thấy các vấn đề gắn liền với cụ thể (nhưng có ít nhất 2 trong số họ) điện thoại?
EDIT3:
tôi cập nhật ứng dụng thử nghiệm để hiển thị GPS/Mạng cung cấp vị trí dường như thực sự có ích hay không bằng cách truy cập với requestLocationUpdates().
Và tôi tiết lộ 2 tên điện thoại.
1) SBM200SH, OS4.1.2, Softbank di động, Sharp
2) HTX21 (INFOBAR A02), OS4.1.1, KDDI, HTC
EDIT4:
tôi thấy điện thoại thứ 3 .
3) SBM203SH, OS4.1.2, Softbank di động, Sharp
EDIT5:
Sharp Corporation đang chạy không gian thảo luận cho các nhà phát triển di động. Tôi đã đăng chủ đề bằng cách trình bày câu hỏi của SO này. Tôi hy vọng một người nào đó tại Sharp Corporation sẽ thực hiện hành động này. Tôi sẽ giữ cập nhật này.
Tôi vừa thử nghiệm trên cả 4.1.2 (galaxy s2) và 4.2.2 (nexus 7), hoạt động tốt trên cả hai thiết bị. Chỉ là người dùng này? Anh ta sử dụng điện thoại gì? – dumazy
Chỉ cần một bình luận, nhưng hãy xem xét để sử dụng hợp nhất. – cremy
@dumazy, tôi thấy ít nhất 2 điện thoại gặp sự cố này. Và tôi đang liên tục hiển thị tên của điện thoại ngay bây giờ. – Tomcat