Menghubungkan Android ke Printer Termal Bluetooth
Aplikasi kasir (point-of-sale) dan logistik sering kali perlu mencetak struk pada printer termal yang ringkas. Alih-alih mewajibkan setiap aplikasi Android menulis kode Bluetooth khusus untuk berbagai merek printer, Thermal Printer Service dibangun menggunakan Kotlin sebagai PrintService native Android dengan PrinterDiscoverySession.
Desain ini terhubung langsung ke dialog cetak standar Android. Kapan pun pengguna memilih Cetak pada aplikasi Android apa pun, dokumen diteruskan ke layanan sebagai file PDF sementara, sehingga proses penyesuaian skala, pemformatan, dan transmisi Bluetooth dapat ditangani secara otomatis di latar belakang.

Mengubah Halaman PDF Menjadi Raster Titik Termal
- Printable width 58 mm
- 432 dots
- Printable width 80 mm
- 576 dots
- Resolusi
- 203 DPI
- Chunk write maksimum
- 1,024 bytes
Saat print job diterima, PdfRenderer bawaan Android mengubah setiap halaman PDF menjadi bitmap berkualitas tinggi. Karena ukuran dokumen standar tidak sesuai dengan kertas struk termal yang sempit, layanan ini otomatis memotong whitespace yang tidak terpakai, memusatkan teks, menerapkan padding atas dan bawah, serta menyesuaikan ukuran gambar dengan lebar head printer (432 dots untuk kertas 58 mm atau 576 dots untuk 80 mm pada 203 DPI).
Bitmap yang telah disesuaikan kemudian diubah menjadi gambar monokrom biner, di mana setiap piksel hitam mewakili titik panas pada kertas struk.
Membuat Perintah ESC/POS dan Mengelola Profil
- Dokumen Android
- File PDF Sementara
- Bitmap PdfRenderer
- Crop Whitespace dan Skala
- Konversi Monokrom
- Raster ESC/POS 24-Dot
- Penulisan Bluetooth per Chunk
Printer struk termal tidak membaca file font yang rumit; printer hanya mencetak titik hitam-putih berdasarkan instruksi byte ESC/POS tingkat rendah. Aplikasi ini mengubah bitmap monokrom menjadi array byte raster ESC/POS 24-dot di memori, menyusun baris-baris data menjadi potongan yang siap dikirim.
Untuk mendukung berbagai model printer di lapangan, konfigurasi disimpan secara lokal menggunakan SharedPreferences dan JSON. Tampilan daftar RecyclerView yang praktis memungkinkan operator menyimpan dan beralih antar profil printer dengan mudah (mengatur alamat Bluetooth, lebar kertas, skala densitas, pemotong otomatis, dan offset margin).
Menangani Koneksi Bluetooth dan Background Job
- Periksa ketersediaan hardware Bluetooth, status aktif, dan izin runtime Android 12 atau yang lebih baru.
- Muat profil printer yang dipilih dan dokumen PDF sementara.
- Buka socket RFCOMM SPP dengan strategi 4 kali percobaan ulang menggunakan jeda backoff 0 ms, 200 ms, 500 ms, dan 1.000 ms.
- Jalankan proses pencetakan pada background single-thread executor dengan dukungan CancellationToken agar antarmuka Android tetap responsif.
- Kirim data ESC/POS dalam ukuran chunk hingga 1.024 bytes dan tutup socket dengan aman saat selesai atau dibatalkan.
Dengan memisahkan rendering dokumen, encoding byte ESC/POS, dan pengelolaan koneksi Bluetooth ke dalam komponen-komponen terpisah, Thermal Printer Service menghadirkan pengalaman cetak struk yang lancar dan andal untuk penggunaan Android sehari-hari.