web-dev-qa-db-fra.com

Quand ai-je besoin d'Android.hardware.location.gps et d'Android.hardware.location.network?

Google informe par e-mail des modifications apportées aux autorisations de localisation Android:

Nous apportons une modification le 15 octobre 2016 qui affectera les applications ciblant l'API version 21 (Android 5.0, Lollipop) ou une version ultérieure qui utilisent ACCESS_FINE_LOCATION mais qui n'ont pas explicitement la fonctionnalité d'utilisation "Android.hardware.location.gps". À l'avenir, ces applications seront disponibles pour être installées sur des appareils sans matériel GPS. Dans la plupart des cas, ce ne sera pas un problème car l'emplacement basé sur Wi-Fi et Cell-ID offre une fidélité suffisamment élevée pour le fonctionnement typique de ces applications. Cependant, toutes les applications qui nécessitent du matériel GPS, telles que les navigateurs GPS, doivent explicitement ajouter la fonctionnalité d'utilisation "Android.hardware.location.gps" à leur manifeste.

Si votre application nécessite le GPS pour fonctionner correctement et que vous ne l'incluez pas dans votre déclaration manifeste, vos utilisateurs peuvent avoir une mauvaise expérience de l'application.

En outre, si vous utilisez le fournisseur de localisation fusionné et que vous souhaitez recevoir les échantillons de localisation les plus précis du GPS (c'est-à-dire avec PRIORITY_HIGH_ACCURACY), vous devez inclure la fonctionnalité "Android.hardware.location.gps" dans le manifeste de votre application pour garantir que Google Play ne distribue votre application qu'aux appareils dotés de capteurs GPS.

Vous pouvez en savoir plus sur cette modification dans le Centre d'aide aux développeurs Android .

Depuis le Centre d'aide pour les développeurs Android

Afin de recevoir des mises à jour de position de NETWORK_PROVIDER ou GPS_PROVIDER, vous devez demander l'autorisation de l'utilisateur en déclarant respectivement l'autorisation ACCESS_COARSE_LOCATION ou ACCESS_FINE_LOCATION dans votre fichier de manifeste Android Android. Sans ces autorisations, votre application échoue lors de l'exécution lors de la demande de mises à jour d'emplacement.

Si vous utilisez à la fois NETWORK_PROVIDER et GPS_PROVIDER, vous devez demander uniquement l'autorisation ACCESS_FINE_LOCATION, car elle inclut l'autorisation pour les deux fournisseurs. L'autorisation pour ACCESS_COARSE_LOCATION autorise uniquement l'accès à NETWORK_PROVIDER.

Attention: Si votre application cible Android 5.0 (API niveau 21) ou supérieur, vous devez déclarer que votre application utilise la fonctionnalité matérielle Android.hardware.location.network ou Android.hardware.location.gps dans le fichier manifeste, selon que votre application reçoit des mises à jour d'emplacement de NETWORK_PROVIDER ou de GPS_PROVIDER. Si votre application reçoit des informations d'emplacement de l'une de ces sources de fournisseur d'emplacement, vous devez déclarer que l'application utilise ces fonctionnalités matérielles dans votre manifeste d'application. les appareils exécutant des versions antérieures à Android 5.0 (API 21), demandant l'autorisation ACCESS_FINE_LOCATION ou ACCESS_COARSE_LOCATION incluent une demande implicite de fonctionnalités matérielles de localisation. Cependant, la demande de ces autorisations ne demande pas automatiquement les fonctionnalités matérielles de localisation sur = Android 5.0 (API niveau 21) et supérieur.

J'utilise le fournisseur de localisation fusionné, je cible l'API 21 et j'utilise ACCESS_FINE_LOCATION. Je ne me soucie pas spécifiquement de savoir si le GPS est disponible, mais seulement que l'emplacement le plus précis est signalé.

  • Sur la base de la première citation, je pense que je n'ai pas à apporter de modifications.
  • Sur la base de la deuxième citation, je pense que j'ai besoin des deux Android.hardware.location.gps et Android.hardware.location.network. Ou est-ce uniquement pour LocationManager et non l'emplacement fusionné?

Ai-je besoin Android.hardware.location.gps et Android.hardware.location.network ou pas?

31
mattm

La deuxième citation vous indique que vous avez besoin de Android.hardware.location.network ou Android.hardware.location.gps, si vous avez spécifiquement besoin de l'un ou l'autre fournisseur de localisation.

Si vous souhaitez des mises à jour via GPS, vous avez besoin de Android.hardware.location.gps. Si vous souhaitez des mises à jour via les réseaux WiFi et cellulaires, vous avez besoin de Android.hardware.location.network.

Si vous souhaitez des mises à jour à la fois du réseau et du GPS, vous devez inclure à la fois <uses-feature> éléments.

Si vous ne spécifiez pas non plus, votre appareil peut être installé sur des appareils sans ce fournisseur. Par exemple, il peut être installé sur un appareil sans GPS, réseau cellulaire ou puce Wi-Fi.

En d'autres termes, l'obtention de la position nécessite soit la fonction de localisation réseau, soit la fonction GPS. Si vous ne déclarez pas que votre application a besoin de l'un ou de l'autre, vous ne recevrez peut-être pas du tout les mises à jour de localisation.

API 21 vs 20 et moins

Notez que ce qui précède n'est vrai que pour l'API 21 et les versions ultérieures. Avant API 21, demandant le ACCESS_COARSE_LOCATION l'autorisation impliquait le location.network fonctionnalité, où demande ACCESS_FINE_LOCATION impliquait le location.gps fonction (voir <uses-feature> ).

Le seul changement à l'heure actuelle est que, pour l'API 21+, toute application demandant ACCESS_FINE_LOCATION sera bientôt disponible pour une installation sur des appareils sans GPS. Si votre application supposait précédemment que le GPS était disponible (et a besoin du GPS), vous devez vous assurer d'avoir la demande explicite de Android.hardware.location.gps.

Google dit que les fournisseurs de localisation réseau sont maintenant assez bons pour un emplacement fin, donc le changement.

18
Tanis.7x

TL; DR : Non, vous n'avez pas besoin d'ajouter uses-feature à votre manifeste, mais selon vous, vous pourriez.

réponse complète :

uses-feature du manifeste sert uniquement à ce que Google Play puisse filtrer les appareils qui ne contiennent pas de fonctionnalité nécessaire au bon fonctionnement de l'application. (Les exemples sont le GPS pour une application de navigation détaillée ou la caméra pour une application de caméra).

Lisez attentivement cette citation:

toutes les applications qui nécessitent du matériel GPS, telles que les navigateurs GPS, doivent explicitement ajouter la fonctionnalité d'utilisation "Android.hardware.location.gps" à leur manifeste

(...)

et souhaitez recevoir les échantillons de localisation les plus précis du GPS

Comme vous le mentionnez, vous vous souciez seulement que le FusedLocationProvider vous donne le meilleur emplacement disponible pour le périphérique est installé. Cela signifie, même si vous demandez PRIORITY_HIGH_ACCURACY, votre application peut être installée sur des appareils qui ne contiennent pas de GPS et n'obtiendra jamais un emplacement aussi précis qu'un GPS, ou peut-être même (dans certains cas très rares), être installée sur un appareil qui ne contient aucun fournisseur de localisation .

modifier:

Sur la base de la deuxième citation, je pense que j'ai besoin à la fois d'Android.hardware.location.gps et d'Android.hardware.location.network. Ou est-ce uniquement pour LocationManager et non pour l'emplacement fusionné?

Je viens de creuser sur les documents https://developer.Android.com/guide/topics/manifest/uses-feature-element.html#hw-features et je l'ai trouvé très intéressant, il y a 3 possibilités:

  • Android.hardware.location
  • Android.hardware.location.gps
  • Android.hardware.location.network

donc sur la base de cela, si votre application ne peut pas fonctionner sans aucune forme d'emplacement, vous devez utiliser le premier Android.hardware.location, sinon, si votre application utilise la localisation mais n'est pas essentielle à sa fonctionnalité, vous pouvez être libre de ne rien inclure

11
Budius

Solution simple et rapide:

L'application doit être mise à jour via GPS et utiliser Android.hardware.location.gps. Si vous souhaitez des mises à jour via les réseaux WiFi et cellulaires, vous avez besoin d'Android.hardware.location.network.

Ajoutez des lignes ci-dessous à votre fichier de manifestes en fonction de vos besoins en données de localisation:

<uses-feature Android:name="Android.hardware.location" Android:required="false" />
<uses-feature Android:name="Android.hardware.location.gps" Android:required="false" />

J'espère que cela t'aides..

8
Jatin

D'après ma compréhension, il suffit de lire la documentation de l'élément ses-feature pour comprendre comment les applications sont filtrées dans Google Play en fonction des entrées implicites et explicites des fonctionnalités:

Google Play filtre les applications visibles par les utilisateurs, afin que les utilisateurs puissent voir et télécharger uniquement les applications compatibles avec leurs appareils. L'une des façons dont il filtre les applications est la compatibilité des fonctionnalités.

Pour déterminer la compatibilité des fonctionnalités d'une application avec l'appareil d'un utilisateur donné, Google Play compare:

Fonctionnalités requises par l'application - une application déclare les fonctionnalités des éléments de son manifeste avec ... Fonctionnalités disponibles sur le périphérique, en matériel ou en logiciel - un périphérique signale les fonctionnalités qu'il prend en charge en tant que propriétés système en lecture seule.

...

Si une fonctionnalité est explicitement déclarée comme étant requise, Google Play ajoute la fonctionnalité à la liste des fonctionnalités requises pour l'application. Il filtre ensuite l'application des utilisateurs sur les appareils qui ne fournissent pas cette fonctionnalité.

Si une fonctionnalité est explicitement déclarée non requise, Google Play n'ajoute pas la fonctionnalité à la liste des fonctionnalités requises. Pour cette raison, une fonctionnalité non requise explicitement déclarée n'est jamais prise en compte lors du filtrage de l'application. Même si l'appareil ne fournit pas la fonctionnalité déclarée, Google Play considérera toujours l'application compatible avec l'appareil et la montrera à l'utilisateur, sauf si d'autres règles de filtrage s'appliquent.


Les éléments implicites uses-feature Pour les autorisations de localisation sont:

ACCESS_COARSE_LOCATION

  • Android.hardware.location
  • Android.hardware.location.network (Uniquement lorsque le niveau d'API cible est inférieur ou égal à 20.)

ACCESS_FINE_LOCATION

  • Android.hardware.location
  • Android.hardware.location.gps (Uniquement lorsque le niveau d'API cible est inférieur ou égal à 20.)

Le changement décrit dans l'e-mail de Google est que les éléments implicites uses-feature Pour Android.hardware.location.gps Ne seront pas présents dans l'API 21+ avec ACCESS_FINE_LOCATION. La situation analogue semble être vraie pour ACCESS_COARSE_LOCATION Et Android.hardware.location.network.

Google encourage l'énumération explicite de toutes les entrées uses-feature, Mais fournit toujours des entrées implicites basées sur les autorisations. D'après l'extrait de documentation suivant, je pense qu'il n'y a pas de différence entre omettre un uses-feature Et le déclarer non requis, sauf s'il existe une entrée implicite uses-feature.

Si une fonctionnalité est explicitement déclarée non requise, Google Play n'ajoute pas la fonctionnalité à la liste des fonctionnalités requises.


Le cas d'utilisation de votre application détermine quelles entrées uses-feature Doivent être présentes. Voici quelques exemples d'utilisation, toutes les entrées uses-feature Étant obligatoires, sauf indication contraire:

  1. L'application utilise explicitement le GPS à partir de LocationManager ou l'application a besoin de la haute précision du GPS. C'est l'exemple donné dans l'e-mail de Google.

    • ACCESS_FINE_LOCATION
    • Android.hardware.location (Implicite)
    • Android.hardware.location.gps (Implicite jusqu'à API 20)
  2. Utilise explicitement l'emplacement du réseau

    • ACCESS_COARSE_LOCATION
    • Android.hardware.location (Implicite)
    • Android.hardware.location.network (Implicite jusqu'à API 20)
  3. Utilise à la fois le GPS et le réseau

    • ACCESS_FINE_LOCATION
    • Android.hardware.location (Implicite)
    • Android.hardware.location.gps (Implicite jusqu'à API 20)
    • Android.hardware.location.network
  4. Utilise au moins un GPS et un réseau. Ceci est mon cas FusedLocationProviderApi dans la question d'origine.

    • ACCESS_FINE_LOCATION/ACCESS_COARSE_LOCATION
    • Android.hardware.location (Implicite)
  5. Utilise l'emplacement si disponible, permet toujours l'installation de l'application s'il n'est pas disponible

    • ACCESS_FINE_LOCATION
    • Android.hardware.location Required = false (remplacement implicite)
    • Android.hardware.location.gps Required = false (remplacement implicite jusqu'à API 20)
2
mattm

Sur votre premier point:

Sur la base de la première citation, je pense que je n'ai pas à apporter de modifications.

Vous n'avez pas besoin d'apporter de modifications car vous utilisez FusedLocation qui détecte automatiquement GPS et NetworkProvider selon la disponibilité et vous donne le meilleur emplacement d'estimation ( Vous devez ajouter ACCESS_FINE_LOCATION autorisation d'obtenir une précision élevée ). Donc, même si vous ciblez l'API au-dessus de 21 vous n'avez rien à changer dans votre application -FusedLocation fonctionnera comme avant.

Et sur votre deuxième point:

Sur la base de la deuxième citation, je pense que j'ai besoin des deux Android.hardware.location.gps et Android.hardware.location.network. Ou s'agit-il uniquement de LocationManager et non d'un emplacement fusionné?

Vous devez juste l'ignorer car vous utilisez l'API FusedLocation et vous n'utilisez pas l'API LocationManager que vous avez remplacée par FusedLocation. La deuxième citation est donc réservée aux applications qui utilisent LocationManagar.

NETWORK_PROVIDER et GPS_PROVIDER font partie de LocationManager Pas FusedLocation API

1
androidXP

Oui, vous avez besoin des deux autorisations si vous utilisez un fournisseur fusionné.

ACCESS_COARSE_LOCATION - Pour recevoir des mises à jour de position de NETWORK_PROVIDER. Ajouter Android.hardware.location.network l'autorisation de fonctionnalité est suffisante.

ACCESS_FINE_LOCATION - Pour recevoir des mises à jour de position de NETWORK_PROVIDER et GPS_PROVIDER. Vous devez ajouter les deux Android.hardware.location.gps et Android.hardware.location.network autorisations de fonctionnalité. Applicable pour l'emplacement également fusionné.

1
Eshack Nazir