2012-05-21 19 views
19

Mam grupę osób zgłaszających błąd, którego nie mogę odtworzyć. Podczas próby otwarcia MapView jest zgłaszany, że getBestProvider zwraca zerowy i wiem, że oznacza to, że nie znaleziono żadnego dostawcy, który spełnia moje kryteria, które jest ACCURACY_COARSE, więc jeśli nie ma GPS, powinien on wrócić na network or passive, ale oczywiście nie ma na tych urządzeniach użytkowników. Co oznaczałoby to wtedy, że GPS jest wyłączony i nie ma połączenia sieciowego?ReplyManager getBestProvider zwraca wartość null

Próbowałem wyłączyć GPS i przełączyć telefon w tryb samolotowy, aby spróbować odtworzyć problem, ale wciąż byłem w stanie otworzyć widok mapy bez użycia siły, więc nie wiem, jak sobie z tym poradzić.

locationManager = (LocationManager) this.getSystemService(LOCATION_SERVICE); 
geocoder = new Geocoder(this); 

Criteria criteria = new Criteria(); 
criteria.setAccuracy(Criteria.ACCURACY_COARSE); 
List<String> lProviders = locationManager.getProviders(false); 
for(int i=0; i<lProviders.size(); i++){ 
    Log.d("LocationActivity", lProviders.get(i)); 
} 
String provider = locationManager.getBestProvider(criteria, true); // null 

long minTime = 60000; 
float minDistance = 5; 

locationManager.requestLocationUpdates(provider, minTime, minDistance, this); 

błąd

java.lang.RuntimeException: Unable to start activity ComponentInfo{ecm2.android/ecm2.android.LocationActivity}: 
java.lang.IllegalArgumentException: provider==null 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:123) 
at android.app.ActivityThread.main(ActivityThread.java:4627) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:521) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.IllegalArgumentException: provider==null 
at android.location.LocationManager.requestLocationUpdates(LocationManager.java:625) 
at ecm2.android.LocationActivity.onCreate(LocationActivity.java:142) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 

Odpowiedz

14

w wywołaniu do getBestProvider() pan poprosił o dostawców obsługujących tylko (to drugi parametr w wywołaniu metody, które zostały ustawione na true). Jeśli użytkownik wyłączył wszystkich dostawców, otrzymasz null.

W każdym razie musisz być w stanie poradzić sobie z sytuacją, w której nie ma dostępnych dostawców, więc musisz sprawdzić na null i powiedzieć użytkownikowi, że nie włączył żadnej lokalizacji.

+0

prawo Rozumiem, ale nawet gdy wyłączę GPS i przełączam telefon w tryb samolotowy, co oznaczałoby, że nie ma dostępu do sieci, nadal nie mam problemu, więc jak oni się czują? co jeszcze można wyłączyć? – tyczj

+1

Możesz wyłączyć ** lokalizację **, co oznacza, że ​​użytkownik nie zezwala aplikacji na uzyskanie swojej lokalizacji w jakikolwiek sposób. Ponadto będzie to specyficzna dla dostawcy. Byłem w stanie uzyskać 'null' na moim HTC Explorer. Może się różnić w przypadku różnych urządzeń. –

+5

dodać je do oczywistego Thushara

4

AndroidManifest.xml

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 

MapsActivity.java

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    if (permissions.length == 1 && 
      permissions[0] == android.Manifest.permission.ACCESS_FINE_LOCATION && 
      grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
     if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
      // TODO: Consider calling 
      // ActivityCompat#requestPermissions 
      // here to request the missing permissions, and then overriding 
      // public void onRequestPermissionsResult(int requestCode, String[] permissions, 
      //           int[] grantResults) 
      // to handle the case where the user grants the permission. See the documentation 
      // for ActivityCompat#requestPermissions for more details. 
      return; 
     } 
     mMap.setMyLocationEnabled(true); 
    } else { 
     // Permission was denied. Display an error message. 
    } 
} 

MapsActivity.java/onCreate()

if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) 
      == PackageManager.PERMISSION_GRANTED) { 
     mMap.setMyLocationEnabled(true); 
    } else { 
     ActivityCompat.requestPermissions(this,new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, 1); 
    } 

to dzieło dla mnie;

Powiązane problemy