LocationManager's getBestProvider devolver null

Tengo un montón de gente reportando un error que no puedo reproducir. Al intentar abrir un MapView está informando de que el getBestProvider está devolviendo nulo y sé que significa que no se encuentra ningún proveedor que cumple mis criterios que es ACCURACY_COARSE por lo que si no hay GPS, entonces debe caer en la network or passive pero que Obviamente no en esos dispositivos de usuario. ¿Qué significa eso que incluso significa que el GPS está apagado y no hay conexión de red?

Intenté desactivar el GPS y poner el teléfono en el modo avión para tratar de reproducir el problema, pero aún así fue capaz de abrir el mapa sin una fuerza de cierre por lo 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) 

En tu llamada a getBestProvider() has solicitado solo proveedores habilitados (ese es el segundo parámetro en la llamada al método que has establecido en true ). Si el usuario ha deshabilitado todos los proveedores, obtendrá null .

En cualquier caso, debe ser capaz de hacer frente a la situación en la que no hay proveedores disponibles, por lo que tendrá que comprobar si hay null y decirle al usuario que no ha habilitado ninguna ubicación.

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

  • ¿Cuál es la mejor manera de esperar a una corrección de ubicación GPS?
  • ¿Puede DataBinding interferir con la localización de una actividad?
  • Android getMaxAddressLineIndex devuelve 0 para la línea 1
  • Cómo obtener la ubicación actual latitud y longitud en android
  • Android: compruebe si los servicios de ubicación están habilitados utilizando el proveedor de ubicación fusionado
  • Permisos de tiempo de ejecución de Android en las versiones de android debajo de M?
  • Comparando dos ubicaciones usando sus longitudes y latitud
  • FINE_LOCATION tiene menos precisión que COARSE_LOCATION
  • Uso de GoogleApiClient + LocationServices sin actualizar
  • Administrador de ubicación quita el permiso de actualizaciones
  • ¿Hay ventajas de usar FusedLocationProviderApi sobre LocationManager?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.