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

时间:2011-03-02 17:38:28

标签: android bluetooth

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

换句话说:我可以进入设置 - >无线&网络 - >蓝牙设置,然后点击设备(列为“已配对但未连接”),此时它将连接。我希望能够以编程方式执行此操作,但是没有办法实现此目的。

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

4 个答案:

答案 0 :(得分:44)

好吧,因为这让我发疯,我做了一些挖掘源代码,我发现100%可靠(至少在我的Nexus 4,Android 4.3)解决方案连接到配对的A2DP设备(如作为耳机或蓝牙音频设备)。我发布了一个完整的示例项目(可以使用Android Studio轻松构建),您可以找到here on Github

基本上,您需要做的是:

  • 获取BluetoothAdapter
  • 的实例
  • 使用此实例,获取A2DP的个人资料代理:

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

其中listenerServiceListener,其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

设备配对后,应用程序可以通过编程方式将两个设备连接在一起。