安卓蓝牙连接 - 服务发现失败

7
我正在尝试创建一个基本的蓝牙应用程序,用于测试设备。
我从developer.android获取了代码。这是链接:http://developer.android.com/guide/topics/connectivity/bluetooth.html#ConnectingDevices 这是我的线程代码的运行部分:
     public void run() {

        mBluetoothAdapter.cancelDiscovery();
        Log.i(TAG, "Discovery Cancel!"); 

        try {
            Log.i(TAG, "Connection Started");
            mmSocket.connect();
            Log.i(TAG, "Connection Ended");
        } catch (IOException e) {
            try {
                Log.e(TAG, "Connection Failed", e);
                mmSocket.close();
            } catch (IOException e2) {
                Log.e(TAG, "Connection Close Failed", e2);
            }
            return;
        }

无论我尝试什么,mmSocket.connect();总是不起作用。总是抛出一个IOException,我从我的logcat中得到了这个日志: java.io.IOException: Service discovery failed
at android.bluetooth.BluetoothSocket$SdpHelper.doSdp(BluetoothSocket.java:403)
at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:213)
我查看了这些文章,并尝试了其中的方法,但没有一个解决了我的问题。 Android Bluetooth: Service Discovery Failed, connection to Desktop/Laptop Service discovery failed exception using Bluetooth on Android Bluetooth connection on Android ICS not possible Android Bluetooth java.io.IOException: Connection refused? 顺便说一下,我正在使用Android 4.0.4。

我知道这不是设备问题,因为我已经在不同的设备上尝试过这个应用程序。

7个回答

5

它对我有效。

BluetoothSocket socket = device.createInsecureRfcommSocketToServiceRecord(MY_UUID);
Method m = device.getClass().getMethod("createInsecureRfcommSocket", new Class[] {int.class});
socket = (BluetoothSocket) m.invoke(device, 1);
bluetoothAdapter.cancelDiscovery();
socket.connect();

5

我对 UUID 的概念还不是特别了解,但问题出在了 UUID 上。我现在正在使用从内核日志中获取的 UUID:00001105-0000-1000-8000-00805F9B34FB


2
以下代码片段对我有效。尝试一下...
BluetoothDevice mmDevice;
boolean temp = mmDevice.fetchUuidsWithSdp();
UUID uuid = null;
if( temp ){
uuid = mmDevice.getUuids()[0].getUuid();
}
tmp = device.createRfcommSocketToServiceRecord(uuid);

挣扎了几个小时,你的 "mmDevice.getUuids()[0].getUuid()" 解决了我的问题。现在我需要理解你的 'if( temp )' 逻辑。 - Shirish Herwade

1

请确保在适配器正在进行发现操作时,您的应用程序不会尝试连接: 看起来问题是在我调用之前

clientSocket.connect()

我需要打电话

btAdapter.cancelDiscovery()

这个Matts Reco帮助我解决了同样的问题。


1

我正在努力解决这个问题,但还没有成功,我觉得我做错了一些事情。感谢您的关注。 - juliadream

0

您需要提供一个有效的UUID以进行服务发现。

BluetoothSocket sock = bdevice.createRfcommSocketToServiceRecord(VALID_UUID);

对于各种标准(默认)蓝牙服务(免提、文件传输等),有几个常见的UUID。

在这里查看


0
如果您只是想测试设备,请尝试使用SDK提供的蓝牙聊天示例项目。您正在尝试使用的代码和developer.android.com上提供的代码都包含在蓝牙聊天示例中。

我已经应用了那些代码示例,但结果始终相同。 - juliadream

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