有没有办法使用Android SDK以编程方式连接到已经配对的蓝牙设备?
换句话说:我可以进入设置 - >无线&网络 - >蓝牙设置,然后点击设备(列为“已配对但未连接”),此时它将连接。我希望能够以编程方式执行此操作,但是没有办法实现此目的。
我看到了创建RFCOMM套接字的选项,对于SPP设备,我假设它也会做连接部分,但是对于A2DP设备,实际数据传输将由OS处理而不是我的应用程序,我认为这不适用?
答案 0 :(得分:44)
好吧,因为这让我发疯,我做了一些挖掘源代码,我发现100%可靠(至少在我的Nexus 4,Android 4.3)解决方案连接到配对的A2DP设备(如作为耳机或蓝牙音频设备)。我发布了一个完整的示例项目(可以使用Android Studio轻松构建),您可以找到here on Github。
基本上,您需要做的是:
BluetoothAdapter
adapter.getProfileProxy (context, listener, BluetoothProfile.A2DP);
其中listener
是ServiceListener
,其BluetoothProfile
回调中会收到onServiceConnected()
(可以投放到BluetoothA2dp
个实例)
connect(BluetoothDevice)
方法: Method connect = BluetoothA2dp.class.getDeclaredMethod("connect", BluetoothDevice.class);
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);
至少对我来说,这导致设备立即连接。
答案 1 :(得分:5)
我找到解决问题的最佳方法是发现我可以创建一个按钮,显示蓝牙设置屏幕。我没有意识到你可以做到这一点,或者我从一开始就会这样做。
startActivity(new Intent(Settings.ACTION_BLUETOOTH_SETTINGS));
答案 2 :(得分:3)
如果设备已配对,则可以使用
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的设备。 我希望它能奏效。
答案 3 :(得分:0)
我在这里使用代码作为我的应用中此功能的起点:http://developer.android.com/guide/topics/wireless/bluetooth.html#ConnectingDevices
设备配对后,应用程序可以通过编程方式将两个设备连接在一起。