studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones android android-emulator geolocation

para - manual de programacion android pdf



ACCESS_FINE_LOCATION solo emulador de error (5)

Estoy teniendo un error extraño al utilizar el emulador SOLAMENTE. Encontré una pregunta que tiene el mismo problema hace 9 meses sin respuestas ...

Estoy usando las ubicaciones de los servicios de Google Play para obtener ubicaciones en mi aplicación y estoy seguro de mis permisos de manifiesto y todo funciona perfectamente en mi teléfono. El problema ocurre cuando solo uso un emulador. Las máquinas de Windows.

¡Dudo que los emuladores no soporten esta función básica!

Aquí está mi código manifiesto:

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.orderme.ordermeandroid" > <uses-permission android:name="android.permission.INTERNET"></uses-permission> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

y aquí es donde se dispara la excepción:

LocationRequest mLocationRequest = new LocationRequest(); mLocationRequest.setInterval(10000); mLocationRequest.setFastestInterval(5000); mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient,mLocationRequest,this);

traza de pila

08-26 14:01:19.699 10157-10157/com.orderme.ordermeandroid E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: com.orderme.ordermeandroid, PID: 10157 java.lang.SecurityException: Client must have ACCESS_FINE_LOCATION permission to request PRIORITY_HIGH_ACCURACY locations. at android.os.Parcel.readException(Parcel.java:1599) at android.os.Parcel.readException(Parcel.java:1552) at com.google.android.gms.location.internal.zzg$zza$zza.zza(Unknown Source) at com.google.android.gms.location.internal.zzi.zza(Unknown Source) at com.google.android.gms.location.internal.zzj.zza(Unknown Source) at com.google.android.gms.location.internal.zzd$1.zza(Unknown Source) at com.google.android.gms.location.internal.zzd$1.zza(Unknown Source) at com.google.android.gms.common.api.zzc$zza.zzb(Unknown Source) at com.google.android.gms.common.api.zzf.zza(Unknown Source) at com.google.android.gms.common.api.zzf.zzb(Unknown Source) at com.google.android.gms.common.api.zzi.zzb(Unknown Source) at com.google.android.gms.location.internal.zzd.requestLocationUpdates(Unknown Source) at com.orderme.ordermeandroid.Main.MainActivity.onConnected(MainActivity.java:184) at com.google.android.gms.common.internal.zzk.zzh(Unknown Source) at com.google.android.gms.common.api.zzg.zznt(Unknown Source) at com.google.android.gms.common.api.zzg.onConnected(Unknown Source) at com.google.android.gms.common.api.zzi$2.onConnected(Unknown Source) at com.google.android.gms.common.internal.zzj$zzg.zzoD(Unknown Source) at com.google.android.gms.common.internal.zzj$zza.zzc(Unknown Source) at com.google.android.gms.common.internal.zzj$zza.zzs(Unknown Source) at com.google.android.gms.common.internal.zzj$zzc.zzoF(Unknown Source) at com.google.android.gms.common.internal.zzj$zzb.handleMessage(Unknown Source) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)


El problema fue causado por una nueva característica para Android 6.0. espero su trabajo ...

A partir de Android 6.0 (nivel de API 23), los usuarios otorgan permisos a las aplicaciones mientras la aplicación se está ejecutando, no cuando la instalan.

http://developer.android.com/training/permissions/requesting.html

Para solucionar el problema cuando el permiso no se otorga explícitamente, hice una verificación para ajustar las llamadas de servicio de ubicación (según la documentación de Google, ligeramente modificada).

int permissionCheck = ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION); if (permissionCheck == PackageManager.PERMISSION_GRANTED) { //Execute location service call if user has explicitly granted ACCESS_FINE_LOCATION.. }

La documentación de Google también explica cómo solicitar los permisos necesarios.


No se puede obtener la ubicación actual del emulador. Pero puedes emularlo para probar tu código. Here puedes encontrar como emular.

EDIT1: hay una nota here

Nota: si está utilizando NETWORK_PROVIDER y GPS_PROVIDER, debe solicitar solo el permiso ACCESS_FINE_LOCATION, ya que incluye el permiso de ambos proveedores. (El permiso para ACCESS_COARSE_LOCATION incluye el permiso solo para NETWORK_PROVIDER).

Debes usar solo el permiso ACCESS_FINE_LOCATION. Tal vez esto ayude.


Supongo que estás ejecutando esto en un emulador de Android 6.0+ y tienes una targetSdkVersion de 23 o superior.

En ese caso, ACCESS_COARSE_LOCATION y ACCESS_FINE_LOCATION son parte del sistema de permisos de tiempo de ejecución de Android 6.0 . Revise su aplicación para participar en este sistema, o deje caer su targetSdkVersion debajo de 23.


en Android 6.0 (nivel de API 23), los usuarios otorgan permisos a las aplicaciones mientras la aplicación se está ejecutando, no cuando la instalan

Cómo comprobar si tiene el permiso:

// Assume thisActivity is the current activity int permissionCheck = ContextCompat.checkSelfPermission(thisActivity, android.Manifest.permission.ACCESS_FINE_LOCATION);

Cómo solicitar los permisos que necesita:

if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION); // MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION is an // app-defined int constant. The callback method gets the // result of the request. }

Cómo acceder al resultado de la solicitud:

@Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION: { // If request is cancelled, the result arrays are empty. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // permission was granted, yay! Do the task you need to do. } else { // permission denied, boo! Disable the functionality that depends on this permission. } return; } } }

Fuente: http://developer.android.com/training/permissions/requesting.html

Obtenga más información sobre los permisos: https://guides.codepath.com/android/Understanding-App-Permissions


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

algunas veces, el manifiesto tiene una línea faltante que otorga el permiso de ACCESS_FINE_LOCATION. por lo que hay que mencionarlo en el manifiesto.

Hice esto y mi problema se resolvió.

Esto generalmente ocurre porque hemos otorgado el permiso en el manifiesto, por lo que la aplicación crearía un problema, ya que no se le permitiría acceder a los permisos y el archivo se bloquearía.

<?xml version="1.0" encoding="utf-8"?> <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:supportsRtl="true" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application>