es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Android BLE onScanResult no se llama en segundo plano en Android 11. Funcionaba en Android 10.

Tengo una aplicación que escanea dispositivos BLE. Funcionaba perfectamente en Android 10, pero desde que actualicé mi teléfono a Android 11, el onScanResult simplemente nunca se llama si pongo la aplicación en segundo plano o si bloqueo la pantalla.

Esto es bastante molesto. No he encontrado ninguna idea razonable de lo que podría estar causando esto. No he encontrado ninguna diferencia en Android 11 que indique este cambio de comportamiento. Android 12 tiene nuevos permisos de BT si apuntas tu aplicación al nivel de API 31, pero yo apunto la mía al nivel de API 30, y uso mi aplicación en Android 11.

Estoy absolutamente perdido. He intentado diferentes modos de escaneo, así como añadir filtros de escaneo, pero nada ha cambiado.

Mis configuraciones de escaneo:

ScanSettings ss = new ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_LOW_POWER).build();
List<ScanFilter> filterList = new ArrayList<>();
filterList.add(new ScanFilter.Builder().setManufacturerData(Constants.HARDWARE_MANUFACTURER_ID, new byte[]{}).build());
BluetoothUtil.getBluetoothLeScannerInstance().startScan(filterList, ss, leScanCallback);

Hasta ahora he experimentado lo siguiente:

El onScanResult se llama perfectamente cuando la aplicación está en primer plano y la pantalla del dispositivo no está bloqueada. Tan pronto como pongo la aplicación en segundo plano o bloqueo la pantalla, ya no recibo ninguna devolución de llamada para onScanResult.

Aquí hay un ejemplo de registro cuando la aplicación está en primer plano, pero la pantalla está bloqueada:

15:47:15 com.myapp.co I/BL_START: …Comenzando el escaneo de BL. (Inicio de la ventana actual)
15:47:17 com.myapp.co I/SCANNED_: ¡onScanResult corrió!
15:47:21 com.myapp.co I/SCANNED_: ¡onScanResult corrió!
15:47:21 com.myapp.co I/SCANNED_: ¡onScanResult corrió!
15:47:22 com.myapp.co I/SCANNED_: ¡onScanResult corrió!
15:47:22 com.myapp.co I/BL_STOP: …Terminando el escaneo de BL. (Final de la ventana actual)
15:47:25 com.myapp.co I/BL_START: …Comenzando el escaneo de BL. (Inicio de la ventana actual)
15:47:25 com.myapp.co I/SCANNED_: ¡onScanResult corrió!
15:47:26 com.myapp.co I/SCANNED_: ¡onScanResult corrió!
15:47:26 com.myapp.co I/SCANNED_: ¡onScanResult corrió!
15:47:29 com.myapp.co I/SCANNED_: ¡onScanResult corrió!
15:47:30 com.myapp.co I/SCANNED_: ¡onScanResult corrió!
15:47:30 com.myapp.co I/SCANNED_: ¡onScanResult corrió!
15:47:32 com.myapp.co I/BL_STOP: …Terminando el escaneo de BL. (Final de la ventana actual)

Aquí hay un ejemplo de registro cuando la aplicación está en segundo plano o la pantalla está bloqueada:

15:48:25 com.myapp.co I/BL_START: …Comenzando el escaneo de BL. (Inicio de la ventana actual)
15:48:32 com.myapp.co I/BL_STOP: …Terminando el escaneo de BL. (Final de la ventana actual)
15:48:35 com.myapp.co I/BL_START: …Comenzando el escaneo de BL. (Inicio de la ventana actual)
15:48:42 com.myapp.co I/BL_STOP: …Terminando el escaneo de BL. (Final de la ventana actual)
15:48:45 com.myapp.co I/BL_START: …Comenzando el escaneo de BL. (Inicio de la ventana actual)
15:48:52 com.myapp.co I/BL_STOP: …Terminando el escaneo de BL. (Final de la ventana actual)
15:48:55 com.myapp.co I/BL_START: …Comenzando el escaneo de BL. (Inicio de la ventana actual)
15:49:02 com.myapp.co I/BL_STOP: …Terminando el escaneo de BL. (Final de la ventana actual)
15:49:05 com.myapp.co I/BL_START: …Comenzando el escaneo de BL. (Inicio de la ventana actual)
15:49:12 com.myapp.co I/BL_STOP: …Terminando el escaneo de BL. (Final de la ventana actual)
15:49:15 com.myapp.co I/BL_START: …Comenzando el escaneo de BL. (Inicio de la ventana actual)
15:49:22 com.myapp.co I/BL_STOP: …Terminando el escaneo de BL. (Final de la ventana actual)
15:49:25 com.myapp.co I/BL_START: …Comenzando el escaneo de BL. (Inicio de la ventana actual)
15:49:32 com.myapp.co I/BL_STOP: …Terminando el escaneo de BL. (Final de la ventana actual)
15:49:35 com.myapp.co I/BL_START: …Comenzando el escaneo de BL. (Inicio de la ventana actual)
15:49:42 com.myapp.co I/BL_STOP: …Terminando el escaneo de BL. (Final de la ventana actual)

Como se puede ver, el onScanResult se llama como debería, cuando la aplicación está en primer plano y la pantalla no está bloqueada.

¿Qué puede causar esto y cómo puedo prevenir tal funcionalidad?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está relacionado con las restricciones de fondo introducidas en Android 11. Android 11 limita el acceso a la ubicación de fondo para mejorar la privacidad y la vida útil de la batería. Es posible que su aplicación necesite solicitar permiso de ubicación en segundo plano y seguir el comportamiento adecuado para garantizar que la aplicación funcione correctamente después de que el usuario haya denegado temporalmente el acceso a la ubicación.

    Para solucionar este problema, puede intentar lo siguiente:

    1. Solicite explícitamente el permiso ACCESS_BACKGROUND_LOCATION en el archivo del Manifiesto.
    2. Verifique si el usuario ha concedido los permisos de ubicación requeridos en tiempo de ejecución. Si no es así, solicite al usuario que conceda esos permisos.

    3. Asegúrese de que su aplicación cumpla con las limitaciones de ubicación en segundo plano en Android 11. Si su aplicación necesita seguir escaneando dispositivos BLE en segundo plano, considere el uso de un servicio en primer plano.

    4. Verifique si su aplicación está siendo afectada por restricciones de ahorro de energía. Android 11 introduce nuevas restricciones en las aplicaciones de fondo que consumen demasiada batería.

    Siguiendo estos pasos, su aplicación debería poder escanear dispositivos BLE incluso cuando se está ejecutando en segundo plano o la pantalla está bloqueada.

Comments are closed.