Pobrałem próbkę aplikacji czatu Bluetooth do przesyłania tekstu między dwoma urządzeniami z Androidem za pomocą Bluetooth.Nie można wysłać danych tekstowych między dwoma urządzeniami bluetooth w systemie Android?
Mam zainstalowany i uruchomić tę aplikację na dwóch urządzeniach z systemem Android.
ja w obliczu wielu problemów w tym kodzie
- odkrycie usługi nie powiodło się wyjątek - Poprawiono
- java.io.IOException: Oprogramowanie spowodowało przerwanie połączenia - Fixed
- java.io.IOException : Połączenie resetowane przez Peer - Uderzył w to
1. wyczyszczone odkrycie usługi nie powiodło się wyjątek:
Do wykrywania usług powiodło wyjątku, Bluetooth Chat Service, Sprawdziłem wersję SDK dla wersji SDK, który jest większy niż Ginger Bread,
I użyłem klasy Method, aby wywołać połączenie z gniazdem RfCOMM, a mój pierwszy wyjątek został rozwiązany w tym podejściu.
kod wyjątku
tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
Fixed Wyjątek kod
try {
if (Build.VERSION.SDK_INT < 9) {
try {
tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
} catch (IOException e1) {
e1.printStackTrace();
}
} else {
Method m = null;
try {
m = device.getClass().getMethod("createRfcommSocket",
new Class[] { int.class });
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
try {
tmp = (BluetoothSocket) m.invoke(device, 1);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
} catch (Exception e) {
Log.e(TAG, "create() failed", e);
}
2. Wyczyszczone java.io.IOException: Oprogramowanie spowodowało przerwanie połączenia
zrobiłem sprawdzenie czy InputStream jest dostępny
kod wyjątku
bytes = mmInStream.read(buffer);
kod Fixed Wyjątek
if (mmInStream.available() > 0) {
// Read from the InputStream
bytes = mmInStream.read(buffer);
Teraz mój problem jest gdy próbuję wysłać dane między podłączonymi urządzeniami, to rzuca się następujący komunikat o błędzie „Połączenie zostało zresetowane” podczas pisania do strumienia wyjściowego
kod Wyjątek:
public void write(byte[] buffer, int start, int end) {
mHandler.obtainMessage(BluetoothChat.MESSAGE_WRITE, -1, -1, buffer).sendToTarget();
if (mmOutStream !=null) {
try {
mmOutStream.write(buffer);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else{
Log.e("OutputStream Null","");
}
}
== Aktualizacja ==
Mimo to pokazuje, że oba urządzenia są podłączone, Accept metoda powraca nie
**06-19 10:30:23.625: D/BluetoothChatService(2630): connected
06-19 10:30:23.625: D/BluetoothChatService(2630): cancel Thread[AcceptThread,5,main]
06-19 10:30:23.625: V/BluetoothSocket.cpp(2630): abortNative
06-19 10:30:23.625: V/BluetoothSocket.cpp(2630): ...asocket_abort(50) complete
06-19 10:30:23.625: V/BluetoothSocket.cpp(2630): ...accept(50, RFCOMM) = -1 (errno 125)
06-19 10:30:23.632: E/BluetoothChatService(2630): accept() failed
06-19 10:30:23.632: E/BluetoothChatService(2630): java.io.IOException: Operation Canceled
06-19 10:30:23.632: E/BluetoothChatService(2630): at android.bluetooth.BluetoothSocket.acceptNative(Native Method)
Dzięki za odpowiedź, patrz mój Aktualizacja w pytaniu Dzięki –
Jakie są '' LEN_TYPE' LEN_SIZE' i tutaj, @ gtRfnkN? – ericn
ponieważ zawsze po prostu wysyłasz strumień bajtów, nie wiesz, gdzie zaczyna się wiadomość i gdzie się kończy. Aby tego dokonać, musisz przedłużyć wiadomość o własny protokół, w tym długość wiadomości, którą chcesz wysłać. więc dodałem 4 bajty na początku wiadomości dla długości (LEN_SIZE). podczas odbierania wiadomości najpierw odczytuję tę wartość, a następnie czekam, aż wszystkie dane zostaną odczytane. (patrz while (cPos
gtRfnkN