Problemas de permiso para la ubicación en android Marshmallow applicaton
Estoy aprendiendo a desarrollar una aplicación de Android para obtener la ubicación del dispositivo siguiente foro de desarrolladores de Google: @ http://developer.android.com/training/location/retrieve-current.html#last-known @ http://developer.android. com / training / location / receive-location-updates.html
El ejemplo muestra cómo usar Google PLay Services para este propósito. Pero la función getLastLocation()
devuelve siempre null.
- Cómo obtener el nombre de la ciudad por latitud y longitud en android?
- No se puede obtener la ubicación en Genymotion VM
- Android Advertencia: JAR no existe o no contiene recursos
- Obtener el nombre de ubicación actual del usuario sin necesidad de utilizar gps o Internet, sino mediante Network_Provider en android
- Más de un proveedor de ubicación al mismo tiempo
Ubicación location = LocationServices.FusedLocationApi.getLastLocation (mGoogleApiClient);
Como inicialmente la ubicación podría ser nula, agregué las siguientes líneas para recibir actualizaciones de ubicación periódicas
LocationServices.FusedLocationApi.requestLocationUpdates (mGoogleApiClient, mLocationRequest, this);
que lanza una excepción con el siguiente mensaje
El cliente debe tener permiso ACCESS_COARSE_LOCATION o ACCESS_FINE_LOCATION para realizar cualquier operación de ubicación
Ya he añadido los permisos en el archivo de manifiesto:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
He abierto Google Maps para actualizar la ubicación actual en Google Play Service, pero el mismo problema persiste. Soy novato en el desarrollo de Android, y antes de publicar esta pregunta ya he buscado mucho, pero no encontré ninguna solución que funcione para mí. Lo estoy probando en el dispositivo Android Marshmallow
, desarrollando Android Studio 1.3.2
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="newray.acpsa1"> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme"> <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="@string/google_maps_key" /> <activity android:name=".MapsActivity" android:label="@string/title_activity_maps"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
onCreate función en la actividad
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .build(); mGoogleApiClient.connect(); mLocationRequest = LocationRequest.create() .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) .setInterval(10 * 1000) .setFastestInterval(1 * 1000); /* Rest functionality */ }
onConnected función
@Override public void onConnected(Bundle bundle) { try{ Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); LatLng loc = new LatLng(21.356993, 72.826647); if (location == null) { Log.d(TAG,"location is again null"); LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); Log.d(TAG, "Requested for updates"); } else { loc = new LatLng(location.getLatitude(),location.getLongitude()); handleNewLocation(location); } } catch (Exception e) { Log.d(TAG, "Error in onConnected. "+e.getMessage()); } }
Registros:
XXXX: Error in onConnected. Client must have ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission to perform any location operations.
dependencias en archivo build.gradle:
dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:23.1.0' compile 'com.google.android.gms:play-services:8.1.0' compile 'com.google.android.gms:play-services-location:8.1.0' }
- Número GPS de satélites y filtrado de ubicaciones
- Cómo obtener el nombre de satélite o el número cuando estamos recibiendo la ubicación a través de GPS en Android?
- Android: cómo arreglar gps con simulacros (falso) de coordenadas?
- Alternativa a FusedLocationProviderApi
- Android gps proveedor y gps icono
- Cómo quitar un LocationListener de LocationManager que se agrega dos veces en android?
- Se pierde el proveedor de Android Fused Location
- Android GeoCoder devuelve sólo 1 resultado
En Marshmallow hay muchas cosas nuevas en android SDK. Pedir el permiso es una de las nuevas actualizaciones que cada desarrollador debe tener en cuenta. Lo mismo sucede contigo. si su aplicación de destino versión 23, entonces probablemente debería tener que tomar la concesión del usuario antes de empezar a utilizarlo. Sólo se puede utilizar si el usuario permite a access.Therefor desarrollador necesidad de cuidar todo el caso de prueba, mientras que el permiso del usuario en la aplicación
Por ejemplo, su aplicación necesita el acceso de la ubicación. En la versión anterior de Android en el momento de instalarlo era mostrar el diálogo de permiso y se les concedió el permiso definido en su archivo de manifiesto a la aplicación. Estas cosas se transformaron en la melcocha. Ahora cada aplicación debe tener que tomar el permiso del usuario para acceder al mismo.
Consulte los sitios de desarrolladores y conozca los pasos básicos para guiar al usuario en la aplicación para solicitar el runtime permission
en la aplicación.
Hay un montón de sitios que muestran su tutorial básico acerca de cómo pedir el permiso en Marshmallow. pocos pueden sugerir lo siguiente
Construcción de una mejor aplicación con permiso de ejecución
Guía de diseño de permisos
Este enlace le guía la información básica de cómo guiar al usuario en la aplicación antes de solicitar el permiso.
Gracias.
Solución directa / ejemplo para su pregunta:
package com.my.packagename; import android.Manifest; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.content.pm.PackageManager; import android.os.Bundle; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.widget.Toast; public class MainActivity extends AppCompatActivity { private static final int PERMISSION_REQUEST_CODE_LOCATION = 1; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (checkPermission(Manifest.permission.ACCESS_FINE_LOCATION,getApplicationContext(),CopyOfMap.this)) { fetchLocationData(); } else { requestPermission(Manifest.permission.ACCESS_FINE_LOCATION,PERMISSION_REQUEST_CODE_LOCATION,getApplicationContext(),CopyOfMap.this); } } public static void requestPermission(String strPermission,int perCode,Context _c,Activity _a){ if (ActivityCompat.shouldShowRequestPermissionRationale(_a,strPermission)){ Toast.makeText(getApplicationContext(),"GPS permission allows us to access location data. Please allow in App Settings for additional functionality.",Toast.LENGTH_LONG).show(); } else { ActivityCompat.requestPermissions(_a,new String[]{strPermission},perCode); } } public static boolean checkPermission(String strPermission,Context _c,Activity _a){ int result = ContextCompat.checkSelfPermission(_c, strPermission); if (result == PackageManager.PERMISSION_GRANTED){ return true; } else { return false; } } @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case PERMISSION_REQUEST_CODE_LOCATION: if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { fetchLocationData(); } else { Toast.makeText(getApplicationContext(),"Permission Denied, You cannot access location data.",Toast.LENGTH_LONG).show(); } break; } } private void fetchLocationData() { //code to use the granted permission (location) } }
Aquí he hecho el requestPermission () y el método checkPermission () como estático público porque puedo reutilizarlos para otras solicitudes de permisos como llamadas telefónicas, almacenamiento de escritura y otros. Espero que esto ayude a alguien. Todos los derechos reservados
- Cómo crear un retraso en el botón de clic con las pruebas de Esspresso
- Desarrollo de juegos Android 2D sin motor