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 BluetoothLeScanner
fornecido 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.
Respostas:
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 destartScan()
.fonte
Resolvi isso definindo
targetSdkVersion
como 22 no arquivo Gradle. Você deve declararACCESS_COARSE_LOCATION
no 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.
fonte
ACCESS_COARSE_LOCATION
em tempo de execuçãoO 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.
fonte
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.
fonte
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_LOCATION
permissões no Android 6.)Você pode ligar
BluetoothDevice.getType
para dispositivos encontrados para filtrar por dispositivos Bluetooth Smart / Low Energy.fonte
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.
fonte
startScan
função emBluetoothLeScanner
. 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)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.fonte