2012-05-21 16 views
19

Tengo muchas personas que informan sobre un error que no puedo reproducir. Al intentar abrir un MapView, informa que el getBestProvider devuelve nulo y sé que eso significa que no se encuentra ningún proveedor que cumpla mis criterios, que es ACCURACY_COARSE, por lo que si no hay un GPS, debe recurrir a network or passive, pero obviamente no en esos dispositivos de usuario. ¿Qué significa eso entonces que el GPS está apagado y no hay conexión de red?GetBestProvider de LocationManager que devuelve nulo

Intenté apagar el GPS y poner el teléfono en modo avión para tratar de reproducir el problema, pero aún así pude abrir la vista de mapa sin una fuerza cercana, así que no sé cómo manejar este 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); 

error

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) 

Respuesta

14

En su llamada a getBestProvider() lo solicitado proveedores habilitados solamente (que es el segundo parámetro en la llamada al método que ha establecido a true). Si el usuario ha inhabilitado a todos los proveedores, obtendrá null.

En cualquier caso, debe ser capaz de manejar la situación en la que no hay proveedores disponibles, por lo que deberá verificar null y decirle al usuario que no ha habilitado ninguna ubicación.

+0

right Entiendo eso, pero incluso cuando desactivo el GPS y enciendo el teléfono en modo avión, lo que significaría que no tiene acceso a la red tampoco sigo sin tener ese problema, ¿cómo están? ¿Qué más se puede desactivar? – tyczj

+1

Puede desactivar ** location **, lo que significa que el usuario no permite que la aplicación obtenga su ubicación de ninguna manera. Además, esto va a ser algo específico del vendedor. Pude obtener 'null' en mi HTC Explorer. Puede ser diferente con diferentes dispositivos. –

+5

agregar estos al manifiesto 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); 
    } 

este trabajo para mí;

Cuestiones relacionadas