How to Use the Terminal's Bluetooth Printer Service: Difference between revisions

From wizarPOS
Line 126: Line 126:
Send and print
Send and print
<syntaxhighlight lang="java" line='line'>
<syntaxhighlight lang="java" line='line'>
final byte[][] byteCommands = { { 0x1b, 0x40 }, //printer command
final byte[][] byteCommands = { { 0x1b, 0x40 }, //printer commands(ESC commands)
{ 0x1b, 0x4d, 0x00 },
{ 0x1b, 0x4d, 0x00 },
{ 0x1b, 0x4d, 0x01 },
{ 0x1b, 0x4d, 0x01 },

Revision as of 08:30, 17 April 2018

This service demonstrates how to use a set of Bluetooth APIs to print image or text. The integrity process of Bluetooth print service includes opening Bluetooth,scanning the Bluetooth devices surrounding,pairing with a Bluetooth device and connecting with the device with SPP, and then sending data,which always shows in types of image and text document, and printing the data.

Introduction

Bluetooth printing is a service what terminal, which get a connection with buletooth printer,sending data to the printer through the connection and then the printer data printing the data.And the connection is built by terminal with SPP(Serial Port Profile). The process of the service:

  1. open bluetooth if doesn't open.
  2. scan and discovery the bluetooth devices surrounding
  3. select and pair the bluetooth printer
  4. send data that is a series of ESC command
  5. printer print the data

The completation

You can use the shortcuts feature in Android 7.1 (API 25) to bring users from the launcher directly to key actions within your app. Users simply long-press your app's launcher icon to reveal the app's shortcuts, then tap on a shortcut to jump to the associated action. These shortcuts are a great way to engage users, and they let you surface the functionality of your app even before users launch your app.

Each shortcut references an intent, each of which launches a specific action or task, and you can create a shortcut for any action that you can express as an intent. For example, you can create intents for sending a new text message, making a reservation, playing a video, continuing a game, loading a map location, and much more.

You can create shortcuts for your app statically by adding them to a resource file in the APK, or you can add them dynamically at runtime. Static shortcuts are ideal for common actions, and dynamic shortcuts let you highlight actions based on users' preferences, behavior, location, and so on. This sample demonstrates both types of shortcuts.

You can offer up to five shortcuts in each of your apps.

After your app adds shortcuts, they're available on any launcher that supports them, such as the Pixel launcher (the default launcher on Pixel devices), the Now launcher (the default launcher on Nexus devices), and other launchers that provide support.

Pre-requisites:
  1. Android SDK 24
  2. Android Build Tools v27.0.0
  3. Android Support Repository
  4. zxing
Getting Started:

This service uses the Gradle build system. To build this project, use the "gradlew build" command or use "Import Project" in Android Studio.

The part of code was shown below:

basic PAIs of Bluetooth

    public void openBluetooth(Activity activity) {
        Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
        activity.startActivityForResult(enableBtIntent, 1);
    }
    public void closeBluetooth() {
        this.bluetoothAdapter.disable();
    }
    public void searchDevices() {
        this.bluetoothAdapter.startDiscovery();
    }
    private BroadcastReceiver receiver = new BroadcastReceiver() {
        ProgressDialog progressDialog = null;
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                if (device.getBondState() == BluetoothDevice.BOND_BONDED) {
                    addBondDevice(device);
                } else {
                    addUnbondDevice(device);
                }
            } else if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
            	BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            	String msg = "ACTION_ACL_CONNECTED: " + device.getAddress() + "=" + device.getBondState();
            	Toast.makeText(context, msg, Toast.LENGTH_LONG).show();
            	System.out.println(msg);
            } else if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) {
                progressDialog = ProgressDialog.show(context, "pair...","...", true);
            } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED .equals(action)) {
                bluetoothAdapter.cancelDiscovery();
                if (progressDialog != null)
                	progressDialog.dismiss();
                addUnbondDevicesToListView();
                addBondDevicesToListView();
            } else if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) {
            	int state = bluetoothAdapter.getState();
                if (state == BluetoothAdapter.STATE_ON) {
                    searchDevices.setEnabled(true);
                    bondDevicesListView.setEnabled(true);
                    unbondDevicesListView.setEnabled(true);
                } else if (state == BluetoothAdapter.STATE_OFF) {
                    searchDevices.setEnabled(false);
                    bondDevicesListView.setEnabled(false);
                    unbondDevicesListView.setEnabled(false);
                } else {
                    System.out.println("Bluetooth.STATE: " + state);
                }
            } else {
                System.out.println("Bluetooth.ACTION: " + action);
            }
        }
    };

Connection with SPP

public boolean connect() {
	if (!isConnected) {
		try {
			bluetoothSocket = createBluetoothSocket();
			bluetoothSocket.connect();
			outputStream = bluetoothSocket.getOutputStream();
			isConnected = bluetoothSocket.isConnected();
			if (this.bluetoothAdapter.isDiscovering()) {
				Toast.makeText(this.context, "success to connect",1).show();
				this.bluetoothAdapter.isDiscovering();
			}
		} catch (Exception e) {
			e.printStackTrace();
			Toast.makeText(this.context, "fail to  connect", 1).show();

			return false;
		}
	}
	Toast.makeText(this.context, this.device.getName() + "connected",Toast.LENGTH_SHORT).show();
	return true;
}

private BluetoothSocket createBluetoothSocket()
		throws IOException, NoSuchMethodException, IllegalAccessException, InvocationTargetException {
	switch (TYPE_OF_CREATING_SOCKET) {
	case 0:	return device.createRfcommSocketToServiceRecord(uuid);
	case 1: return device.createInsecureRfcommSocketToServiceRecord(uuid);
	default:
		Method m = device.getClass().getMethod("createRfcommSocket", new Class[] {int.class});
		return (BluetoothSocket) m.invoke(device, 1);
	}
}

Send and print

final byte[][] byteCommands = { { 0x1b, 0x40 }, //printer commands(ESC commands)
		{ 0x1b, 0x4d, 0x00 },
		{ 0x1b, 0x4d, 0x01 },
		{ 0x1d, 0x21, 0x00 },
		{ 0x1d, 0x21, 0x11 },
		{ 0x1b, 0x45, 0x00 },
		{ 0x1b, 0x45, 0x01 },
		{ 0x1b, 0x7b, 0x00 },
		{ 0x1b, 0x7b, 0x01 },
		{ 0x1d, 0x42, 0x00 },
		{ 0x1d, 0x42, 0x01 },
		{ 0x1b, 0x56, 0x00 },
		{ 0x1b, 0x56, 0x01 },
public void selectCommand() {
	new AlertDialog.Builder(context).setTitle("Commands").setItems(items, new DialogInterface.OnClickListener() {
				@Override
				public void onClick(DialogInterface dialog, int which) {
					if (isConnected) {
						try {
							outputStream.write(byteCommands[which]);
						} catch (IOException e) {
							Toast.makeText(context, "write exception",Toast.LENGTH_SHORT).show();
						}
					} else {
						Toast.makeText(context, "connection is lost",Toast.LENGTH_SHORT).show();
					}
				}
			}).create().show();
}
public void write(byte[] buff){
	try {
		outputStream.write(buff);
	} catch (IOException e) {
	}
}