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>