studio - Quando ho bisogno di android.hardware.location.gps e android.hardware.location.network?




service geolocation android (4)

Da quanto ho capito, è sufficiente leggere la documentazione relativa all'elemento uses-feature per capire come le applicazioni vengono filtrate in Google Play in base a voci di funzioni implicite ed esplicite:

Google Play filtra le applicazioni visibili agli utenti, in modo che gli utenti possano visualizzare e scaricare solo le applicazioni compatibili con i loro dispositivi. Uno dei modi in cui filtra le applicazioni è la compatibilità delle funzionalità.

Per determinare la compatibilità delle funzionalità di un'applicazione con il dispositivo di un determinato utente, Google Play confronta:

Funzioni richieste dall'applicazione: un'applicazione dichiara le caratteristiche degli elementi nel suo manifest con ... Funzioni disponibili sul dispositivo, in hardware o software: un dispositivo segnala le funzionalità supportate come proprietà di sistema di sola lettura.

...

Se una funzione viene esplicitamente dichiarata come richiesta, Google Play aggiunge la funzione all'elenco delle funzionalità richieste per l'applicazione. Filtra quindi l'applicazione dagli utenti su dispositivi che non forniscono tale funzionalità.

Se una funzione viene dichiarata esplicitamente come non richiesta, Google Play non aggiunge la funzione all'elenco delle funzionalità richieste. Per questo motivo, una funzionalità non richiesta esplicitamente dichiarata non viene mai considerata durante il filtraggio dell'applicazione. Anche se il dispositivo non fornisce la funzione dichiarata, Google Play considererà comunque l'applicazione compatibile con il dispositivo e lo mostrerà all'utente, a meno che non vengano applicate altre regole di filtro.

Gli elementi impliciti uses-feature per le autorizzazioni di posizione sono:

