У меня есть Bluetooth-устройство, подключенное во всех версиях Android, которое я пробовал до 4.4.2. Теперь он не подключается к Galaxy Tab 4 или S3. Вкладка 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"));
тогда я получаю NPE
в строке 501 BluetoothSocket.java
в фреймворке Android, который является этой строкой
int left = b.length;
Итак, кажется, что b
- null
, но, похоже, он не после отладки. b
- это byte[]
, который отправляется из моего класса BluetoothService
, который отправляет новый, инициализированный byte[]
из ConnectedThread
, как это делает пример sdk, и как я делал это в более старых версиях.
Если я прокомментирую это и попытаюсь использовать
socket = mmServerSocket.accept();
который работал в прошлом, затем я получаю
bt socket is not in listen state
Итак, я не знаю, как записать его в "состояние прослушивания" или почему это не так. Кто-нибудь испытал это или знает, как обходиться? Или как не получать NPE
, если я использую первый фрагмент (если это даже правильно).
Я нашел
Когда я получал IOException
, я нашел этот пост, который привел меня здесь, но это hasn 't получил меня где-нибудь.
Примечание: Сообщение о бонусе говорит 4.4.4, но это 4.4.2 на вкладке 4
Ошибки устройства
Я также замечаю эти ошибки Bluetooth, когда я впервые подключаю свое устройство к компьютеру через 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 stack 4.x(См. один из многих отчетов об ошибках)
minSDK
в настоящее время 10. Хотя, если я нахожу рабочее решение, то я могу обойти это.