Bluetooth Low Energy startScan en Android 6.0 no encuentra dispositivos

Estoy desarrollando una aplicación con Bluetooth Low Energy usando Nexus 5. Funcionó en Lollipop y ahora no está funcionando en Marshmallow. Establecí los permisos ACCESS_COARSE_LOCATION y ACCESS_FINE_LOCATION en el manifiesto y en runTime en la actividad.

Esta es la lista de ScanFilters:

mScanFilterTest = new ScanFilter.Builder().build(); mScanFilter = new ArrayList(); mScanFilter.add(mScanFilterTest); 

Estas son las configuraciones:

 mScanSettings = new ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_LOW_POWER).setReportDelay(0) .setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES).build(); 

Estas son mis devoluciones de llamada:

  mBLEScan = new ScanCallback() { @Override public void onScanResult(int callbackType, ScanResult result) { super.onScanResult(callbackType, result); Log.i(TAG, "******************************************"); Log.i(TAG, "The scan result " + result); Log.i(TAG, "------------------------------------------"); } }; 

Esta es mi llamada:

 mBluetoothLeScanner.startScan(mScanFilter, mScanSettings, mBLEScan); 

Comienza el escaneo pero no encuentra ningún dispositivo. ¡¡¡¡Por favor, ayúdame!!!!

Luché con el mismo problema. Para solucionarlo, debe habilitar “Ubicación” (GPS) en la configuración del teléfono , así como solicitar permiso de ubicación en la aplicación en tiempo de ejecución. Ambos deben realizarse para que el escaneo funcione correctamente.

Para solicitar el permiso de ubicación, coloque lo siguiente en un cuadro de diálogo o en Me gusta:

 yourActivity.requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, yourPermissionRequestCode); 

e implementar:

 @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults){ if(requestCode == yourPermissionRequestCode) { ... //Do something based on grantResults } } 

en su yourActivity y maneje lo que el usuario seleccione. También debe hacer lo siguiente para activar los servicios de ubicación de su dispositivo:

 Intent enableLocationIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); yourActivity.startActivityForResult(enableLocationIntent, yourServiceRequestCode); 

Puede verificar si el usuario activó los servicios de ubicación implementando:

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(requestCode == yourServiceRequestCode) { ...//Do whatever you need to } } 

en yourActivity . También puede activar manualmente los servicios de ubicación (GPS) haciendo lo siguiente:

Enter phone settings -> Select "Location" -> Then turn it on

Debería verse así en la configuración del teléfono:

Servicios de ubicación (GPS) habilitados en la configuración del teléfono

O de esta manera en el menú desplegable de configuraciones rápidas:

Servicios de ubicación (GPS) habilitados en la configuración desplegable

Una vez que el usuario haya habilitado los permisos y haya iniciado los servicios de ubicación, debería comenzar a escanear. Me di cuenta de que si ya está escaneando mientras habilita el permiso / enciende el servicio de ubicación, todavía no pondrá nada en su onScanResults

No estoy seguro de si esto es un error o una “característica” para la publicidad iBeacons / Bluetooth (NOTA: publicidad como en la venta de productos, no la publicidad técnica de Bluetooth) para permitir que las empresas vean tu ubicación y te dirijan a donde quieren.

Espero que esto solucione tu problema!

EDITAR Quise agregar: solo necesitas esto para ESCANEAR. Una vez que esté conectado al dispositivo BLE, puede cerrar el servicio de ubicación en su teléfono y aún estará conectado a sus dispositivos. Sin embargo, no puede descubrir o conectarse a ningún dispositivo nuevo y todos los dispositivos de publicidad caerán desde los resultados de onScanResults

Como @Jacopo Tosi dice que debes solicitar permisos de ubicación. Puedes leer aquí cómo hacerlo. Y también debes activar Location. No sé por qué lo hizo. pero es la única forma en que logré que funcione.

En mi caso (HTC M9) también tuve que ingresar al menú de configuración de Android bajo Bluetooth y buscar manualmente los dispositivos BT.