2012-05-21 10 views
19

Ho un sacco di persone che riportano un errore che non riesco a riprodurre. Quando si tenta di aprire un MapView si sta segnalando che il getBestProvider restituisce null e so che significa che nessun provider viene trovato che soddisfa i miei criteri che è ACCURACY_COARSE quindi se non c'è il GPS allora dovrebbe ricadere su network or passive ma ovviamente non lo fa su quei dispositivi utente. Cosa significherebbe, allora, che il GPS sia spento e che non ci sia una connessione di rete?Il getBestProvider di LocationManager restituisce null

Ho provato a spegnere il GPS ea mettere il telefono in modalità aereo per provare a riprodurre il problema, ma sono riuscito comunque ad aprire la mappa senza chiudere la forza, quindi non so come gestire questo problema.

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

errore

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) 

risposta

14

nella chiamata a getBestProvider() che hai chiesto fornitori abilitati solo (che è il secondo parametro nella chiamata metodo che è stato impostato per true). Se l'utente ha disabilitato tutti i provider, riceverai null.

In ogni caso, è necessario essere in grado di gestire la situazione in cui non ci sono provider disponibili, quindi è necessario verificare per null e dire all'utente che non ha abilitato alcuna posizione.

+0

giusto capisco che ma anche quando disattivo il GPS e trasformo il telefono in modalità aereo che significherebbe che non ha accesso alla rete o non riesco ancora a ottenere quel problema quindi come sono? cos'altro può essere disabilitato? – tyczj

+1

È possibile disabilitare ** posizione **, il che significa che l'utente non consente all'applicazione di ottenere la propria posizione con qualsiasi mezzo. Inoltre, questa sarà una cosa specifica del venditore. Sono stato in grado di ottenere "null" sul mio HTC Explorer. Potrebbe essere diverso con diversi dispositivi. –

+5

aggiungere questi per il manifesto 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); 
    } 

questo lavoro per me;