我已经使用BluetoothChat示例来构建我的应用程序中的蓝牙连接。应用程序正确连接,并正确存储所有配对设备,但未正确报告丢失的连接。
我的手机连接的设备由小电池供电,闲置约30秒后关闭。我希望我的应用程序在此设备关闭时通知用户。我认为这将包含在BluetoothChat示例中,但我认为不是。
private class ConnectThread extends Thread {
private final BluetoothSocket mmSocket;
private final BluetoothDevice mmDevice;
private String mSocketType;
public ConnectThread(BluetoothDevice device, boolean secure) {
mmDevice = device;
BluetoothSocket tmp = null;
mSocketType = secure ? "Secure" : "Insecure";
try {
if (secure) {
tmp = device.createRfcommSocketToServiceRecord( MY_UUID
);
} else {
tmp = device.createInsecureRfcommSocketToServiceRecord(
MY_UUID );
}
} catch (IOException e) {
Log.e(TAG, "Socket Type: " + mSocketType + "create() failed", e);
}
mmSocket = tmp;
}
public void run() {
//Log.i(TAG, "BEGIN mConnectThread SocketType:" + mSocketType);
setName("ConnectThread" + mSocketType);
// Always cancel discovery because it will slow down a connection
mAdapter.cancelDiscovery();
// Make a connection to the BluetoothSocket
try {
// This is a blocking call and will only return on a
// successful connection or an exception
mmSocket.connect();
} catch (IOException e) {
// Close the socket
try {
mmSocket.close();
} catch (IOException e2) {
Log.e(TAG, "unable to close() " + mSocketType +
" socket during connection failure", e2);
}
connectionFailed();
return;
}
// Reset the ConnectThread because we're done
synchronized (BluetoothService.this) {
mConnectThread = null;
}
// Start the connected thread
connected(mmSocket, mmDevice, mSocketType);
}
public void cancel() {
RelayAPIModel.bluetoothConnected = false;
try {
mmSocket.close();
} catch (IOException e) {
Log.e(TAG, "close() of connect " + mSocketType + " socket failed", e);
}
}
}
ConnectedThread如下:
/**
* This thread runs during a connection with a remote device.
* It handles all incoming and outgoing transmissions.
*/
private class ConnectedThread extends Thread {
private final BluetoothSocket mmSocket;
private final InputStream mmInStream;
private final BufferedReader mmInBuffer;
private final OutputStream mmOutStream;
public ConnectedThread(BluetoothSocket socket, String socketType) {
Log.d(TAG, "create ConnectedThread: " + socketType);
mmSocket = socket;
InputStream tmpIn = null;
OutputStream tmpOut = null;
// Get the BluetoothSocket input and output streams
try {
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (IOException e) {
Log.e(TAG, "temp sockets not created", e);
}
RelayAPIModel.bluetoothConnected = true;
mmInStream = tmpIn;
mmOutStream = tmpOut;
mmInBuffer = new BufferedReader( new InputStreamReader( mmInStream ) );
}
public void run(int length) {
buffer = new byte[1024];
// Keep listening to the InputStream while connected
//while (true) {
try {
// Read from the InputStream
bytes = mmInStream.read(buffer, 0, length);
// Send the obtained bytes to the UI Activity
mHandler.obtainMessage(MainMenu.MESSAGE_READ, bytes, -1, buffer)
.sendToTarget();
} catch (IOException e) {
Message msg = mHandler.obtainMessage(MainMenu.MESSAGE_TOAST);
Bundle bundle = new Bundle();
bundle.putString( TOAST, "Device has disconnected from the Bluetooth Module." );
msg.setData(bundle);
mHandler.sendMessage(msg);
Log.e(TAG, "disconnected a", e);
connectionLost();
// Start the service over to restart listening mode
BluetoothService.this.start();
//break;
}
// }
}
/**
* Write to the connected OutStream.
* @param buffer The bytes to write
*/
public void write( byte[] buffer ) {
try {
mmOutStream.write(buffer);
// Share the sent message back to the UI Activity
mHandler.obtainMessage(MainMenu.MESSAGE_WRITE, -1, -1, buffer)
.sendToTarget();
} catch (IOException e) {
Log.e(TAG, "Exception during write", e);
}
}
public void cancel() {
RelayAPIModel.bluetoothConnected = false;
try {
mmSocket.close();
} catch (IOException e) {
Log.e(TAG, "close() of connect socket failed", e);
}
}
}
我也有这个connectionLost
函数,如果在ConnectedThread
中捕获到异常,应该调用它,但异常似乎永远不会被捕获。
private void connectionLost() {
// Send a failure message back to the Activity
Message msg = mHandler.obtainMessage(MainMenu.MESSAGE_TOAST);
RelayAPIModel.bluetoothConnected = false;
Bundle bundle = new Bundle();
bundle.putString(TOAST, "Device connection was lost");
msg.setData(bundle);
mHandler.sendMessage(msg);
Log.i("Here.", "Connection Lost" );
// Start the service over to restart listening mode
BluetoothService.this.start();
}
答案 0 :(得分:3)
您可以在广播接收器中覆盖onRecieve以获取蓝牙连接的断开意图。
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED.equals(action)) {
//disconnect request
} else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {
//disconnected, do what you want to notify user here, toast, or dialog, etc.
}
}
}