La posizione deve essere abilitata per la scansione Bluetooth Low Energy su Android 6.0


99

Dopo l'aggiornamento ad Android versione 6.0, la scansione Bluetooth Low Energy (BLE) funzionerà solo se i servizi di localizzazione sono abilitati sul dispositivo. Vedere qui per riferimento: Bluetooth Low Energy startScan su Android 6.0 non trova i dispositivi

Fondamentalmente, devi avere l'autorizzazione abilitata per l'app e per il telefono. è un insetto? È possibile eseguire la scansione senza che i servizi di localizzazione siano effettivamente abilitati? Non voglio avere una posizione per tutte le mie app.

EDIT Non ho menzionato che sto usando il startScan()metodo inBluetoothLeScanner fornito nell'API 21. Sono d'accordo con il corso e le autorizzazioni di localizzazione fine nel manifest che questo metodo richiede. Semplicemente non voglio che gli utenti della mia app debbano abilitare i servizi di localizzazione sul proprio dispositivo (GPS, ecc.) Per utilizzare la mia app.

In precedenza, il startScan()metodo veniva eseguito e restituiva risultati con i servizi di localizzazione disabilitati sul telefono. Su Marshmallow, tuttavia, la stessa applicazione eseguiva la "scansione" ma non funzionava silenziosamente e non restituiva risultati quando i servizi di localizzazione non erano abilitati sul telefono e le autorizzazioni di percorso / posizione precisa erano ancora nel manifest.


Quali dispositivi stai usando? Ho riscontrato lo stesso problema con un Moto G di seconda generazione. Moto G 1st Generation e Nexus 6 funzionano bene con lo stesso codice senza abilitare esplicitamente i servizi di localizzazione.
shadowhorst

L'ho notato su qualsiasi dispositivo con Marshmallow - Nexus 5X, Samsung S6, Samsung S7, LG G4
V-PTR

Risposte:


85

No, questo non è un bug.

Questo problema è stato segnalato a Google dove hanno risposto dicendo che questo era il comportamento previsto e non lo risolveranno. Hanno indirizzato gli sviluppatori a questo sito dove indica che ora è necessaria l'autorizzazione alla posizione per l'accesso all'identificatore hardware. Ora è responsabilità dello sviluppatore rendere i propri utenti consapevoli del requisito.

Nel numero, tuttavia, non viene affrontato il motivo per cui sono necessari i servizi di localizzazione (GPS, ecc.) E non sembra che rivisiteranno il problema per spiegarlo poiché è stato contrassegnato come comportamento previsto.

Per rispondere alla seconda parte della domanda: Sì, è possibile eseguire la scansione senza abilitare i servizi di localizzazione. Puoi eseguire una scansione classica Bluetooth utilizzando BluetoothAdapter.getDefaultAdapter().startDiscovery()e funzionerà con i servizi di localizzazione disattivati. Questo scoprirà tutti i dispositivi Bluetooth, BLE e altri. Tuttavia, i dispositivi BLE non avranno un record di scansione che avrebbero avuto se fossero stati visti come risultato di startScan().


11
Google afferma che non è un bug mi lascia freddo. Il loro atteggiamento è semplice BS.
Marki

21
Non è davvero un bug: se uno sviluppatore di app dannoso può eseguire la scansione di beacon bluetooth noti, può individuare la tua posizione senza sollevare sospetti dell'utente chiedendo le autorizzazioni di localizzazione. Quindi, la richiesta di accesso BLE deve purtroppo essere considerata come chiedere la tua posizione approssimativa.
ArtHare

3
@orionelenzil "L'altra autorizzazione che devi dichiarare è ACCESS_COARSE_LOCATION o ACCESS_FINE_LOCATION. È necessaria un'autorizzazione per la posizione perché le scansioni Bluetooth possono essere utilizzate per raccogliere informazioni sulla posizione dell'utente." da developer.android.com/guide/topics/connectivity/bluetooth
ArtHare

7
Fammi vedere se ho capito bene. Il grande vantaggio di BLE è il bit "LE", ovvero Low Energy, che significa un consumo ridotto della batteria. Ovviamente, per ottenere quei risparmi, devo attivare il GPS, che è un noto caricatore di batterie, annullando così qualsiasi risparmio energetico che avrei potuto ottenere dall'uso di BLE. / me scuote la testa incredulo.
dgnuff

8
Questo è incredibile. Sicuramente se Google fosse preoccupato per le scansioni BLE utilizzate per dedurre la posizione, avrebbe dovuto aggiungere un'autorizzazione separata per questo, piuttosto che buttare fuori il bambino con l'acqua sporca costringendo l'utente a consentire l'accesso GPS!
Desty

11

Ho risolto questo problema impostando targetSdkVersionsu 22 nel file Gradle. Devi dichiarareACCESS_COARSE_LOCATION nel manifest, ma la scansione BLE funzionerà anche se l'utente nega questa autorizzazione dalle impostazioni dell'app.

