Я действительно не знаю, что я делаю неправильно, но это моя ситуация. Я общаюсь с модулем Bluetooth HC-05 и отправляю и получаю несколько байтов. Я использую образец BluetoothChat от android dev, чтобы упростить мою проблему. Вы можете найти класс BluetoothService здесь:
BluetoothService.java
и фрагмент, где я получаю сообщение здесь:
BluetootChatFragment.java
Эта функция внутри класса BluetoothService, модифицированная для получения данных:
public void run() {
Log.i(TAG, "BEGIN mConnectedThread");
byte[] buffer = new byte[1024];
int bytes;
// Keep listening to the InputStream while connected
while (mState == STATE_CONNECTED) {
try {
// Read from the InputStream
bytes = mmInStream.read(buffer);
int[] bArray = new int[bytes]
for(int i =0; i < bArray; i++) {
bArray[i] = buffer[i] & 255;
}
// Send the obtained bytes to the UI Activity
mHandler.obtainMessage(Constants.MESSAGE_READ, bytes, -1, new String(bArray, 0, bytes)
.sendToTarget();
} catch (IOException e) {
Log.e(TAG, "disconnected", e);
connectionLost();
break;
}
}
}
Здесь вместо этого используется функция обработчика, вызванная предыдущим:
private final Handler mHandler = new Handler() {
public void handleMessage(Message message) {
switch (message.what) {
case 2:
String str = (String) message.obj;
mConversationArrayAdapter.add(mConnectedDeviceName + ": " + str);
}
default:
return;
}
}
Таким образом, все работает нормально, и я получаю:
0C 03 00 02 01 1C 04 CB AF 97 7F AC 07
, но я хочу оставить класс BluetoothService более общим, поэтому я переместил цикл for в другой класс.
Класс BluetoothService:
public void run() {
Log.i(TAG, "BEGIN mConnectedThread");
byte[] buffer = new byte[1024];
int bytes;
// Keep listening to the InputStream while connected
while (mState == STATE_CONNECTED) {
try {
// Read from the InputStream
bytes = mmInStream.read(buffer);
// Send the obtained bytes to the UI Activity
mHandler.obtainMessage(Constants.MESSAGE_READ, bytes, -1, buffer)
.sendToTarget();
} catch (IOException e) {
Log.e(TAG, "disconnected", e);
connectionLost();
break;
}
}
}
Фрагмент BluetoothChat с обработчиком:
// this is a class variable
private StringBuilder sb = new StringBuilder();
private final Handler mHandler = new Handler() {
public void handleMessage(Message message) {
switch (message.what) {
case 2:
int[] bArray = new int[message.arg1]
for(int i =0; i < bArray; i++) {
bArray[i] = message.obj[i] & 255;
}
String str = new String(bArray, 0, message.arg1);
sb.append(str);
mConversationArrayAdapter.add(mConnectedDeviceName + ": " + sb.toString());
}
default:
return;
}
}
На данный момент то, что я получаю из потока Bluetooth, выглядит примерно так:
0C 00 02 01 02 01 02 01 97 7F 02 01
У вас есть предложения по решению проблемы? Похоже, что проблема синхронизации или проблема с обратным вызовом (синхронизацией), или цикл for, на данный момент, слишком медленная.
Я использую Android Studio 3.5 и 8.0 (API Level 26)
Спасибо