gpt4 book ai didi

android - 在不丢失与设备的连接的情况下将蓝牙连接实现到服务或应用程序类

转载 作者:太空宇宙 更新时间:2023-11-03 12:05:31 25 4
gpt4 key购买 nike

我需要一些帮助,你能向我解释一下如何将我的应用程序的蓝牙连接实现到我的迷你热敏打印机设备中吗?

场景是这样的。我已经将我的应用程序连接到设备,但是当 Activity 被销毁时,连接也断开了。是的,我知道当 Activity 销毁时, Activity 中的所有任务都会受到影响。该设备有自己的 SDK。那就是我现在正在使用的。

这就是为什么,我真的需要你的帮助来解决这个问题。有一些关于此的文档,但对我来说还不是很清楚。

如果您有示例项目,我可以将其用作指南吗?那将不胜感激。

对不起英语语法。

请帮我解决这个问题。提前致谢:)

最佳答案

您可以将所有蓝牙连接代码移动到服务类中。

考虑将其用作路线图。

public class BluetoothDataService extends Service {

final int handlerState = 0; //used to identify handler message
Handler bluetoothIn;
private BluetoothAdapter btAdapter = null;

private ConnectingThread mConnectingThread;
private ConnectedThread mConnectedThread;

private boolean stopThread;
// SPP UUID service - this should work for most devices
private static final UUID BTMODULEUUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
// String for MAC address
private static final String MAC_ADDRESS = "YOUR:MAC:ADDRESS:HERE";

private StringBuilder recDataString = new StringBuilder();

@Override
public void onCreate() {
super.onCreate();
Log.d("BT SERVICE", "SERVICE CREATED");
stopThread = false;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d("BT SERVICE", "SERVICE STARTED");
bluetoothIn = new Handler() {

public void handleMessage(android.os.Message msg) {
Log.d("DEBUG", "handleMessage");
if (msg.what == handlerState) { //if message is what we want
String readMessage = (String) msg.obj; // msg.arg1 = bytes from connect thread
recDataString.append(readMessage);

Log.d("RECORDED", recDataString.toString());
// Do stuff here with your data, like adding it to the database
}
recDataString.delete(0, recDataString.length()); //clear all string data
}
};


btAdapter = BluetoothAdapter.getDefaultAdapter(); // get Bluetooth adapter
checkBTState();
return super.onStartCommand(intent, flags, startId);
}

@Override
public void onDestroy() {
super.onDestroy();
bluetoothIn.removeCallbacksAndMessages(null);
stopThread = true;
if (mConnectedThread != null) {
mConnectedThread.closeStreams();
}
if (mConnectingThread != null) {
mConnectingThread.closeSocket();
}
Log.d("SERVICE", "onDestroy");
}

@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}

//Checks that the Android device Bluetooth is available and prompts to be turned on if off
private void checkBTState() {

if (btAdapter == null) {
Log.d("BT SERVICE", "BLUETOOTH NOT SUPPORTED BY DEVICE, STOPPING SERVICE");
stopSelf();
} else {
if (btAdapter.isEnabled()) {
Log.d("DEBUG BT", "BT ENABLED! BT ADDRESS : " + btAdapter.getAddress() + " , BT NAME : " + btAdapter.getName());
try {
BluetoothDevice device = btAdapter.getRemoteDevice(MAC_ADDRESS);
Log.d("DEBUG BT", "ATTEMPTING TO CONNECT TO REMOTE DEVICE : " + MAC_ADDRESS);
mConnectingThread = new ConnectingThread(device);
mConnectingThread.start();
} catch (IllegalArgumentException e) {
Log.d("DEBUG BT", "PROBLEM WITH MAC ADDRESS : " + e.toString());
Log.d("BT SEVICE", "ILLEGAL MAC ADDRESS, STOPPING SERVICE");
stopSelf();
}
} else {
Log.d("BT SERVICE", "BLUETOOTH NOT ON, STOPPING SERVICE");
stopSelf();
}
}
}

