问题
i need some help, can you explain to me how can i implement the Bluetooth Connection from my Application into my Mini Thermal Printer Device.
The scenario is like this. I already connect my application into device but when the Activity destroyed, the connection also disconnected. Yes, i am aware that when the activity destroyed all the task within the activity is affected. The device has it's own SDK. and that what i am using now.
That's why, i really need your help to get over on this problem. There are some documentation about this but it is not all clear for me.
if you have a sample project, can i use it as a guide. that would be appreciated.
Sorry for the English Grammar.
Please help me on this. Thanks in Advance :)
回答1:
You can move all your Bluetooth connection code into a Service class.
Consider using this as a roadmap.
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();
}
}
}
}
This is a lot of code to digest and requires knowing things like Threads and Handlers with Bluetooth Connection.
Not sure of your expertise so there are a few comments which will help you to study the code and Log messages with will help you with understanding of the flow of the code.
Also make sure you declare this service in the Manifest file AndroidManifest.xml
<service android:name=".BluetoothDataService"/>
Some topics that you will need to be familiar with
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
回答2:
Narayan's answer needs a corrections. I believe the onStartCommand function should read.
@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);//`enter code here`
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);
}
来源:https://stackoverflow.com/questions/33461075/implement-bluetooth-connection-into-service-or-application-class-without-losing