2011-09-07 11 views
40

Tengo una aplicación donde estoy controlando programáticamente el emparejamiento y el desacoplamiento Bluetooth. Puedo emparejar antes de la conexión y desvincularme después. La razón por la que necesito hacer esto es específica para mi solicitud y no en el alcance de mi pregunta.¿Cómo puedo evitar o descartar la notificación de sincronización de Bluetooth de Android cuando estoy haciendo un emparejamiento programático?

Básicamente lo que estoy haciendo es:

  1. obtener una referencia ib a IBluetooth objeto como se describe en this answer
  2. Registrar una BroadcastReceiver para android.bluetooth.device.action.PAIRING_REQUEST
  3. llamada ib.createBond(address)
  4. Espere BroadcastReceiver para desencadenar
  5. Convertir el pin de usuario en bytes con convertPinToBytes()
  6. llamada ib.setPin(address, pinBytes) desde dentro BroadcastReceiver

De todas formas, este enfoque funciona muy bien, excepto por el hecho de que cuando lo haga el emparejamiento, recibo una notificación en la barra de estado que solicita que el usuario introduzca un PIN para completar la emparejamiento. Pero esto de hecho es innecesario, porque para cuando el usuario vea esto, mi aplicación ya ha usado setPin(). Realmente me gustaría que la notificación a) no aparezca en absoluto, ob) sea descartada automáticamente de alguna manera.

Me doy cuenta de que esto ni siquiera es posible, pero pensé que podría preguntar en caso de que alguien tenga una idea creativa.

+1

¿Puede agregar algún código de muestra (o un enlace a su código fuente). Lo que quiero hacer es en realidad lo mismo que usted. Quiero conectarme a un dispositivo sin la solicitud de contraseña. Saludos cordiales, Jeroen – Jeroen

+1

Desafortunadamente, no puedo compartir mi código fuente, pero el paso que paso arriba está muy cerca del código real. Puede comenzar con el código fuente en la respuesta a la que me enlace en el Paso 1. –

+0

@JoelF ¿Ha resuelto su problema? Porque no soy. Realmente aprecio si puedes compartir cómo lo resuelves, si ese es el caso. – Tiago

Respuesta

1

hacer esto en el evento de notificación PAIRING_REQUEST:

BluetoothDevice localBluetoothDevice = (BluetoothDevice)intent.getParcelableExtra("android.bluetooth.device.extra.DEVICE"); 

Class localClass = localBluetoothDevice.getClass(); 
Class[] arrayOfClass = new Class[0]; 
localClass.getMethod("cancelPairingUserInput", arrayOfClass).invoke(paramBluetoothDevice, null)).booleanValue(); 

Pero tienes que decirme ¿cómo asociar el dispositivo a distancia sin que el usuario introduzca PIN/Contraseña? Por supuesto, usted conoce el PIN del dispositivo remoto que intenta emparejarse con su dispositivo, pero ¿cómo le proporcionó ese PIN al dispositivo remoto?

+0

Interesante, déjame intentarlo. He actualizado mi respuesta para ser un poco más específico sobre cómo hice el emparejamiento programático sin la interacción del usuario. Espero que ayude. –

+0

¿Puede explicarme qué es paramBluetoothDevice exactamente? – Tiago

14

intente configurar la confirmación por primera vez en la PAIRING_REQUEST

BluetoothDevice device = intent.getParcelableExtra("android.bluetooth.device.extra.DEVICE"); 

device.getClass().getMethod("setPairingConfirmation", boolean.class).invoke(device, true); 
device.getClass().getMethod("cancelPairingUserInput").invoke(device); 

Esto funcionó para mí entre dos dispositivos Android usando RFCOMM pero no voy a entrar en ningún PIN

+0

Como nota al margen, al llamar cancelPairingUserInput no ha sido necesario en mis pruebas. – domsom

+1

Esto no funciona. Si utilizo este código, el proceso de emparejamiento no se inicia y recibo un mensaje de error que dice que no hay ningún método llamado 'cancelPairingUserInput' – Mulgard

+0

. Me acabo de dar cuenta de que esto también funciona para evitar ventanas emergentes molestas cuando se conecta a dispositivos ya emparejados. ciertos modelos que ejecutan versiones recientes de Android (GT-I9295, Android 4.4.2) – dhakim

9

Desde Android API 19 Google cambió estos métodos para Métodos públicos, por lo que no hay necesidad de Reflexión más. :)

Cuestiones relacionadas