// New Class for Connecting Thread
private class ConnectingThread extends Thread {
private final BluetoothSocket mmSocket;
private final BluetoothDevice mmDevice;

public ConnectingThread(BluetoothDevice device) {
Log.d("DEBUG BT", "IN CONNECTING THREAD");
mmDevice = device;
BluetoothSocket temp = null;
Log.d("DEBUG BT", "MAC ADDRESS : " + MAC_ADDRESS);
Log.d("DEBUG BT", "BT UUID : " + BTMODULEUUID);
try {
temp = mmDevice.createRfcommSocketToServiceRecord(BTMODULEUUID);
Log.d("DEBUG BT", "SOCKET CREATED : " + temp.toString());
} catch (IOException e) {
Log.d("DEBUG BT", "SOCKET CREATION FAILED :" + e.toString());
Log.d("BT SERVICE", "SOCKET CREATION FAILED, STOPPING SERVICE");
stopSelf();
}
mmSocket = temp;
}

@Override
public void run() {
super.run();
Log.d("DEBUG BT", "IN CONNECTING THREAD RUN");
// Establish the Bluetooth socket connection.
// Cancelling discovery as it may slow down connection
btAdapter.cancelDiscovery();
try {
mmSocket.connect();
Log.d("DEBUG BT", "BT SOCKET CONNECTED");
mConnectedThread = new ConnectedThread(mmSocket);
mConnectedThread.start();
Log.d("DEBUG BT", "CONNECTED THREAD STARTED");
//I send a character when resuming.beginning transmission to check device is connected
//If it is not an exception will be thrown in the write method and finish() will be called
mConnectedThread.write("x");
} catch (IOException e) {
try {
Log.d("DEBUG BT", "SOCKET CONNECTION FAILED : " + e.toString());
Log.d("BT SERVICE", "SOCKET CONNECTION FAILED, STOPPING SERVICE");
mmSocket.close();
stopSelf();
} catch (IOException e2) {
Log.d("DEBUG BT", "SOCKET CLOSING FAILED :" + e2.toString());
Log.d("BT SERVICE", "SOCKET CLOSING FAILED, STOPPING SERVICE");
stopSelf();
//insert code to deal with this
}
} catch (IllegalStateException e) {
Log.d("DEBUG BT", "CONNECTED THREAD START FAILED : " + e.toString());
Log.d("BT SERVICE", "CONNECTED THREAD START FAILED, STOPPING SERVICE");
stopSelf();
}
}

public void closeSocket() {
try {
//Don't leave Bluetooth sockets open when leaving activity
mmSocket.close();
} catch (IOException e2) {
//insert code to deal with this
Log.d("DEBUG BT", e2.toString());
Log.d("BT SERVICE", "SOCKET CLOSING FAILED, STOPPING SERVICE");
stopSelf();
}
}
}

// New Class for Connected Thread
private class ConnectedThread extends Thread {
private final InputStream mmInStream;
private final OutputStream mmOutStream;

//creation of the connect thread
public ConnectedThread(BluetoothSocket socket) {
Log.d("DEBUG BT", "IN CONNECTED THREAD");
InputStream tmpIn = null;
OutputStream tmpOut = null;

try {
//Create I/O streams for connection
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (IOException e) {
Log.d("DEBUG BT", e.toString());
Log.d("BT SERVICE", "UNABLE TO READ/WRITE, STOPPING SERVICE");
stopSelf();
}

mmInStream = tmpIn;
mmOutStream = tmpOut;
}

public void run() {
Log.d("DEBUG BT", "IN CONNECTED THREAD RUN");
byte[] buffer = new byte[256];
int bytes;

// Keep looping to listen for received messages
while (true && !stopThread) {
try {
bytes = mmInStream.read(buffer); //read bytes from input buffer
String readMessage = new String(buffer, 0, bytes);
Log.d("DEBUG BT PART", "CONNECTED THREAD " + readMessage);
// Send the obtained bytes to the UI Activity via handler
bluetoothIn.obtainMessage(handlerState, bytes, -1, readMessage).sendToTarget();
} catch (IOException e) {
Log.d("DEBUG BT", e.toString());
Log.d("BT SERVICE", "UNABLE TO READ/WRITE, STOPPING SERVICE");
stopSelf();
break;
}
}
}

//write method
public void write(String input) {
byte[] msgBuffer = input.getBytes(); //converts entered String into bytes
try {
mmOutStream.write(msgBuffer); //write bytes over BT connection via outstream
} catch (IOException e) {
//if you cannot write, close the application
Log.d("DEBUG BT", "UNABLE TO READ/WRITE " + e.toString());
Log.d("BT SERVICE", "UNABLE TO READ/WRITE, STOPPING SERVICE");
stopSelf();
}
}

public void closeStreams() {
try {
//Don't leave Bluetooth sockets open when leaving activity
mmInStream.close();
mmOutStream.close();
} catch (IOException e2) {
//insert code to deal with this
Log.d("DEBUG BT", e2.toString());
Log.d("BT SERVICE", "STREAM CLOSING FAILED, STOPPING SERVICE");
stopSelf();
}
}
}
}

需要消化大量代码,需要了解线程和处理程序与蓝牙连接等知识。

不确定您的专业知识,因此有一些评论可以帮助您研究代码,日志消息将帮助您理解代码的流程。

还要确保在 list 文件 AndroidManifest.xml 中声明此服务

<service android:name=".BluetoothDataService"/>

一些你需要熟悉的话题

http://developer.android.com/guide/topics/connectivity/bluetooth.html

http://developer.android.com/reference/android/app/Service.html

http://developer.android.com/reference/java/lang/Thread.html

http://developer.android.com/reference/android/os/Handler.html

关于android - 在不丢失与设备的连接的情况下将蓝牙连接实现到服务或应用程序类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33461075/

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