以编程方式连接到配对的蓝牙设备

有没有办法,使用Android SDK,以编程方式连接到已经配对的蓝牙设备?

换句话说:我可以进入设置 – >无线和networking – >蓝牙设置,然后点击设备(列为“配对但未连接”),此时它将连接。 我希望能够以编程方式做到这一点,但没有办法做到这一点。

我看到了创build一个RFCOMM套接字的选项,对于一个SPP设备,我假设也会做连接部分,但是对于一个A2DP设备,实际的数据传输将由操作系统来处理,而不是我的应用程序,我认为这不适用?

好吧,因为这让我疯狂,我做了一些挖掘源代码,我发现100%可靠(至less在我的Nexus 4,Android 4.3)解决scheme连接到配对的A2DP设备(如耳机或蓝牙audio设备)。 我已经发布了一个完整的工作示例项目(使用Android Studio轻松构build),您可以在这里findGithub

本质上,你需要做的是:

  • 获取BluetoothAdapter一个实例
  • 使用此实例,获取A2DP的configuration文件代理:

adapter.getProfileProxy (context, listener, BluetoothProfile.A2DP);

其中listener是一个ServiceListener ,它将在其onServiceConnected()callback中接收一个BluetoothProfile (可以将其转换为BluetoothA2dp实例)

  • 使用reflection获取代理上的connect(BluetoothDevice)方法:

Method connect = BluetoothA2dp.class.getDeclaredMethod("connect", BluetoothDevice.class);

  • find你的BluetoothDevice

 String deviceName = "My_Device_Name"; BluetoothDevice result = null; Set<BluetoothDevice> devices = adapter.getBondedDevices(); if (devices != null) { for (BluetoothDevice device : devices) { if (deviceName.equals(device.getName())) { result = device; break; } } } 

  • 并调用connect()方法:

connect.invoke(proxy, result);

至less对我而言,这直接导致了设备的连接。

我发现解决我的问题的最佳方法是发现我可以创build一个button,打开“蓝牙设置”屏幕。 我没有意识到你可以做到这一点,否则我会从一开始。

 startActivity(new Intent(Settings.ACTION_BLUETOOTH_SETTINGS)); 

如果设备已经配对,那么你可以使用

 if(device.getBondState()==device.BOND_BONDED){ Log.d(TAG,device.getName()); //BluetoothSocket mSocket=null; try { mSocket = device.createInsecureRfcommSocketToServiceRecord(MY_UUID); } catch (IOException e1) { // TODO Auto-generated catch block Log.d(TAG,"socket not created"); e1.printStackTrace(); } try{ mSocket.connect(); } catch(IOException e){ try { mSocket.close(); Log.d(TAG,"Cannot connect"); } catch (IOException e1) { Log.d(TAG,"Socket not closed"); // TODO Auto-generated catch block e1.printStackTrace(); } } 

为MY_UUID使用

 private static final UUID MY_UUID = UUID.fromString("0000110E-0000-1000-8000-00805F9B34FB"); 

上面的代码片段只是将您的设备连接到A2DP支持的设备。 我希望这会起作用。

我使用这里的代码作为我的应用程序的这个function的起点: http : //developer.android.com/guide/topics/wireless/bluetooth.html#ConnectingDevices

一旦设备配对,该应用程序没有问题连接两个设备在一起编程。