在Android上使用蓝牙的服务发现失败例外
我目前正在研究一种通过蓝牙连接到乐器的Android应用程序,需要编写字符串命令并接收字符串响应。 目前,我有通过Wi-Fi连接/读取/写入TCP / IP的工作,现在正在尝试实现蓝牙。 但我遇到了一些障碍。 我一直在寻找网络,试图找到类似的例子,并没有任何运气。 我一直在使用Android开发人员资源示例:蓝牙聊天作为我的主要参考点。
我目前的代码似乎工作..然后它会在连接点引发服务发现失败异常。 我正在使用DeviceListActivity
类来发现并选择要连接的设备。 它返回一个ActivityResult,然后我的蓝牙类等待它来处理它,然后连接到它。 下面的代码几乎与蓝牙聊天应用程序相同。
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if(!m_BluetoothAdapter.isEnabled())
{
m_BluetoothAdapter.enable();
}
switch (requestCode) {
case REQUEST_CONNECT_DEVICE:
// When DeviceListActivity returns with a device to connect
if (resultCode == Activity.RESULT_OK) {
// Get the device MAC address
String address = data.getExtras()
.getString(DeviceListActivity.EXTRA_DEVICE_ADDRESS);
// Get the BLuetoothDevice object
BluetoothDevice device = m_BluetoothAdapter.getRemoteDevice(address);
// Attempt to connect to the device
connect(device);
}
break;
case REQUEST_ENABLE_BT:
// When the request to enable Bluetooth returns
if (resultCode == Activity.RESULT_OK) {
// Bluetooth is now enabled, so set up a chat session
}
else {
// User did not enable Bluetooth or an error occured
Toast.makeText(this, "Bluetooth not enabled", Toast.LENGTH_SHORT).show();
finish();
}
}
}
这是我的连接功能:
private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
private void connect(BluetoothDevice device) {
m_Device = device;
BluetoothSocket tmp = null;
// Get a BluetoothSocket for a connection with the
// given BluetoothDevice
try {
tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
}
catch (IOException e) {
}
m_Socket = tmp;
m_BluetoothAdapter.cancelDiscovery();
try {
// This is a blocking call and will only return on a
// successful connection or an exception
m_Socket.connect();
}
catch (IOException e) {
try {
m_Socket.close();
}
catch (IOException e2) {
}
return;
}
}
希望不管我做错了什么都很简单,但我恐怕从未如此简单。 这是我第一次做任何蓝牙开发,也许我做了一些明显的错误......但我不知道为什么我会得到服务发现失败的异常。
您可以随时在手机上手动配对/查找设备......它确实需要密码,但我认为这不是我遇到的问题。
三天后,我得到了一些非常有帮助的帖子。
我不得不更换:
tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
有:
Method m = device.getClass().getMethod("createRfcommSocket", new Class[] {int.class});
tmp = (BluetoothSocket) m.invoke(device, 1);
并且它可以工作!
从API 15开始,您可以使用以下方法:
尝试使用BluetoothDevice
类的getUuids()方法的返回值替换您的UUID。 对我而言有效的是这样的:
UUID uuid = bluetoothDevice.getUuids()[0].getUuid();
BluetoothSocket socket = bluetoothDevice.createRfcommSocketToServiceRecord(uuid);
这起作用的原因是不同的设备支持不同的UUID,并且通过使用getUuids获取设备的UUID,您正在支持所有功能和设备。
另一个有趣的新方法(自API 14开始支持)是:BluetoothHealth.getConnectionState。 还没有尝试过,但看起来很有希望...
这是来自匿名用户尝试回复接受的答案的建议编辑。
你的前后代码之间的一个很大的区别就是你传递的UUID。 我在这里找到了我的答案:http://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#createRfcommSocketToServiceRecord(java.util.UUID)
我不得不更换:
tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
有:
private static final UUID SPP_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
tmp = device.createRfcommSocketToServiceRecord(SPP_UUID);
并瞧它的作品! 原始代码是针对点对点android应用程序的。 连接到简单的串行蓝牙设备时使用应用程序UUID是没有意义的。 这就是为什么发现失败。
链接地址: http://www.djcxy.com/p/14387.html上一篇: Service discovery failed exception using Bluetooth on Android
下一篇: Draw rectangles on image view.image not scaling properly