El proveedor de ubicación "gps" requiere el permiso ACCESS_FINE_LOCATION para android 6.0

En el archivo de manifiesto de Android he añadido los siguientes permisos para que los gps accedan a la ubicación

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

Estoy actualizando las actualizaciones de ubicación como se indica a continuación usando la clase Administrador de ubicaciones

  private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute locationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this ); 

Pero la línea anterior está dando una excepción

 "gps" location provider requires ACCESS_FINE_LOCATION permission 

Esta cosa sólo ocurre con la targetSDKVersion 23 (es decir, con Android 6.0) y también he probado en android 5.1 que funciona bien.

¡Gracias por favor !. Gracias por adelantado.

Desde 6.0 algunos permisos se consideran como "peligroso" (FINE_LOCATION es uno de ellos).

Para proteger al usuario, tienen que ser autorizados en tiempo de ejecución, para que el usuario sepa si está relacionado con su acción.

Para hacer esto :

  ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1); 

Se mostrará un DialogBox en el que el usuario elegirá si autoriza su aplicación a utilizar la ubicación o no.

A continuación, obtenga la respuesta del usuario mediante esta función:

 public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case 1: { // If request is cancelled, the result arrays are empty. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { } else { // permission denied, boo! Disable the // functionality that depends on this permission. } return; } // other 'case' lines to check for other // permissions this app might request } } 

Si el usuario lo acepta una vez, su aplicación lo recordará y no necesitará enviar más este DialogBox. Tenga en cuenta que el usuario podría desactivarlo más tarde si decidiera. Entonces, antes de solicitar la ubicación, tendría que probar si el permiso todavía se concede:

 public boolean checkLocationPermission() { String permission = "android.permission.ACCESS_FINE_LOCATION"; int res = this.checkCallingOrSelfPermission(permission); return (res == PackageManager.PERMISSION_GRANTED); } 

Todo se explica en la documentación de Android: http://developer.android.com/training/permissions/requesting.html

Prueba este código

 private void marshmallowGPSPremissionCheck() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && getActivity().checkSelfPermission( Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED && getActivity().checkSelfPermission( Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { requestPermissions( new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}, MY_PERMISSION_LOCATION); } else { // gps functions. } } 

Agregue esto también ………………

 @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { if (requestCode == MY_PERMISSION_LOCATION && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // gps functionality } } 

Tenemos algunos cambios en los permisos de android desde la versión 6. Tienes que aceptar los permisos a tiempo de usarlos, no al instalar la aplicación. Si utiliza buildtools versión 23 algunos problemas pueden ocurrir. Compruebe este enlace para entender. Accede a la configuración del dispositivo> aplicaciones y selecciona tu aplicación, acepta los permisos manualmente y comprueba si se soluciona el problema.

He experimentado este problema recientemente también. En Android 6.0 necesitas solicitar explícitamente los permisos que necesitas cuando los uses en la aplicación. Si no lo hace, se denegará automáticamente el permiso de ubicación.

  // Here, thisActivity is the current activity if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { // Should we show an explanation? if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, Manifest.permission.ACCESS_FINE_LOCATION)) { // Show an expanation to the user *asynchronously* -- don't block // this thread waiting for the user's response! After the user // sees the explanation, try again to request the permission. } else { // No explanation needed, we can request the permission. ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, MY_PERMISSIONS_REQUEST_FINE_LOCATION); // MY_PERMISSIONS_REQUEST_FINE_LOCATION is an // app-defined int constant. The callback method gets the // result of the request. } } 

Más información aquí: http://developer.android.com/training/permissions/requesting.html

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.