我有一台蓝牙设备连接了我在4.4.2之前尝试的所有Android版本。现在,它没有连接Galaxy Tab 4或S3。 Tab 3与4.1.2连接良好。尝试初始化AcceptThread
时,问题似乎发生在BluetoothSocket
。我正在使用的代码基于sdk中的聊天示例。
我的接受代码
private class AcceptThread extends Thread {
// The local server socket
private BluetoothServerSocket mmServerSocket;
public boolean successInit = false;
public AcceptThread() {
closeAllConnections();
BluetoothServerSocket tmp = null;
// Create a new listening server socket
while(!successInit) {
try {
tmp = mAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID);
successInit= true;
Log.i("TAG", "Socket Server Created");
}
catch(Exception e) {
Log.i("TAG", e.getMessage());
successInit = false;
}
}
mmServerSocket = tmp;
}
public void run() {
BluetoothSocket socket = null;
// Listen to the server socket if we're not connected
Log.i("BluetoothComService", String.valueOf(mState));
while (mState != STATE_CONNECTED) {
try {
// This is a blocking call and will only return on a
// successful connection or an exception
mAdapter.cancelDiscovery();
socket = BluetoothAdapter.getDefaultAdapter()
.getRemoteDevice(getThermMAC())
.createRfcommSocketToServiceRecord(UUID
.fromString("00001101-0000-1000-8000-00805F9B34FB"));
// socket = mmServerSocket.accept(); // here socket might be closed or timeout
Log.e("BluetoothComService", "No accept Exception");
}catch (IOException e) {
Log.e("TAG", e.getMessage());
}
上面的 getThermMAC()
是我返回绑定设备地址的方法。
在run()
中,如果我使用
socket=BluetoothAdapter.getDefaultAdapter()
.getRemoteDevice(getThermMAC())
.createRfcommSocketToServiceRecord(UUID
.fromString("00001101-0000-1000-8000-00805F9B34FB"));
然后我在Android框架中NPE
的第501行获得了BluetoothSocket.java
int left = b.length;
因此,b
似乎是null
,但它似乎不是在调试之后。 b
是byte[]
从我的BluetoothService
班级发送的,它会在byte[]
内发送一个全新的,已初始化的ConnectedThread
,就像sdk示例所做的那样正如我在旧版本上做的那样。
如果我发表评论并尝试使用
socket = mmServerSocket.accept();
过去一直在工作,然后我得到了
bt socket is not in listen state
所以,我不知道如何把它置于“听状态”或为什么不会。有没有人经历过这个或知道如何解决它?或者如果我使用第一个片段(如果这是正确的话),如何避免获得NPE
。
我找到了
当我收到IOException
时,我发现this post导致我here,但这并没有让我任何地方。
注意:赏金消息说4.4.4但是Tab 4上是4.4.2
设备错误
首次通过USB将设备连接到计算机时,我也注意到这些蓝牙错误
09-05 15:18:03.217: E/BluetoothServiceJni(15148): SOCK FLAG = 0 ***********************
09-05 15:18:13.177: E/BluetoothServiceJni(15148): SOCK FLAG = 0 ***********************
09-05 15:18:13.217: E/BluetoothServiceJni(15148): SOCK FLAG = 0 ***********************
但我无法找出那面旗帜的含义。
我意识到BT堆栈4.x(See one of many bug reports)
中存在已知错误 minSDK
目前是10.但是,如果我找到一个可行的解决方案,那么我可以解决这个问题。
答案 0 :(得分:1)
尝试此代码,此在nexus 7上运行android 4.4.2
private boolean refreshDeviceCache(BluetoothGatt gatt){
try {
BluetoothGatt localBluetoothGatt = gatt;
Method localMethod = localBluetoothGatt.getClass().getMethod("refresh", new Class[0]);
if (localMethod != null) {
boolean bool = ((Boolean) localMethod.invoke(localBluetoothGatt, new Object[0])).booleanValue();
return bool;
}
}
catch (Exception localException) {
Log.e(TAG, "An exception occured while refreshing device");
}
return false;
}
public boolean connect(final String address) {
if (mBluetoothAdapter == null || address == null) {
Log.w(TAG,"BluetoothAdapter not initialized or unspecified address.");
return false;
}
// Previously connected device. Try to reconnect.
if (mBluetoothGatt != null) {
Log.d(TAG,"Trying to use an existing mBluetoothGatt for connection.");
if (mBluetoothGatt.connect()) {
return true;
} else {
return false;
}
}
final BluetoothDevice device = mBluetoothAdapter
.getRemoteDevice(address);
if (device == null) {
Log.w(TAG, "Device not found. Unable to connect.");
return false;
}
// We want to directly connect to the device, so we are setting the
// autoConnect
// parameter to false.
mBluetoothGatt = device.connectGatt(MyApp.getContext(), false, mGattCallback));
refreshDeviceCache(mBluetoothGatt);
Log.d(TAG, "Trying to create a new connection.");
return true;
}
答案 1 :(得分:0)
我还使用了相同代码的连接步骤,但这只适用于智能Android设备。
您可以获取要连接的特定设备的BluetoothDevice对象。 之后,您可以通过反射使用BluetoothHeadset的连接和断开连接方法连接到特定的BluetoothDevice。
Class<?> BTHeadset = Class.forName("android.bluetooth.BluetoothHeadset");
Method conn = BTHeadset.getMethod("connect", new Class[] {BluetoothDevice.class});
conn.invoke(BTHeadset, new Object[] {btDev});
您可以使用相同的代码通过反射使用disconnect方法断开设备连接。