O local precisa ser habilitado para varredura de Bluetooth de baixa energia no Android 6.0

95

Depois de atualizar para o Android versão 6.0, a verificação de Bluetooth Low Energy (BLE) só funcionará se os serviços de localização estiverem ativados no dispositivo. Veja aqui como referência: Bluetooth Low Energy startScan no Android 6.0 não encontra dispositivos

Basicamente, você precisa ter a permissão habilitada para o aplicativo e também para o telefone. Isso é um inseto? É possível digitalizar sem os serviços de localização realmente ativados? Não quero ter a localização de todos os meus aplicativos.

EDITAR Não mencionei que estou usando o startScan()método BluetoothLeScannerfornecido na API 21. Aceito o curso e as permissões de localização fina no manifesto que esse método exige. Só não quero que os usuários do meu aplicativo tenham que habilitar os serviços de localização em seus dispositivos (GPS, etc.) para usar o meu aplicativo.

Anteriormente, o startScan()método seria executado e retornaria resultados com os serviços de localização desativados no telefone. No Marshmallow, no entanto, o mesmo aplicativo "verificava", mas falhava silenciosamente e não retornava resultados quando os serviços de localização não estavam habilitados no telefone e as permissões de curso / localização fina ainda estavam no manifesto.

V-PTR
fonte
Quais dispositivos você está usando? Eu tive o mesmo problema com um Moto G de 2ª geração. O Moto G 1ª geração e o Nexus 6 funcionam bem com exatamente o mesmo código, sem ativar explicitamente os serviços de localização.
shadowhorst
Percebi isso em qualquer dispositivo com Marshmallow - Nexus 5X, Samsung S6, Samsung S7, LG G4
V-PTR

Respostas:

83

Não, isso não é um bug.

Este problema foi trazido ao Google, onde eles responderam dizendo que esse era o comportamento pretendido e que não iriam corrigi-lo. Eles direcionaram os desenvolvedores a este site, onde indica que a permissão de localização agora é necessária para o acesso ao identificador de hardware. Agora é responsabilidade do desenvolvedor alertar seus usuários sobre o requisito.

No problema, no entanto, ele não aborda por que os serviços de localização (GPS, etc.) são necessários e não parece que eles irão revisitar o problema para explicar isso, já que foi marcado como o comportamento pretendido.

Para responder à segunda parte da pergunta: Sim, é possível digitalizar sem habilitar os serviços de localização. Você pode fazer uma verificação clássica do Bluetooth usando BluetoothAdapter.getDefaultAdapter().startDiscovery()e funcionará com os serviços de localização desativados. Isso descobrirá todos os dispositivos Bluetooth, BLE e outros. No entanto, os dispositivos BLE não terão um registro de varredura que teriam se fossem vistos como resultado de startScan().

V-PTR
fonte
11
O Google alegando que não é um bug me deixa indiferente. A atitude deles é pura besteira.
Marki
21
Não é realmente um bug - se um desenvolvedor de aplicativo malicioso pode verificar beacons bluetooth conhecidos, então ele pode descobrir sua localização sem levantar suspeitas do usuário, pedindo permissões de localização. Portanto, pedir acesso BLE deve, infelizmente, ser tratado da mesma forma que pedir sua localização aproximada.
ArtHare
3
@orionelenzil "A outra permissão que você deve declarar é ACCESS_COARSE_LOCATION ou ACCESS_FINE_LOCATION. Uma permissão de localização é necessária porque varreduras de Bluetooth podem ser usadas para coletar informações sobre a localização do usuário." de developer.android.com/guide/topics/connectivity/bluetooth
ArtHare
7
Deixe-me ver se entendi direito. A grande vantagem do BLE é o bit "LE", ou seja, Low Energy, o que significa um consumo reduzido de bateria. Claro, para ganhar essa economia, eu tenho que ligar o GPS, que é um conhecido consumidor de bateria, negando assim qualquer economia de energia que eu possa ter obtido com o uso do BLE. / me balança a cabeça em descrença.
dgnuff
8
Isto é incrível. Certamente, se o Google estivesse preocupado com o uso de varreduras BLE para inferir a localização, eles deveriam ter adicionado uma permissão separada para isso, em vez de jogar o bebê fora com a água do banho, forçando o usuário a permitir o acesso ao GPS!
Desty
11

Resolvi isso definindo targetSdkVersioncomo 22 no arquivo Gradle. Você deve declarar ACCESS_COARSE_LOCATIONno manifesto, mas a verificação BLE funcionará mesmo se o usuário negar essa permissão nas configurações do aplicativo.

Este é apenas um hack para evitar a solicitação de permissão de localização. É melhor direcionar as versões mais recentes do Android.

