48

Dopo l'aggiornamento alla versione Android 6.0, la scansione Bluetooth Low Energy (BLE) funziona solo se i servizi di localizzazione sono abilitati sul dispositivo. Vedere qui per riferimento: Bluetooth Low Energy startScan on Android 6.0 does not find devicesLa posizione deve essere abilitata per la scansione Bluetooth a bassa energia su Android 6.0

Fondamentalmente, è necessario disporre dell'autorizzazione per l'app e per il telefono. è un insetto? È possibile eseguire la scansione senza servizi di localizzazione effettivamente abilitati? Non voglio avere la posizione per tutte le mie app.

EDIT non sono riuscito a dire che sto usando il metodo startScan() in BluetoothLeScanner previsto API 21. Io sono a posto con il corso e le autorizzazioni posizione strategica nel manifesto che questo metodo richiedono. Semplicemente non voglio che gli utenti della mia app debbano abilitare i servizi di localizzazione sul loro dispositivo (GPS, ecc.) Per utilizzare la mia app.

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

+0

Quali dispositivi stai utilizzando? Ho incontrato lo stesso problema con un Moto G 2nd Generation. Moto G 1st Generation e Nexus 6 funzionano bene con lo stesso codice esatto senza abilitare esplicitamente i servizi di localizzazione. – shadowhorst

+0

L'ho notato su qualsiasi dispositivo che esegue Marshmallow - Nexus 5X, Samsung S6, Samsung S7, LG G4 –

risposta

22

No, questo non è un bug.

Questo issue è stato portato su Google, dove hanno risposto dicendo che questo era il comportamento previsto e non lo risolvono. Hanno indirizzato gli sviluppatori a this site dove sottolinea che ora è necessario il permesso di posizione per l'accesso all'identificativo hardware. Ora è responsabilità dello sviluppatore rendere i propri utenti consapevoli dei requisiti.

Nel problema, tuttavia, non viene indicato il motivo per cui i servizi di localizzazione (GPS, ecc.) Sono obbligatori e non sembra che stiano per riesaminare 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. È possibile eseguire una scansione classica Bluetooth utilizzando BluetoothAdapter.getDefaultAdapter().startDiscovery() e che funzionerà con i servizi di localizzazione disattivati. Questo scoprirà tutti i dispositivi Bluetooth, BLE e altro. Tuttavia, i dispositivi BLE non avranno un record di scansione che avrebbero avuto se fossero stati visti come risultato di startScan().

+1

Questa è la risposta corretta – KRUKUSA

+0

quindi qual è il modo più corretto per farlo? – Mikhail

0

Bene, ho guardato il mio codice scritto in Eclipse e io utilizzo la funzione startScan (API 21) senza dichiarare la posizione nel file manifest. Ricevo ancora il callback appropriato. Hai provato a eseguire il codice senza la dichiarazione di posizione? D'altra parte - è possibile utilizzare il startLeScan deprecato (API 18) che non richiede tali autorizzazioni. Tuttavia, a mio avviso, la ricerca e la lettura delle caratteristiche desiderate nel servizio sono più complicate con i metodi API 18.

+0

Sto usando la funzione 'startScan' in' BluetoothLeScanner'. Uso intenzionalmente i metodi non deprecati. In effetti, sto verificando i dispositivi che utilizzano API superiori a 21 per utilizzare in modo specifico i nuovi metodi forniti. Ho provato senza la posizione e fallisce silenziosamente. La scansione viene eseguita ma non viene restituito nulla (utilizzando il metodo post-API 21) –

0

Ho anche provato questo manifest ma non ho richiesto il permesso, non so perché. L'app richiede il permesso di posizione all'avvio? Se non lo è, abbiamo bisogno di request for permission on runtime.

Inoltre è possibile controllare questo per verificare se la vostra applicazione sta lavorando bene:

Apri Impostazioni> Applicazioni> YourApplication> Permessi e attivare posizione e quindi provare a eseguire la scansione per i risultati.

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

+1

Sì, è necessario richiedere esplicitamente l'autorizzazione in fase di runtime e attivare i servizi di localizzazione per il dispositivo. Ma mi chiedevo se esistesse un modo per eseguire una scansione BLE senza dover attivare i servizi di localizzazione o richiedere l'autorizzazione per la posizione del corso in fase di esecuzione. –

1

È possibile utilizzare BluetoothAdapter.startDiscovery().
Esaminerà sia i dispositivi Bluetooth Smart che i dispositivi Bluetooth classici, ma i servizi di localizzazione non devono essere abilitati.
(hai ancora bisogno ACCESS_COARSE_LOCATION autorizzazioni su Android 6.)

EDIT:
È possibile chiamare BluetoothDevice.getType sui dispositivi trovati per filtrare i dispositivi Bluetooth a basso consumo energetico intelligente /.

3

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

+0

Lo stesso per me con Nexus 5x e Android 6 – protectedmember

8

Ho risolto questo impostando targetSdkVersion a nel file gradle. Devi dichiarare ACCESS_COARSE_LOCATION nel manifest ma, la scansione BLE funzionerà anche se l'utente nega questa autorizzazione dalle Impostazioni app.

+0

Incredibile ma questo ha fatto il trucco. Thx @JiTHiN !!! – Billyjoker

+0

Grande, grazie! Hai un'idea di cosa fare con le librerie che simulano il monitoraggio come AltBeacon per esempio? Non funzionano senza posizione su :(e usano fondamentalmente lo stesso meccanismo ... E per quanto riguarda la versione min compile? @JiTHiN –

+0

Downgraded 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 localizzazione disabilitata –

Problemi correlati