我有以下设置:
Android设备使用“客户端”套接字连接到远程嵌入式设备,Android应用程序使用以下代码段连接到嵌入式设备。
在嵌入式设备上使用MindTree BT堆栈,根据Android应用程序熟悉的设备中的某些属性准备服务器串行套接字,嵌入式设备上定义的连接不受保护!!
两个应用程序的组合适用于:
今天,我尝试过三星S3,摩托罗拉MB886和Nexus 7的应用...... 调用 socket.connect()时,所有这些都导致“权限被拒绝”...(我在清单中拥有适当的权限,否则它将无法在其他设备上运行。)
我测试过的所有新设备都是版本代码> 4.0,所以我想知道:
有人知道API的任何变化吗? 也许Android 4.0+强制安全?
似乎错误发生在Bonding状态,因为我可以在嵌入式程序日志中看到......
任何见解?
代码:
public final synchronized int connectToDevice(int connectingMethod)
throws BluetoohConnectionException {
if (socket != null)
throw new BadImplementationException("Error socket is not null!!");
connecting = true;
logInfo("+---+ Connecting to device...");
try {
lastException = null;
lastPacket = null;
if (connectingMethod == BluetoothModule.BT_StandardConnection
|| connectingMethod == BluetoothModule.BT_ConnectionTBD)
try {
socket = fetchBT_Socket_Normal();
connectToSocket(socket);
listenForIncomingSPP_Packets();
onConnetionEstablished();
return BluetoothModule.BT_StandardConnection;
} catch (BluetoohConnectionException e) {
socket = null;
if (connectingMethod == BluetoothModule.BT_StandardConnection) {
throw e;
}
logWarning("Error creating socket!", e);
}
if (connectingMethod == BluetoothModule.BT_ReflectiveConnection
|| connectingMethod == BluetoothModule.BT_ConnectionTBD)
try {
socket = fetchBT_Socket_Reflection(1);
connectToSocket(socket);
listenForIncomingSPP_Packets();
onConnetionEstablished();
return BluetoothModule.BT_ReflectiveConnection;
} catch (BluetoohConnectionException e) {
socket = null;
if (connectingMethod == BluetoothModule.BT_ReflectiveConnection) {
throw e;
}
logWarning("Error creating socket!", e);
}
throw new BluetoohConnectionException("Error creating RFcomm socket for BT Device:" + this
+ "\n BAD connectingMethod==" + connectingMethod);
} finally {
connecting = false;
}
}
protected void onConnetionEstablished() {
logInfo("+---+ Connection established");
}
private synchronized void listenForIncomingSPP_Packets() {
if (socketListeningThread != null)
throw new BadImplementationException("Already lisening on Socket for BT Device" + this);
logInfo("+---+ Listening for incoming packets");
socketListeningThread = new Thread(socketListener, "Packet Listener - " + bluetoothDevice.getName());
socketListeningThread.start();
}
private BluetoothSocket fetchBT_Socket_Normal()
throws BluetoohConnectionException {
try {
logInfo("+---+ Fetching BT RFcomm Socket standard for UUID: " + uuid + "...");
return bluetoothDevice.createRfcommSocketToServiceRecord(UUID.fromString(uuid));
} catch (Exception e) {
throw new BluetoohConnectionException("Error Fetching BT RFcomm Socket!", e);
}
}
private BluetoothSocket fetchBT_Socket_Reflection(int connectionIndex)
throws BluetoohConnectionException {
Method m;
try {
logInfo("+---+ Fetching BT RFcomm Socket workaround index " + connectionIndex + "...");
m = bluetoothDevice.getClass().getMethod("createRfcommSocket", new Class[]{int.class});
return (BluetoothSocket) m.invoke(bluetoothDevice, connectionIndex);
} catch (Exception e) {
throw new BluetoohConnectionException("Error Fetching BT RFcomm Socket!", e);
}
}
private void connectToSocket(BluetoothSocket socket)
throws BluetoohConnectionException {
try {
logInfo("+---+ Connecting to socket...");
socket.connect();
logInfo("+---+ Connected to socket");
} catch (IOException e) {
try {
socket.close();
} catch (IOException e1) {
logError("Error while closing socket", e1);
} finally {
socket = null;
}
throw new BluetoohConnectionException("Error connecting to socket with Device" + this, e);
}
}
答案 0 :(得分:0)
经过很长时间的调查,我发现了一个错误的原因......在某些Android设备上,未启用/允许自动蓝牙对等。
所以,显然除了两种连接方法外,还有两种蓝牙适配器启用方法,一种是要求系统打开适配器,另一种是调用BluetoothAdapter.enable( )方法,可以无声地启用蓝牙。
第一种方法,弹出确认对话框,要求用户互动,而另一种方法没有,并且在未显示蓝牙启用确认对话框的同时,也未显示对等确认,这会导致连接错误。
使用第一个适配器启用方法解决了大多数设备上的问题,例如Nexus 7,Samsung S3和其他一些设备,但在某些设备上仍存在问题,我不确定为什么,但这要好得多,因为现在许多设备正在使用新的实现。