Editar

Esta solução não deve mais ser usada, pois o Google Play exigirá que os novos aplicativos sejam direcionados ao Android 8.0 (API nível 26). Os aplicativos devem solicitar permissão de localização para digitalização BLE.

JiTHiN
fonte
Ótimo, obrigado! Você tem uma ideia do que fazer com bibliotecas que simulam monitoramento como o AltBeacon por exemplo? Eles não funcionam sem localização em :( e estão usando basicamente o mesmo mecanismo ... E a versão de compilação do min? @JiTHiN
Shahar Lahav
Downgrade de 23 para 22 e funciona até no Android 7.0. Meu problema inicial era que você tinha que habilitar a localização, agora posso escanear dispositivos BLE com a localização desabilitada.
Mariusz Wiazowski
1
Este é um hack, entretanto NÃO É RECOMENDADO , é sempre melhor direcionar as últimas versões do SDK. A maneira correta de fazer isso é solicitar ACCESS_COARSE_LOCATIONem tempo de execução
Aaron
2
Isso não é mais uma solução (consulte developer.android.com/distribute/best-practices/develop/… "O Google Play exigirá que os novos aplicativos sejam direcionados a pelo menos Android 8.0 (API nível 26) a partir de 1º de agosto de 2018, e que as atualizações do aplicativo serão direcionadas ao Android 8.0 a partir de 1º de novembro de 2018. ")
Étienne
10

O que descobri é que, após o Android 6, você deve conceder a permissão ACCESS_COARSE_LOCATION. Mas em alguns dispositivos também é necessário que o serviço de localização do telefone (GPS) esteja ativado, para que você possa descobrir dispositivos periféricos. Descobri isso usando o Nexus 5x, com Android 7.0.

Ivaylo Pankov
fonte
1
O mesmo para mim com Nexus 5x e Android 6
protegido em
O mesmo no Moto G5 plus com Android 7.1.1
RootCode
2

Eu também tentei isso no manifesto, mas não solicitei permissão, não tenho certeza do motivo. Seu aplicativo está solicitando permissão de localização na inicialização? Se não for, precisamos solicitar permissão em tempo de execução .

Além disso, você pode verificar isso para testar se seu aplicativo está funcionando bem:

Abra Configurações> Aplicativos> SeuApplication> Permissões e ative Localização e tente verificar os resultados.

O local será listado aqui apenas se você tiver fornecido ACCESS_COARSE_LOCATION no manifesto.

Kamal Kishore
fonte
1
Sim, você deve solicitar explicitamente a permissão em tempo de execução, bem como ativar os serviços de localização para o dispositivo. Mas eu queria saber se havia uma maneira de fazer uma varredura BLE sem ter que ativar os serviços de localização ou solicitar a permissão de localização do curso em tempo de execução.
V-PTR
Solicitar permissões não é suficiente, você precisa verificar se os serviços de localização também estão habilitados.
dia
2

Você pode usar BluetoothAdapter.startDiscovery().
Ele procurará por dispositivos Bluetooth Smart e clássicos, mas os serviços de localização não precisam ser ativados.
(Você ainda precisa de ACCESS_COARSE_LOCATIONpermissões no Android 6.)

Você pode ligar BluetoothDevice.getTypepara dispositivos encontrados para filtrar por dispositivos Bluetooth Smart / Low Energy.

Noctis
fonte
0

Bem, eu olhei meu código escrito em Eclipse e uso lá a função startScan (API 21) sem declarar coisas de localização no arquivo de manifesto. Eu ainda recebo o retorno de chamada adequado. Você tentou executar o código sem a declaração de local? Por outro lado - você pode usar o obsoleto startLeScan (API 18), que não requer essas permissões. No entanto, na minha opinião, pesquisar e ler a característica desejada no serviço é mais complicado com os métodos API 18.

Michał Dobi Dobrzański
fonte
Estou usando a startScanfunção em BluetoothLeScanner. Estou usando propositadamente os métodos não obsoletos. Na verdade, estou verificando se há dispositivos que usam APIs maiores que 21 para usar especificamente os novos métodos fornecidos. Tentei sem a localização e simplesmente falhou silenciosamente. A varredura é executada, mas nada é retornado (usando o método pós-API 21)
V-PTR
0

Pelo que notei recentemente no android 8.0, não é necessário ligar seu GPS para fazer uma varredura BLE, mas você tem que declarar no manifesto, mas o usuário deve permitir a permissão.

O Android solicitará que o usuário conceda permissão de localização quando você tentar fazer uma varredura com o startScan()método. Sua varredura falhará se a permissão não for permitida.

Lee Boon Kong
fonte