连接/配对蓝牙耳机与安卓设备

6
我正在尝试创建一个简单的程序,用于扫描蓝牙耳机(我正在使用PS3耳机进行测试),然后连接到它。我正在使用来自蓝牙聊天程序示例的代码。但是我无法将其连接到任何设备。当它到达connect()时,它会给我一个I/O异常。
private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); 

这个线程在尝试与设备建立一个外部连接时运行。它直接运行,连接要么成功要么失败。

private class ConnectThread extends Thread {
    private final BluetoothSocket mmSocket;
    private final BluetoothDevice mmDevice;

    public ConnectThread(BluetoothDevice device) {
        mmDevice = device;
        BluetoothSocket tmp = null;

        // Get a BluetoothSocket for a connection with the given BluetoothDevice
        try {
            tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
        } catch (IOException e) {
            Log.e(TAG, "create() failed", e);
        }
        if (tmp == null){
            Log.i(TAG, "tmp is NULL");
        }
        mmSocket = tmp;
    }

    public void run() {
        Log.i(TAG, "BEGIN mConnectThread");
        setName("ConnectThread");

        // Always cancel discovery because it will slow down a connection
        mAdapter.cancelDiscovery();
        Log.i(TAG, "discovery is cancelled");
        
        // Make a connection to the BluetoothSocket
        try {
            // This is a blocking call and will only return on a successful connection or an exception
            mmSocket.connect();  //Doesn't like something here???
        } catch (IOException e) {
            Log.e(TAG, "IO error, ", e);
            connectionFailed();
            // Close the socket
            try {
                mmSocket.close();
            } catch (IOException e2) {
                Log.e(TAG, "unable to close() socket during connection failure", e2);
            }
            // Start the service over to restart listening mode
            newTBluetoothService.this.start();
            return;
        }

        // Reset the ConnectThread because we're done
        synchronized (newBluetoothService.this) {
            mConnectThread = null;
        }

        // Start the connected thread
        connected(mmSocket, mmDevice);
    }

    public void cancel() {
        try {
            mmSocket.close();
        } catch (IOException e) {
            Log.e(TAG, "close() of connect socket failed", e);
        }
    }
}

这里是logcat日志:
10-13 16:07:45.544: ERROR/BluetoothService.cpp(1259): 
stopDiscoveryNative: D-Bus error in StopDiscovery: org.bluez.Error.Failed (Invalid discovery session)

10-13 16:07:45.544: DEBUG/newBluetoothService(2821): connect to: 00:22:A6:07:12:2B

10-13 16:07:45.544: DEBUG/newBluetoothService(2821): setState() 0 -> 2

10-13 16:07:45.552: INFO/newBluetoothService(2821): BEGIN mConnectThread

10-13 16:07:45.567: ERROR/BluetoothService.cpp(1259): stopDiscoveryNative: D-Bus error in StopDiscovery: org.bluez.Error.Failed (Invalid discovery session)

10-13 16:07:45.567: INFO/newBluetoothService(2821): discovery is cancelled

10-13 16:07:45.575: ERROR/BluetoothEventLoop.cpp(1259): onCreateDeviceResult: D-Bus error: org.bluez.Error.AlreadyExists (Device already exists)

10-13 16:07:45.583: INFO/BluetoothNew(2821): MESSAGE_STATE_CHANGE: 2

10-13 16:07:46.700: ERROR/BluetoothEventLoop.cpp(1259): event_filter: Received signal org.bluez.Device:PropertyChanged from /org/bluez/2872/hci0/dev_00_22_A6_07_12_2B

10-13 16:07:47.036: DEBUG/BluetoothService(1259): updateDeviceServiceChannelCache(00:22:A6:07:12:2B)

10-13 16:07:47.059: DEBUG/BluetoothService(1259):     uuid(system): 0000111e-0000-1000-8000-00805f9b34fb 1

10-13 16:07:47.067: DEBUG/BluetoothService(1259):     uuid(system): 00001108-0000-1000-8000-00805f9b34fb 2

10-13 16:07:47.075: VERBOSE/BluetoothEventRedirector(1786): Received android.bleutooth.device.action.UUID

10-13 16:07:47.075: DEBUG/BluetoothService(1259): Cleaning up failed UUID channel lookup: 00:22:A6:07:12:2B 00001101-0000-1000-8000-00805f9b34fb

10-13 16:07:47.083: ERROR/newBluetoothService(2821): IO error, 

10-13 16:07:47.083: ERROR/newBluetoothService(2821): java.io.IOException: Service discovery failed

10-13 16:07:47.083: ERROR/newBluetoothService(2821):     at android.bluetooth.BluetoothSocket$SdpHelper.doSdp(BluetoothSocket.java:377)

10-13 16:07:47.083: ERROR/newBluetoothService(2821):     at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:201)

10-13 16:07:47.083: ERROR/newBluetoothService(2821):     at com.nmtransfer.bluetooth.newBluetoothService$ConnectThread.run(newBluetoothService.java:347)

10-13 16:07:47.083: INFO/newBluetoothService(2821): Connection Failed

10-13 16:07:47.083: DEBUG/newBluetoothService(2821): setState() 2 -> 1

10-13 16:07:47.083: DEBUG/newBluetoothService(2821): start

10-13 16:07:47.083: INFO/BluetoothNew(2821): MESSAGE_STATE_CHANGE: 1

10-13 16:07:47.098: DEBUG/BluetoothService(1259): new handle 1000d

10-13 16:07:47.106: DEBUG/newBluetoothService(2821): setState() 1 -> 1

10-13 16:07:47.106: DEBUG/newBluetoothService(2821): BEGIN mAcceptThreadThread[Thread-
13,5,main]

10-13 16:07:47.114: INFO/BluetoothNew(2821): MESSAGE_STATE_CHANGE: 1

10-13 16:07:51.036: ERROR/BluetoothEventLoop.cpp(1259): event_filter: Received signal org.bluez.Device:PropertyChanged from /org/bluez/2872/hci0/dev_00_22_A6_07_12_2B

10-13 16:07:53.583: VERBOSE/BluetoothEventRedirector(1786): Received android.bleutooth.device.action.UUID

任何帮助都非常感激。
谢谢。 Chris

我正在使用安装了2.2更新的Droid X和PS3蓝牙耳机进行测试。它们已经配对,但无法连接。当我进入蓝牙设置时,我可以手动连接耳机。 - Chris Mattmiller
3个回答

2

@CHRIS 嘿,我刚刚找到了问题所在。你说的 connectThread 确实是关键,但是你需要使用 UUID("00001108-0000-1000-8000-00805F9B34FB") 来连接耳机配置文件。我正在使用 Jabra 耳机并且它对我有效。如果你有问题,请告诉我!谢谢!


一些蓝牙耳机可能不提供此配置文件UUID,尽管它是此目的的基本配置文件。但是,由于用于车载套件使用的“更高”级别配置文件添加了一些有趣的功能(重新拨打上次号码等),因此您应首先尝试使用UUID为“0000111E-0000-1000-8000-00805F9B34FB”的HandsFreeProfile(HFP)。 - Schlangi

1

我认为除非你知道这是你的耳机提供的确切GUID,否则不应将特定的UUID分配为连接参数。

我不确定。但我希望它能帮到你。

祝你好运!

Fancy


1
我也在研究类似的问题……如何通过应用程序连接耳机配置文件。然后我在这里看到了这个答案:https://stackoverflow.com/a/5711736/769556 基本上,这个耳机级别的配置文件连接是由Android内部完成的(并且没有应用程序级别的访问来建立连接)
那么,@Chris Mattmiller,你找到了不同的答案吗?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接