【问题标题】:Programmatically connect to paired Bluetooth device以编程方式连接到配对的蓝牙设备
【发布时间】:2011-07-07 11:22:53
【问题描述】:

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

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

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

【问题讨论】:

  • 您解决了这个问题吗?我也想知道。

标签: android bluetooth


【解决方案1】:

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

基本上,你需要做的是:

  • 获取BluetoothAdapter 的实例
  • 使用此实例,获取 A2DP 的配置文件代理:

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

其中listener 是ServiceListener,它将在其onServiceConnected() 回调中接收BluetoothProfile(可以转换为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);

至少对我而言,这导致设备立即连接。

【讨论】:

  • @kcoppock 先生,请查看stackoverflow.com/questions/26800606/… 了解 SPP 个人资料
  • @kcoppock:是否可以将其应用于手机配置文件。我尝试将它连接到我的耳机设备,但是,您的项目不起作用
  • @user8264:还有一个BluetoothHeadset 类以及一个BluetoothProfile.HEADSET 常量。使用这些的更改应该是相当微不足道的。
  • @WayWay 你可能会从你的 BroadcastReceiver 启动一个新的 IntentService (使用 onReceive 中提供的上下文来启动它)并让该服务进行蓝牙服务绑定。
  • @KevinCoppock,你太棒了!刚才你节省了我的时间!谢谢!
【解决方案2】:

我发现解决问题的最佳方法是发现我可以创建一个按钮来显示蓝牙设置屏幕。我没有意识到你可以做到这一点,或者我从一开始就做到了。

startActivity(new Intent(Settings.ACTION_BLUETOOTH_SETTINGS));

【讨论】:

  • 这不是“以编程方式”的方法。仍然需要用户交互。
【解决方案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");

上面的代码 sn-p 只是将您的设备连接到支持 A2DP 的设备。 我希望它会起作用。

【讨论】:

  • 这个力会连接a2dp耳机吗?
  • 它只会连接到支持 A2DP 配置文件的设备,作为一个不安全的套接字,它只会连接而不要求配对(如我们所愿,因为您的设备已经配对)。
  • 请将 UUID 更改为“0000110A-0000-1000-8000-00805F9B34FB”或“0000110B-0000-1000-8000-00805F9B34FB”....上面的 UUID 用于 AVRCP 而不是 A2DP,它只是从我的脑海中溜走。
  • 此代码是否可以连接任何不安全的蓝牙设备?
【解决方案4】:

我使用此处的代码作为我的应用程序中此功能的起点:http://developer.android.com/guide/topics/wireless/bluetooth.html#ConnectingDevices

设备配对后,应用程序以编程方式将两个设备连接在一起没有问题。

【讨论】:

  • 马克:感谢您的回复。这对于点对点应用程序连接很有用,在这种连接中,您的应用程序想要发送数据(并因此获取 BluetoothSocket),但在这种情况下,我只需要为 A2DP 建立连接;实际的数据流由操作系统处理。
  • 啊,我不清楚您的其他设备不是 Android 设备。
  • 您是否找到了与其他蓝牙设备(配对)非 android @rmc47 连接的解决方案?
猜你喜欢
  • 1970-01-01
  • 2014-03-13
  • 2017-07-30
  • 2011-09-16
  • 1970-01-01
  • 2012-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多