BluetoothSocket.connect () - Из документации :
Попытка подключения к удаленному устройству.Этот метод будет блокироваться до тех пор, пока не будет установлено соединение или соединение не будет установлено.Если этот метод возвращает без исключения, то этот сокет теперь подключен.
Чтобы ваш вызов BluetoothSocket.connect () мог выйти из блокировки, необходимо установить соединение.Это сделано специально, и это имеет смысл, если вы подумаете об этом, получите адрес устройства Bluetooth, к которому мы хотим подключиться, вызовем .connect () и заблокируем до его подключения.Вот почему вам нужны отдельные потоки.
Насколько вы вызываете .close (), если вы решаете проблемы с .connect (), .close () должен встать на свои места.
Пожалуйста, прочитайте это .В основном это говорит о том, что вам нужен отдельный поток, называемый «подключением» (.connect ()) и «подключенным» (InputStream.read ()).Таким образом, ваш пользовательский интерфейс не будет заблокирован.
Пример (по ссылке выше).ConnectThread инициирует соединение.ConnectedThread управляет соединением (читает / записывает данные и т. Д.).
private class ConnectThread extends Thread {
private final BluetoothSocket mmSocket;
private final BluetoothDevice mmDevice;
public ConnectThread(BluetoothDevice device) {
// Use a temporary object that is later assigned to mmSocket,
// because mmSocket is final
BluetoothSocket tmp = null;
mmDevice = device;
// Get a BluetoothSocket to connect with the given BluetoothDevice
try {
// MY_UUID is the app's UUID string, also used by the server code
tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
} catch (IOException e) { }
mmSocket = tmp;
}
public void run() {
// Cancel discovery because it will slow down the connection
mBluetoothAdapter.cancelDiscovery();
try {
// Connect the device through the socket. This will block
// until it succeeds or throws an exception
mmSocket.connect();
} catch (IOException connectException) {
// Unable to connect; close the socket and get out
try {
mmSocket.close();
} catch (IOException closeException) { }
return;
}
// Do work to manage the connection (in a separate thread)
manageConnectedSocket(mmSocket);
}
/** Will cancel an in-progress connection, and close the socket */
public void cancel() {
try {
mmSocket.close();
} catch (IOException e) { }
}
}
private class ConnectedThread extends Thread {
private final BluetoothSocket mmSocket;
private final InputStream mmInStream;
private final OutputStream mmOutStream;
public ConnectedThread(BluetoothSocket socket) {
mmSocket = socket;
InputStream tmpIn = null;
OutputStream tmpOut = null;
// Get the input and output streams, using temp objects because
// member streams are final
try {
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (IOException e) { }
mmInStream = tmpIn;
mmOutStream = tmpOut;
}
public void run() {
byte[] buffer = new byte[1024]; // buffer store for the stream
int bytes; // bytes returned from read()
// Keep listening to the InputStream until an exception occurs
while (true) {
try {
// Read from the InputStream
bytes = mmInStream.read(buffer);
// Send the obtained bytes to the UI Activity
mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer)
.sendToTarget();
} catch (IOException e) {
break;
}
}
}
/* Call this from the main Activity to send data to the remote device */
public void write(byte[] bytes) {
try {
mmOutStream.write(bytes);
} catch (IOException e) { }
}
/* Call this from the main Activity to shutdown the connection */
public void cancel() {
try {
mmSocket.close();
} catch (IOException e) { }
}
}