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

  • Establecer los dígitos EditText mediante programación
  • Excepción con la deserialización del marco XML simple
  • KeyStore y Alias ​​clave
  • Tipo El contenedor 'Android Dependencies' hace referencia a una biblioteca no existente android-support-v7-appcompat / bin / android-support-v7-appcompat.jar
  • Cómo instanciar la clase de fragmento usando el nombre de la clase en lugar del índice
  • ArrayAdapter.NotifyDataSetChanged () no funciona?
  • 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?

  • ListView getChildAt devolver null para los niños visibles
  • Problema de webview.loadUrl ("about: blank")
  • Android: inserta texto en EditText en la posición actual
  • Cómo buscar archivos en el teléfono sdcard o donde
  • ¿Cómo puedo integrar Paytm wallet en una aplicación de Android?
  • IllegalStateException que llama a MediaPlayer.reset ()
  • 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.