gpt4 book ai didi

android - BluetoothChat 示例,无法识别丢失的连接

转载 作者:搜寻专家 更新时间:2023-11-01 09:03:02 24 4
gpt4 key购买 nike

我已使用 BluetoothChat 示例在我的应用程序中构建蓝牙连接。应用程序正确连接,并正确存储所有配对设备,但未正确报告丢失的连接。

我的手机连接的设备由一 block 小电池供电,并在闲置约 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();
}

最佳答案

现在,在您的广播接收器中,覆盖 onRecieve 以获取蓝牙连接的断开连接 Intent 。

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.
}
}
}

关于android - BluetoothChat 示例,无法识别丢失的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13823752/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com