web-dev-qa-db-fra.com

Emulateur d'erreur de permission ACCESS_FINE_LOCATION uniquement

J'ai une erreur étrange lorsque j'utilise l'émulateur SEULEMENT ... J'ai trouvé une question qui a le même problème il y a 9 mois sans aucune réponse ...

J'utilise des emplacements de services Google Play pour obtenir des emplacements dans mon application et je suis sûr de mes autorisations manifestes et que tout fonctionne parfaitement sur mon téléphone. Le problème se produit lorsque j'utilise un émulateur uniquement. J'ai essayé différents émulateurs sur mon iMac et Machines Windows.

Je doute que les émulateurs ne supportent pas cette fonction de base!

voici mon code de manifeste:

<?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"/>

et voici où l'exception tire:

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

trace de la pile:

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)
23
Hassan Khallouf

Mon hypothèse est que vous utilisez ceci sur un émulateur Android 6.0+ et que vous avez une targetSdkVersion de 23 ou plus.

Dans ce cas, ACCESS_COARSE_LOCATION et ACCESS_FINE_LOCATION font partie de le système de permission d'exécution Android 6.0 . Révisez votre application pour participer à ce système ou déposez votre targetSdkVersion ci-dessous 23.

37
CommonsWare

dans Android 6.0 (niveau 23 de l'API), les utilisateurs accordent des autorisations aux applications pendant l'exécution de l'application, et non lors de l'installation.

Comment vérifier si vous avez la permission:

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

Comment demander les autorisations dont vous avez besoin:

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.
}

Comment accéder au résultat de la demande:

@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;
    }
}
}

Source: http://developer.Android.com/training/permissions/requesting.html

En savoir plus sur les autorisations: https://guides.codepath.com/Android/Understanding-App-Permissions

15
Fabich

Vous ne pouvez pas obtenir l'emplacement actuel de l'émulateur. Mais vous pouvez l'émuler pour tester votre code. Ici vous pouvez trouver comment émuler.

EDIT1: Il y a une note ici

Remarque: Si vous utilisez à la fois NETWORK_PROVIDER et GPS_PROVIDER, vous devez demander uniquement l'autorisation ACCESS_FINE_LOCATION, car elle inclut une autorisation pour les deux fournisseurs. (La permission pour ACCESS_COARSE_LOCATION inclut la permission uniquement pour NETWORK_PROVIDER.)

Vous devez utiliser uniquement l'autorisation ACCESS_FINE_LOCATION. Peut-être que cela aide.

4
kgnkbyl

Le problème était dû à une nouvelle fonctionnalité pour Android 6.0. espérons que son travail ... 

À partir d'Android 6.0 (API niveau 23), les utilisateurs accordent des autorisations aux applications pendant l'exécution de l'application, et non lors de son installation.

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

Pour contourner le problème lorsque l'autorisation n'est pas explicitement accordée, j'avais coché pour envelopper les appels de service de localisation (conformément à la documentation Google légèrement modifiée).

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 documentation Google explique également comment demander les autorisations nécessaires.

1
Mahendran Candy
<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION" />

dans certains cas, le fichier manifeste une ligne manquante accordant l’autorisation de ACCESS_FINE_LOCATION. vous devez donc le mentionner dans le manifeste.

Je l'ai fait et mon problème a été résolu.

Cela se produit généralement parce que nous avons donné l'autorisation dans le manifeste afin que l'application crée un problème car elle ne serait pas autorisée à accéder aux autorisations et le fichier se bloquerait.

<?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>

0
Reeya