Questo è solo un trucco per evitare di richiedere l'autorizzazione alla posizione. È meglio scegliere come target le ultime versioni di Android.

modificare

Questa soluzione non dovrebbe più essere utilizzata poiché Google Play richiederà che le nuove app abbiano come target almeno Android 8.0 (livello API 26). Le app dovrebbero richiedere l'autorizzazione alla posizione per la scansione BLE.


Grazie mille! Hai un'idea di cosa fare con le librerie che simulano il monitoraggio come AltBeacon, ad esempio? Non funzionano senza posizione su :( e stanno usando fondamentalmente lo stesso meccanismo ... E per quanto riguarda la versione di compilazione minima? @JiTHiN
Shahar Lahav

Downgrade da 23 a 22 e funziona anche su Android 7.0. Il mio problema iniziale era che dovevi abilitare la localizzazione, ora posso scansionare i dispositivi BLE con la localizzazione disabilitata.
Mariusz Wiazowski

1
Questo è un trucco, tuttavia NON È RACCOMANDATO , è sempre meglio scegliere come target le ultime versioni di sdk. Il modo corretto per farlo è richiedere ACCESS_COARSE_LOCATIONin runtime
Aaron

2
Questa non è più una soluzione (vedi developer.android.com/distribute/best-practices/develop/… "Google Play richiederà che le nuove app abbiano come target almeno Android 8.0 (livello API 26) dal 1 ° agosto 2018 e che gli aggiornamenti dell'app riguardano Android 8.0 dal 1 ° novembre 2018. ")
Étienne

10

Quello che ho scoperto è che dopo Android 6 devi concedere l'autorizzazione ACCESS_COARSE_LOCATION. Ma su alcuni dispositivi è anche necessario che il servizio di localizzazione del telefono (GPS) sia attivato, in modo da poter rilevare i dispositivi periferici. L'ho scoperto utilizzando Nexus 5x, con Android 7.0.


1
Lo stesso per me con Nexus 5x e Android 6
protetto dal

Lo stesso su Moto G5 plus con Android 7.1.1
RootCode

3

Ho provato anche questo su manifest ma non ho richiesto l'autorizzazione, non so perché. La tua app richiede l'autorizzazione alla posizione all'avvio? In caso contrario, è necessario richiedere l'autorizzazione in fase di esecuzione .

Inoltre puoi controllare questo per verificare se la tua app funziona correttamente:

Apri Impostazioni> App> La tua applicazione> Autorizzazioni e abilita Posizione, quindi prova a cercare i risultati.

La posizione verrà elencata qui solo se hai fornito ACCESS_COARSE_LOCATION su manifest.


1
Sì, devi richiedere esplicitamente l'autorizzazione in fase di esecuzione e attivare i servizi di localizzazione per il dispositivo. Ma mi chiedevo se ci fosse un modo per eseguire una scansione BLE senza dover attivare i servizi di localizzazione o richiedere l'autorizzazione alla posizione del corso in fase di esecuzione.
V-PTR

La richiesta di autorizzazioni non è sufficiente, è necessario verificare se sono abilitati anche i servizi di localizzazione.
drindt

2

Puoi usare BluetoothAdapter.startDiscovery().
Eseguirà la scansione dei dispositivi Bluetooth Smart e Bluetooth classici, ma non è necessario abilitare i servizi di localizzazione.
(Hai ancora bisogno delle ACCESS_COARSE_LOCATIONautorizzazioni su Android 6.)

Puoi chiamare i BluetoothDevice.getTypedispositivi trovati per filtrare i dispositivi Bluetooth Smart / Low Energy.


0

Bene, ho guardato il mio codice scritto in Eclipse e lì uso la funzione startScan (API 21) senza dichiarare la posizione nel file manifest. Ricevo ancora la corretta richiamata. Hai provato a eseguire il codice senza la dichiarazione di posizione? D'altra parte, puoi utilizzare startLeScan (API 18) deprecato che non richiede queste autorizzazioni. Tuttavia, a mio parere, la ricerca e la lettura delle caratteristiche desiderate nel servizio sono più complicate con i metodi API 18.


Sto usando la startScanfunzione in BluetoothLeScanner. Sto usando intenzionalmente metodi non deprecati. In effetti, sto verificando la presenza di dispositivi che utilizzano API maggiori di 21 per utilizzare specificamente i nuovi metodi forniti. Ho provato senza la posizione e non riesce silenziosamente. La scansione viene eseguita ma non viene restituito nulla (utilizzando il metodo post-API 21)
V-PTR

0

Da quello che ho notato di recente su Android 8.0, non è necessario accendere il GPS per eseguire una scansione BLE, ma è necessario dichiararlo nel manifest, ma l'utente deve consentire l'autorizzazione.

Android chiederà all'utente di consentire l'autorizzazione alla posizione quando si tenta di eseguire una scansione con startScan()metodo. La scansione fallirà se l'autorizzazione non è consentita.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.