Last active
June 18, 2023 11:33
-
-
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | |
} | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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