2012-06-07 15 views
8

Donde quiera que mire, encuentro este método "getBondedDevices()" para mi adaptador bluetooth. Sin embargo, tengo mi tableta y otro dispositivo bluetooth junto a mí, y no puedo encontrar la manera de que el dispositivo aparezca en la lista de dispositivos enlazados.¿Cómo en verdad ENLACE un dispositivo?

Respuesta

20

En términos de Bluetooth, "vinculado" y "emparejado" son básicamente sinónimos (oficialmente, el proceso de vinculación conduce a un vínculo, pero la mayoría de las personas los usan intercambiables). Para que su dispositivo se agregue a esa lista, debe pasar por el proceso de Discovery, que es cómo un dispositivo busca y encuentra otro, y luego Par los dos juntos.

realidad, usted puede hacerlo desde la configuración del dispositivo como un usuario, pero si lo que busca es tan así en el contexto de una aplicación, el proceso es probable que algo como esto:

  1. Registrar una BroadcastReceiver para BluetoothDevice.ACTION_FOUND y BluetoothAdapter. ACTION_DISCOVERY_FINISHED
  2. inicio descubrimiento llamando BluetoothAdapter.startDiscovery()
  3. Su receptor se llamará con la primera acción cada vez que un nuevo dispositivo se encuentra en el rango, y se puede inspeccionarlo para ver si es la que desea conectarse con . Puede llamar al BluetoothAdapter.cancelDiscovery() una vez que haya descubierto que no desperdicia la batería más de lo necesario.
  4. Cuando se completa el descubrimiento, si no lo ha cancelado, se llamará a su receptor con la segunda acción; para que sepa que no debe esperar más dispositivos.
  5. Con una instancia del dispositivo en la mano, abra un BluetoothSocket y connect(). Si los dispositivos aún no están enlazados, esto iniciará el emparejamiento y puede mostrar alguna UI del sistema para un código PIN.
  6. Una vez emparejado, su dispositivo aparecerá en la lista de dispositivos vinculados hasta que el usuario entre en la configuración y lo elimine.
  7. El método connect() también abre el enlace de socket, y cuando vuelve sin lanzar una excepción, los dos dispositivos están conectados.
  8. Ahora conectado, puede llamar al getInputStream() y getOutputStream() desde el zócalo para leer y escribir datos.

Básicamente, puede inspeccionar la lista de dispositivos enlazados para acceder rápidamente a un dispositivo externo, pero en la mayoría de las aplicaciones hará una combinación de esto y verdadero descubrimiento para asegurarse de que siempre se puede conectar al control remoto dispositivo independientemente de lo que haga el usuario. Si un dispositivo ya está en condiciones de servidumbre, solo estaría realizando los pasos 5-7 para conectarse y comunicarse.

Para obtener más información y un código de muestra, consulte las secciones "Detección de dispositivos" y "Dispositivos de conexión" del Android SDK Bluetooth Guide.

HTH

+0

Muchas gracias que realmente ayudaron. Sin embargo, actualmente estoy atascado en el paso número 5. En mi método onReceive, agrego los dispositivos encontrados a una lista, pero eso es todo lo que he conseguido. Estoy buscando documentos en un constructor de BluetoothSocket pero aún no he encontrado ninguno. ¿Simplemente creo un objeto, llamo a la función 'connect()' y luego los dispositivos aparecerán en mi lista de dispositivos vinculados? Los dispositivos encontrados están en una estructura de datos ArrayAdapter , estoy teniendo problemas para comprender la idea de que llamar a connect() en un nuevo objeto hará todo por mí. – JuiCe

+1

Si lee la guía de desarrollo a la que me he vinculado, notará en el ejemplo de conexión que el método 'createRfcommSocketToServiceRecord()' se usa para generar el objeto de socket fuera del dispositivo. – Devunwired

+0

Sí, lo siento, he revisado la guía y aún me siento un poco confundido. Estoy usando un teléfono/tableta para conectarme a otro dispositivo bluetooth que NO es un teléfono/tableta. Esto puede parecer trivial, pero no he podido convencerme de que lo entiendo, cuando agrego un BluetoothSocket a mi objeto, mi teléfono/tableta actúa como servidor, ¿correcto? También estoy confundido porque dice 'connect()' para comenzar a escuchar dispositivos, pero ya encontré el dispositivo y tengo su dirección. ¿Qué es exactamente lo que estaría escuchando? – JuiCe

0

API de nivel 19 y superior se puede llamar createBond() en BluetoothDevice instace a la que desea conectarse. Que se requieren algunos permisos para descubrir y enumerar los dispositivos visibles

<uses-permission android:name="android.permission.BLUETOOTH"/> 
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 

Código de descubrir y enumerar los dispositivos:

bluetoothFilter.addAction(BluetoothDevice.ACTION_FOUND); 
bluetoothFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED); 
bluetoothFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); 
registerReceiver(bluetoothReceiver, bluetoothFilter); 
private BroadcastReceiver bluetoothReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 
      if (BluetoothDevice.ACTION_FOUND.equals(action)) { 
       Log.e("bluetoothReceiver", "ACTION_FOUND"); 
       BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
       devicesList.add((device.getName() != null ? device.getName() : device.getAddress())); 
       bluetoothDevicesAdapter.notifyDataSetChanged(); 
      } else if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) { 
       Log.e("bluetoothReceiver", "ACTION_DISCOVERY_STARTED"); 
      } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { 
       Log.e("bluetoothReceiver", "ACTION_DISCOVERY_FINISHED"); 
       getActivity().unregisterReceiver(bluetoothReceiver); 
      } 
     } 
}; 

Sólo tiene que llamar createBond() en el dispositivo seleccionado.

Cuestiones relacionadas