Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Permiso de comprobación de Android para LocationManager

Estoy intentando conseguir las coordenadas del GPS para exhibir cuando hago clic en un botón en mi disposición de la actividad. El siguiente es el método que se llama cuando hago clic en el botón:

public void getLocation(View view) { TextView tv = (TextView) findViewById(R.id.gps_coord_view); LocationManager lm = (LocationManager) getSystemService(LOCATION_SERVICE); Location loc = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER); tv.setText("Latitude: " + loc.getLatitude() + "\nLongitude: " + loc.getLongitude()); } 

Estoy recibiendo un error que dice

La llamada requiere permiso que puede ser rechazado por el usuario. El código debe comprobar explícitamente si el permiso está disponible.

Ya he concedido estos permisos en mi AndroidManifest . El error se ha cuidado y la aplicación se compila cuando agrego lo siguiente antes de llamar a lm.getLastKnownLocation :

 if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { return; } 

Sin embargo, la aplicación se bloquea cuando presiono el botón que llama a getLocation cuando se hace clic. ¿Qué está pasando? ¿Hay manera mejor / más simple de agarrar las coordenadas del GPS del dispositivo?

  • Obtener el nombre de ubicación actual del usuario sin necesidad de utilizar gps o Internet, sino mediante Network_Provider en android
  • LocationManager.isProviderEnabled (LocationManager.NETWORK_PROVIDER) no es fiable, ¿por qué?
  • La llamada requiere permisos que pueden ser rechazados por el usuario.
  • Obtenga la ubicación (coordenadas) periódicamente sin aumentar drásticamente el consumo de la batería
  • ¿Existe una alternativa al Cliente de ubicación (API de Google Play)?
  • OnLocationChanged no se llama automáticamente
  • ¿Por qué no se llama al método onProviderEnabled () de Android?
  • LocationListener de NETWORK_PROVIDER está habilitado pero, onLocationChanged nunca se llama
  • 4 Solutions collect form web for “Permiso de comprobación de Android para LocationManager”

    Con el nivel de API de Android (23), debemos comprobar si hay permisos. https://developer.android.com/training/permissions/requesting.html

    Tuve el mismo problema, pero lo siguiente funcionó para mí y puedo recuperar datos de ubicación con éxito:

    (1) Asegúrese de que tiene sus permisos enumerados en el Manifiesto:

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

    (2) Asegúrese de solicitar permisos del usuario:

     if ( ContextCompat.checkSelfPermission( this, android.Manifest.permission.ACCESS_COARSE_LOCATION ) != PackageManager.PERMISSION_GRANTED ) { ActivityCompat.requestPermissions( this, new String[] { android.Manifest.permission.ACCESS_COARSE_LOCATION }, LocationService.MY_PERMISSION_ACCESS_COURSE_LOCATION ); } 

    (3) Asegúrese de utilizar ContextCompat, ya que esto tiene compatibilidad con los antiguos niveles de la API.

    (4) En su servicio de ubicación o clase que inicializa su LocationManager y obtiene la última ubicación conocida, necesitamos comprobar los permisos:

     if ( Build.VERSION.SDK_INT >= 23 && ContextCompat.checkSelfPermission( context, android.Manifest.permission.ACCESS_FINE_LOCATION ) != PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission( context, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { return ; } 

    (5) Este enfoque sólo funcionó para mí después de haber incluido @ TargetApi (23) en la parte superior de mi método initLocationService.

    (6) También he añadido esto a mi compilación gradle:

     compile 'com.android.support:support-v4:23.0.1' 

    Aquí está mi LocationService para referencia:

     public class LocationService implements LocationListener { //The minimum distance to change updates in meters private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 0; // 10 meters //The minimum time beetwen updates in milliseconds private static final long MIN_TIME_BW_UPDATES = 0;//1000 * 60 * 1; // 1 minute private final static boolean forceNetwork = false; private static LocationService instance = null; private LocationManager locationManager; public Location location; public double longitude; public double latitude; /** * Singleton implementation * @return */ public static LocationService getLocationManager(Context context) { if (instance == null) { instance = new LocationService(context); } return instance; } /** * Local constructor */ private LocationService( Context context ) { initLocationService(context); LogService.log("LocationService created"); } /** * Sets up location service after permissions is granted */ @TargetApi(23) private void initLocationService(Context context) { if ( Build.VERSION.SDK_INT >= 23 && ContextCompat.checkSelfPermission( context, android.Manifest.permission.ACCESS_FINE_LOCATION ) != PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission( context, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { return ; } try { this.longitude = 0.0; this.latitude = 0.0; this.locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); // Get GPS and network status this.isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); this.isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); if (forceNetwork) isGPSEnabled = false; if (!isNetworkEnabled && !isGPSEnabled) { // cannot get location this.locationServiceAvailable = false; } //else { this.locationServiceAvailable = true; if (isNetworkEnabled) { locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this); if (locationManager != null) { location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); updateCoordinates(); } }//end if if (isGPSEnabled) { locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this); if (locationManager != null) { location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); updateCoordinates(); } } } } catch (Exception ex) { LogService.log( "Error creating location service: " + ex.getMessage() ); } } @Override public void onLocationChanged(Location location) { // do stuff here with location object } } 

    He probado con un dispositivo Android Lollipop hasta ahora sólo. Espero que esto funcione para usted.

    SIMPLE SOLUCIÓN

    Quería soportar aplicaciones pre api 23 y en lugar de usar checkSelfPermission he utilizado un try / catch

     try { location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); } catch (SecurityException e) { dialogGPS(this.getContext()); // lets the user know there is a problem with the gps } 

    La última parte del mensaje de error que citó estados: ...with ("checkPermission") or explicitly handle a potential "SecurityException"

    Una forma mucho más rápida y sencilla de comprobar si tienes permisos es rodear tu código con try { ... } catch (SecurityException e) { [insert error handling code here] } . Si tiene permisos, la parte 'try' se ejecutará, si no lo hace, la parte 'catch' lo hará.

    Si está trabajando en permisos dinámicos y cualquier permiso como ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION que da error "no puede resolver el método PERMISSION_NAME" en este caso escriba el código con el nombre de permiso y luego reconstruya su proyecto esto regenerará el archivo de manifiesto (Manifest.permission).

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