以编程方式连接到配对的蓝牙设备
有没有办法,使用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
一旦设备配对,该应用程序没有问题连接两个设备在一起编程。