My Daily Gist | Ferdinand Silva


Print Text On Bluetooth Thermal Printer Using Kotlin

 
package com.ferdinandsilva.printertest2
import android.annotation.SuppressLint
import android.bluetooth.BluetoothAdapter
import android.bluetooth.BluetoothDevice
import android.bluetooth.BluetoothManager
import android.bluetooth.BluetoothSocket
import android.content.Context
import android.os.Bundle
import android.util.Log
import android.widget.Toast
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedButton
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import com.ferdinandsilva.printertest2.ui.theme.PrinterTest2Theme
import java.io.IOException
import java.util.UUID
object PrinterConstants {
const val PRINTER_ADDRESS = "60:6E:41:62:92:F8"
const val PRINTER_SERVICE = "00001101-0000-1000-8000-00805f9b34fb"
}
var btAdapter: BluetoothAdapter? = null
var btDevice: BluetoothDevice? = null
var btSocket: BluetoothSocket? = null
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val bluetoothManager = getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager
btAdapter = bluetoothManager.adapter
btDevice = btAdapter?.getRemoteDevice(PrinterConstants.PRINTER_ADDRESS)
if (btAdapter == null) {
Toast.makeText(applicationContext, "Bluetooth not available", Toast.LENGTH_LONG).show()
} else {
if (btAdapter!!.isEnabled) {
val printerThread = PrinterThread(btDevice!!)
printerThread.start()
}
}
setContent {
PrinterTest2Theme {
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background
) {
PrintButton()
}
}
}
}
@SuppressLint("MissingPermission")
private class PrinterThread(private val device: BluetoothDevice) : Thread() {
private var thisSocket: BluetoothSocket? = null
init {
var tmp: BluetoothSocket? = null
try {
tmp = device.createRfcommSocketToServiceRecord(UUID.fromString(PrinterConstants.PRINTER_SERVICE))
} catch (e: IOException) {
// Handle IOException if needed
}
thisSocket = tmp
}
override fun run() {
btAdapter?.cancelDiscovery()
try {
thisSocket?.connect()
} catch (e: IOException) {
return
}
btSocket = thisSocket!!
}
}
}
@Composable
fun PrintButton() {
Column(
modifier = Modifier
.fillMaxWidth()
.fillMaxHeight(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
OutlinedButton(onClick = {
if (btSocket != null) {
try {
val out = btSocket?.outputStream
out?.write(byteArrayOf(27, 97, 1))
out?.write("This is a test print...\n".toByteArray())
} catch (e: IOException) {
}
}
}) {
Text("Test Print")
}
}
}
view raw MainActivity.kt hosted with ❤ by GitHub