Skip to content

Instantly share code, notes, and snippets.

@narayanacharya6
Last active June 18, 2023 11:33
Show Gist options
  • Save narayanacharya6/3cfb7b083dc677ff330648ff63e32c42 to your computer and use it in GitHub Desktop.
Save narayanacharya6/3cfb7b083dc677ff330648ff63e32c42 to your computer and use it in GitHub Desktop.
A background service class for handling all your bluetooth communication wit another bluetooth module on Arduino, etc.
import android.app.Service;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.UUID;
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
}
//clear all string data
recDataString.delete(0, recDataString.length());
}
};
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;
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();
}
}
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
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
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();
}
}
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();
}
}
}
}
Add the above BluetoothDataService.java to your project.
Add the entry for this service in your manifest - <service android:name=".BluetoothDataService"/>
Add permissions for Bluetooth and Bluetooth Admin in your manifest.
Please do go through the code once and make changes when reading and writing data to the bluetooth socket as per your application requirements.
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
First appeared here - http://stackoverflow.com/a/33461686/5512274
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment