update studio services manager last known fused example current android android-location

android - studio - El getBestProvider de LocationManager regresa nulo



location services android (2)

En su llamada a getBestProvider() ha solicitado proveedores habilitados (ese es el segundo parámetro en la llamada de método que ha configurado como true ). Si el usuario ha desactivado todos los proveedores, obtendrá null .

En cualquier caso, debe poder lidiar con la situación en la que no hay proveedores disponibles, por lo que deberá verificar si hay null y decirle al usuario que no ha habilitado ninguna ubicación.

Tengo un grupo de personas que reportan un error que no puedo reproducir. Al intentar abrir un MapView se informa que el getBestProvider está devolviendo nulo y sé que eso significa que no se encuentra ningún proveedor que cumpla con mi criterio, que es ACCURACY_COARSE por lo que si no hay un GPS, debería recurrir a la network or passive pero obviamente no en esos dispositivos de usuario. ¿Qué significaría eso entonces que el GPS está apagado y no hay conexión de red?

Intenté apagar el GPS y poner el teléfono en modo avión para intentar reproducir el problema, pero aún así pude abrir la vista del mapa sin un cierre forzado, 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)


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 mi