ACCESS_COARSE_LOCATION

  • android.hardware.location
  • android.hardware.location.network (solo quando il livello dell'API di destinazione è 20 o inferiore.)

ACCESS_FINE_LOCATION

  • android.hardware.location
  • android.hardware.location.gps (Solo quando il livello API di destinazione è 20 o inferiore.)

La modifica descritta nel messaggio di posta elettronica di Google è che gli elementi impliciti uses-feature per android.hardware.location.gps non saranno presenti nell'API 21+ con ACCESS_FINE_LOCATION . La situazione analoga sembra essere vera per ACCESS_COARSE_LOCATION e android.hardware.location.network .

Google incoraggia l'enumerazione esplicita di tutte le voci delle uses-feature , ma fornisce ancora voci implicite in base alle autorizzazioni. Dal seguente estratto della documentazione, ritengo che non vi sia alcuna differenza tra omettere una uses-feature e dichiararla non necessaria, a meno che non ci sia una voce di uses-feature implicita.

Se una funzione viene dichiarata esplicitamente come non richiesta, Google Play non aggiunge la funzione all'elenco delle funzionalità richieste.

Il caso d'uso della propria applicazione determina quali voci di uses-feature devono essere presenti. Ecco alcuni casi d'uso di esempio, con tutte le voci di uses-feature richieste, se non diversamente specificato:

  1. L'applicazione utilizza il GPS esplicitamente da LocationManager o l'applicazione richiede un'elevata precisione del GPS. Questo è l'esempio fornito nell'e-mail di Google.

    • ACCESS_FINE_LOCATION
    • android.hardware.location (implicito)
    • android.hardware.location.gps (implicito fino all'API 20)
  2. Utilizza la posizione di rete in modo esplicito

    • ACCESS_COARSE_LOCATION
    • android.hardware.location (implicito)
    • android.hardware.location.network (implicito fino all'API 20)
  3. Utilizza sia il GPS che la rete

    • ACCESS_FINE_LOCATION
    • android.hardware.location (implicito)
    • android.hardware.location.gps (implicito fino all'API 20)
    • android.hardware.location.network
  4. Utilizza almeno uno tra GPS e rete. Questo è il mio caso FusedLocationProviderApi nella domanda originale.

    • ACCESS_FINE_LOCATION / ACCESS_COARSE_LOCATION
    • android.hardware.location (implicito)
  5. Usa la posizione se disponibile, consente comunque l'installazione dell'applicazione se non disponibile

    • ACCESS_FINE_LOCATION
    • android.hardware.location required = false (override implicito)
    • android.hardware.location.gps required = false (override implicito fino all'API 20)

Google sta informando via e-mail delle modifiche alle autorizzazioni di posizione Android:

Stiamo apportando una modifica il 15 ottobre 2016 che influirà sulle app che utilizzano l'API versione 21 (Android 5.0, Lollipop) o versioni successive che utilizzano ACCESS_FINE_LOCATION ma non dispongono esplicitamente della funzione "android.hardware.location.gps". Andando avanti, queste app saranno disponibili per l'installazione su dispositivi che non dispongono di hardware GPS. Nella maggior parte dei casi, questo non sarà un problema poiché la posizione Wi-Fi e Cell-ID offre una fedeltà sufficientemente elevata per il funzionamento tipico di queste app. Tuttavia, tutte le app che richiedono l'hardware GPS, come i navigatori GPS, dovrebbero aggiungere esplicitamente la funzione "android.hardware.location.gps" al proprio manifest.

Se la tua app richiede che il GPS funzioni correttamente e tu non includa nella dichiarazione manifest, i tuoi utenti potrebbero avere un'esperienza di app scadente.

Inoltre, se utilizzi il fornitore di posizione fuso e desideri ricevere i campioni di posizione più precisi dal GPS (ovvero con PRIORITY_HIGH_ACCURACY), devi includere la funzione "android.hardware.location.gps" nel manifest di app per assicurarti che Google Gioca distribuisce l'app sui dispositivi con sensori GPS.

Puoi leggere ulteriori informazioni su questo cambiamento nel Centro assistenza per sviluppatori Android .

Dal Centro assistenza per sviluppatori Android

Per ricevere gli aggiornamenti di posizione da NETWORK_PROVIDER o GPS_PROVIDER, devi richiedere l'autorizzazione dell'utente dichiarando l'autorizzazione ACCESS_COARSE_LOCATION o ACCESS_FINE_LOCATION, rispettivamente, nel file manifest di Android. Senza queste autorizzazioni, l'applicazione non funzionerà in fase di esecuzione quando si richiedono aggiornamenti di posizione.

Se si utilizzano sia NETWORK_PROVIDER sia GPS_PROVIDER, è necessario richiedere solo l'autorizzazione ACCESS_FINE_LOCATION, poiché include l'autorizzazione per entrambi i provider. L'autorizzazione per ACCESS_COARSE_LOCATION consente l'accesso solo a NETWORK_PROVIDER.

Attenzione: se la tua app ha come target Android 5.0 (livello API 21) o superiore, devi dichiarare che la tua app utilizza la funzione hardware android.hardware.location.network o android.hardware.location.gps nel file manifest, a seconda che il tuo l'app riceve gli aggiornamenti di posizione da NETWORK_PROVIDER o da GPS_PROVIDER. Se la tua app riceve informazioni sulla posizione da una di queste fonti di provider di località, devi dichiarare che l'app utilizza queste funzionalità hardware nel manifest dell'app. Sui dispositivi che eseguono versioni precedenti ad Android 5.0 (API 21), la richiesta dell'autorizzazione ACCESS_FINE_LOCATION o ACCESS_COARSE_LOCATION include una richiesta implicita per le caratteristiche hardware della posizione. Tuttavia, la richiesta di tali autorizzazioni non richiede automaticamente funzionalità hardware di localizzazione su Android 5.0 (livello di API 21) e versioni successive.

Sto utilizzando il fornitore di posizione fuso, il targeting dell'API 21 e l'utilizzo di ACCESS_FINE_LOCATION . Non mi interessa in particolare se il GPS è disponibile, solo che viene riportata la posizione più precisa.

  • Sulla base della prima citazione, penso di non dover apportare alcuna modifica.
  • Sulla base della seconda citazione, penso di aver bisogno sia di android.hardware.location.gps che di android.hardware.location.network . Oppure è solo per LocationManager e non ha una posizione fusa?

Ho bisogno di android.hardware.location.gps e android.hardware.location.network o no?


La seconda citazione ti dice che hai bisogno di android.hardware.location.network o android.hardware.location.gps , se hai bisogno in particolare di uno o dell'altro fornitore di location.

Se vuoi aggiornamenti via GPS, hai bisogno di android.hardware.location.gps . Se desideri aggiornamenti tramite WiFi e reti cellulari, hai bisogno di android.hardware.location.network .

Se si desidera ricevere aggiornamenti dalla rete e dal GPS, è necessario includere entrambi gli elementi <uses-feature> .

Se non si specifica, il dispositivo potrebbe essere installato su dispositivi senza quel provider. Ad esempio, può essere installato su un dispositivo senza GPS, rete cellulare o chip Wi-Fi.

In altre parole, ottenere la posizione richiede la funzione di localizzazione di rete o la funzione GPS. Se non si dichiara che l'applicazione ha bisogno dell'uno o dell'altro, non è possibile ottenere gli aggiornamenti di posizione.

API 21 vs 20 e sotto

Si noti che quanto sopra è vero solo per l'API 21 e successive. Prima dell'API 21, la richiesta dell'autorizzazione ACCESS_COARSE_LOCATION implicava la funzione location.network , dove la richiesta di ACCESS_FINE_LOCATION implicava la funzione location.gps (vedere <uses-feature> ).

L'unica modifica al momento è che, per API 21+, qualsiasi app che richiede ACCESS_FINE_LOCATION sarà presto disponibile per l'installazione su dispositivi senza GPS. Se la tua app in precedenza aveva previsto che il GPS fosse disponibile (e necessitasse di GPS), devi assicurarti di avere la richiesta esplicita per android.hardware.location.gps .

Google dice che i provider di localizzazione di rete sono ora abbastanza buoni per una buona posizione, quindi, il cambiamento.


Sì, hai bisogno di entrambe le autorizzazioni se stai usando un provider fuso.

ACCESS_COARSE_LOCATION - Per ricevere gli aggiornamenti di posizione da NETWORK_PROVIDER . L'aggiunta del permesso di funzione android.hardware.location.network è sufficiente.

ACCESS_FINE_LOCATION - Per ricevere gli aggiornamenti di posizione sia da NETWORK_PROVIDER che da GPS_PROVIDER . È necessario aggiungere le autorizzazioni alle funzioni android.hardware.location.gps e android.hardware.location.network . Applicabile anche per la posizione fusa.


Soluzione rapida e semplice:

L'app deve essere aggiornata tramite GPS, utilizzare android.hardware.location.gps. Se desideri aggiornamenti tramite WiFi e reti cellulari, hai bisogno di android.hardware.location.network.

Aggiungi le righe sottostanti al file manifest in base ai requisiti dei dati sulla posizione:

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

Spero che questo ti aiuti..







android-gps