2013-05-25 43 views
7

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à;

  1. Vị tríManager.isProviderEnabled vẫn hợp lệ cho Android 4.1.2 trở lên?
  2. 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.

+0

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

+1

Chỉ cần một bình luận, nhưng hãy xem xét để sử dụng hợp nhất. – cremy

+0

@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

Trả lời

6

Hỗ trợ nhà phát triển do tập đoàn Sharp cung cấp là tuyệt vời và họ đã trả lời câu hỏi của tôi trong vòng chưa đầy 48 giờ.

Đây là những gì tôi nhận được từ họ.

Có 2 điều kiện phải được đáp ứng rằng LocationManager.isProviderEnabled (LocationManager.NETWORK_PROVIDER) trả về giá trị true.

  1. Một số trạng thái nội bộ sẵn sàng cho vị trí mạng.
  2. Vị trí mạng được bật trên màn hình thiết lập.

Thứ hai là hiển nhiên. Nhưng trước hết thì không. Họ nói làm thế nào để mô phỏng đầu tiên là tiêu cực. Bạn có thể xác nhận vấn đề với các bước được hiển thị bên dưới và chạy ứng dụng thử nghiệm của tôi (vui lòng xem câu hỏi của tôi để có liên kết tải xuống).

  • Mở cài đặt của điện thoại của bạn.
  • Nhấn vào Ứng dụng.
  • Nhấn vào Tất cả tab.
  • Tìm "Vị trí mạng", nhấn vào nó.
  • Nhấn "Tắt".
  • Khởi động lại điện thoại của bạn.
  • Chạy ứng dụng thử nghiệm.

Vì lý do tôi không thể hiểu điện thoại của người dùng không thực hiện điều gì đó liên quan đến điều kiện đầu tiên được hiển thị ở trên và hiển thị sự cố.

Kết luận:

LocationManager.isProviderEnabled (LocationManager.NETWORK_PROVIDER) là đáng tin cậy. Và lưu ý rằng Secure.LOCATION_PROVIDERS_ALLOWED ít đáng tin cậy hơn.

+1

Khách hàng của bạn có thực hiện tất cả các bước này không? Và bạn đã thử nghiệm ứng dụng của mình trên các điện thoại khác chưa? Samsung 2.3.6 và 4.0? Theo tôi, bạn cần có cách lập trình để kích hoạt cập nhật. Hãy suy nghĩ về nó. – Siddharth

+0

Một người dùng đã sử dụng ứng dụng thử nghiệm của tôi và chứng minh nguyên nhân của sự cố này là gì. Câu trả lời của tôi có thể không đúng vì bạn không thể đọc các cuộc hội thoại trên diễn đàn hỗ trợ người dùng do tập đoàn Sharp điều hành. Họ chỉ rõ vấn đề, và nó đã được giải quyết. – Tomcat

2

Không trực tiếp trả lời cho (các) câu hỏi của bạn, nhưng hãy xem API vị trí mới mà Google đã khởi chạy vào tuần trước. Nó thực sự dễ dàng để thực hiện và nó sẽ kiểm tra vị trí tốt nhất có thể mà không lãng phí pin. http://developer.android.com/google/play-services/location.html và đây là phiên tại Google I/O về API mới này và cách sử dụng API này. http://www.youtube.com/watch?v=Bte_GHuxUGc

Bằng cách này bạn không cần phải lo lắng về việc kiểm tra nếu GPS là trên hay không và những thứ như thế

+5

Câu trả lời này nằm ngoài bối cảnh câu hỏi của tôi. Yêu cầu gọi số – Tomcat

0

Location Manager là không đáng tin cậy về một số điện thoại. Bạn có thể nhận thấy rằng nếu bạn khởi chạy bản đồ google đột ngột, ứng dụng của bạn hoạt động. Đó là vì Google Maps đã khởi chạy Trình quản lý vị trí. Điều đó cũng có nghĩa là có cách lập trình để đá anh chàng đó sống.Vì vậy, tôi đã sử dụng

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

Sau mã trên, tôi đã gọi những gì tôi cần từ LocationManager và nó đã hoạt động. Nếu không dùng thử API mới LocationClient. Điều này được cho là tốt hơn nhiều, pin, độ chính xác và độ tin cậy.

+0

Địa điểm cập nhật ném ngoại lệ. Vui lòng xem lại câu hỏi. Tôi đoán vấn đề tôi phải đối mặt là khác nhau mà bạn biết. – Tomcat

+0

@Tomcat bạn có thể đúng nhưng tôi cũng nên lưu ý rằng trong một số trường hợp, giải pháp trên hoạt động như một sự quyến rũ. – holgac

2

Cách hiện đại để kiểm tra các thiết lập người dùng Địa điểm là thông qua LOCATION_MODE trong Settings.Secure

Ví dụ, nếu bạn chỉ muốn biết nếu người dùng đã vô hiệu hóa chúng hay không, bạn có thể làm:

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

Điều này sẽ trả về true nếu Vị trí được bật. Nếu bạn cần chi tiết hơn see the docs để biết chi tiết.

Phương pháp này phù hợp hơn khi sử dụng API vị trí dịch vụ của Google so với các cách NETWORK_PROVIDER và GPS_PROVIDER cũ. Lưu ý: Yêu cầu KitKat/API19

Các vấn đề liên quan