| 
				     | 
				
| (30 intermediate revisions by 3 users not shown) | 
| Line 1: | 
Line 1: | 
 | 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.
  |  | {{Migrating|https://smartpossdk.gitbook.io/cloudpossdk/faq/printer/use-terminal-bluetooth-printer}}  | 
 |    |  | 
 | == 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:
  |  | 
 | # open bluetooth if doesn't open.
  |  | 
 | # scan and discovery the bluetooth devices surrounding
  |  | 
 | # select and pair the bluetooth printer
  |  | 
 | # send data that is a series of ESC command
  |  | 
 | # printer print the data
  |  | 
 |    |  | 
 | == Pre-requisites: ==
  |  | 
 | # Android SDK 24
  |  | 
 | # Android Build Tools v27.0.0
  |  | 
 | # Android Support Repository
  |  | 
 | # 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
  |  | 
 | <syntaxhighlight lang="java" line='line'>
  |  | 
 |     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);
  |  | 
 |             }
  |  | 
 |         }
  |  | 
 |     };
  |  | 
 | </syntaxhighlight>
  |  | 
 | Connection with SPP 
  |  | 
 | <syntaxhighlight lang="java" line='line'>
  |  | 
 | 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);
  |  | 
 | 	}
  |  | 
 | }
  |  | 
 | </syntaxhighlight>
  |  | 
 | Send and print
  |  | 
 | <syntaxhighlight lang="java" line='line'>
  |  | 
 | 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) {
  |  | 
 | 	}
  |  | 
 | }
  |  | 
 | </syntaxhighlight>
  |  |