Quantcast
Channel: The Code of a Ninja
Viewing all articles
Browse latest Browse all 100

Android Bluetooth Code to Print Text on a Bluetooth Printer

$
0
0
Recently, I was asked to make a program for printing some data to a small or handheld Bluetooth printer device. This can be used for printing receipts, simple tickets, or customer notes. I like how it works because usually, we are getting our program output on a computer screen, but  this time we are getting our output on a tangible paper!

android bluetooth code example
Click to enlarge.

This code will simply let you connect to the Bluetooth printer, type a text that you want to be printed and click the "send" button to print.


android bluetooth tutorial code download

MainActivity.java - contains button listeners and functions for bluetooth connection, sending data, etc.

packagecom.example.bluetoothprinter;

importandroid.app.Activity;
importandroid.bluetooth.BluetoothAdapter;
importandroid.bluetooth.BluetoothDevice;
importandroid.bluetooth.BluetoothSocket;
importandroid.content.Intent;
importandroid.os.Bundle;
importandroid.os.Handler;
importandroid.view.View;
importandroid.widget.TextView;
importandroid.widget.EditText;
importandroid.widget.Button;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.util.Set;
importjava.util.UUID;

publicclassMainActivityextendsActivity {

// will show the statuses
TextView myLabel;

// will enable user to enter any text to be printed
EditText myTextbox;

// android built in classes for bluetooth operations
BluetoothAdapter mBluetoothAdapter;
BluetoothSocket mmSocket;
BluetoothDevice mmDevice;

OutputStream mmOutputStream;
InputStream mmInputStream;
Thread workerThread;

byte[] readBuffer;
int readBufferPosition;
int counter;
volatile boolean stopWorker;

@Override
publicvoidonCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

try {

// we are goin to have three buttons for specific functions
Button openButton = (Button) findViewById(R.id.open);
Button sendButton = (Button) findViewById(R.id.send);
Button closeButton = (Button) findViewById(R.id.close);

myLabel = (TextView) findViewById(R.id.label);
myTextbox = (EditText) findViewById(R.id.entry);

// open bluetooth connection
openButton.setOnClickListener(newView.OnClickListener() {
publicvoidonClick(Viewv) {
try {
findBT();
openBT();
} catch (IOException ex) {
}
}
});

// send data typed by the user to be printed
sendButton.setOnClickListener(newView.OnClickListener() {
publicvoidonClick(Viewv) {
try {
sendData();
} catch (IOException ex) {
}
}
});

// close bluetooth connection
closeButton.setOnClickListener(newView.OnClickListener() {
publicvoidonClick(Viewv) {
try {
closeBT();
} catch (IOException ex) {
}
}
});

} catch (NullPointerException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}

/*
* This will find a bluetooth printer device
*/

voidfindBT() {

try {
mBluetoothAdapter =BluetoothAdapter.getDefaultAdapter();

if (mBluetoothAdapter ==null) {
myLabel.setText("No bluetooth adapter available");
}

if (!mBluetoothAdapter.isEnabled()) {
Intent enableBluetooth =newIntent(
BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBluetooth, 0);
}

Set<BluetoothDevice> pairedDevices = mBluetoothAdapter
.getBondedDevices();
if (pairedDevices.size() >0) {
for (BluetoothDevice device : pairedDevices) {

// MP300 is the name of the bluetooth printer device
if (device.getName().equals("MP300")) {
mmDevice = device;
break;
}
}
}
myLabel.setText("Bluetooth Device Found");
} catch (NullPointerException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}

/*
* Tries to open a connection to the bluetooth printer device
*/

voidopenBT() throwsIOException {
try {
// Standard SerialPortService ID
UUID uuid =UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");
mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid);
mmSocket.connect();
mmOutputStream = mmSocket.getOutputStream();
mmInputStream = mmSocket.getInputStream();

beginListenForData();

myLabel.setText("Bluetooth Opened");
} catch (NullPointerException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}

/*
* After opening a connection to bluetooth printer device,
* we have to listen and check if a data were sent to be printed.
*/

voidbeginListenForData() {
try {
finalHandler handler =newHandler();

// This is the ASCII code for a newline character
finalbyte delimiter =10;

stopWorker =false;
readBufferPosition =0;
readBuffer =newbyte[1024];

workerThread =newThread(newRunnable() {
publicvoidrun() {
while (!Thread.currentThread().isInterrupted()
&&!stopWorker) {

try {

int bytesAvailable = mmInputStream.available();
if (bytesAvailable >0) {
byte[] packetBytes =newbyte[bytesAvailable];
mmInputStream.read(packetBytes);
for (int i =0; i < bytesAvailable; i++) {
byte b = packetBytes[i];
if (b == delimiter) {
byte[] encodedBytes =newbyte[readBufferPosition];
System.arraycopy(readBuffer, 0,
encodedBytes, 0,
encodedBytes.length);
finalString data =newString(
encodedBytes, "US-ASCII");
readBufferPosition =0;

handler.post(newRunnable() {
publicvoidrun() {
myLabel.setText(data);
}
});
} else {
readBuffer[readBufferPosition++] = b;
}
}
}

} catch (IOException ex) {
stopWorker =true;
}

}
}
});

workerThread.start();
} catch (NullPointerException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}

/*
* This will send data to be printed by the bluetooth printer
*/

voidsendData() throwsIOException {
try {

// the text typed by the user
String msg = myTextbox.getText().toString();
msg +="\n";

mmOutputStream.write(msg.getBytes());

// tell the user data were sent
myLabel.setText("Data Sent");

} catch (NullPointerException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}

/*
* Close the connection to bluetooth printer.
*/

voidcloseBT() throwsIOException {
try {
stopWorker =true;
mmOutputStream.close();
mmInputStream.close();
mmSocket.close();
myLabel.setText("Bluetooth Closed");
} catch (NullPointerException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}


activity_main.xml - our user interface, contains a TextView, EditText and three Buttons.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">

<TextView
android:id="@+id/label"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Type here:" />

<EditText
android:id="@+id/entry"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@id/label"
android:background="@android:drawable/editbox_background" />

<Button
android:id="@+id/open"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_below="@id/entry"
android:layout_marginLeft="10dip"
android:text="Open" />

<Button
android:id="@+id/send"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@id/open"
android:layout_toLeftOf="@id/open"
android:text="Send" />

<Button
android:id="@+id/close"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@id/send"
android:layout_toLeftOf="@id/send"
android:text="Close" />

</RelativeLayout>

AndroidManifest.xml - we are going to have a BLUETOOTH permission.

<manifestxmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.bluetoothprinter"
android:versionCode="1"
android:versionName="1.0">

<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15" />

<supports-screensandroid:anyDensity="true" />

<uses-permissionandroid:name="android.permission.BLUETOOTH" />

<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main">
<intent-filter>
<actionandroid:name="android.intent.action.MAIN" />

<categoryandroid:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>

Android Output:

UI on my Android phone.

Device Output:

android bluetooth printer
I shoud have typed "Google". Click to enlarge.

Thanks to a code from project green giant for helping me figure it out.

Viewing all articles
Browse latest Browse all 100