UsbPrinterUtils.kt 4.39 KB
package com.diligrp.printer

import android.annotation.SuppressLint
import android.content.Context
import android.hardware.usb.UsbManager
import android.os.Handler
import android.os.Message
import android.util.Log
import android.widget.Toast
import com.android.print.sdk.PrinterConstants
import com.android.print.sdk.PrinterInstance
import com.diligrp.printer.utils.IPrinterOpertion
import com.diligrp.printer.utils.UsbOperation

/**
 * UsbPrinterUtils
 *
 * @Description:
 * @Author:
 * @CreateDate: 2025/8/11 12:38
 */
class UsbPrinterUtils {
    private var mPrinterOpertion: IPrinterOpertion? = null
    private var mPrinter: PrinterInstance? = null
    private var isConnected = false //是否已经建立了连接
    private var mContext: Context? = null

    companion object {
        const val LEFT = 0
        const val RIGHT = 2
        const val CENTER = 1

        const val LINE_BREAK = "\n"
        const val GAP_LINE = "--------------------------------${LINE_BREAK}"

        @SuppressLint("StaticFieldLeak")
        private var _instance: UsbPrinterUtils? = null

        fun getInstance(): UsbPrinterUtils {
            if (_instance == null) {
                _instance = UsbPrinterUtils()
            }

            return _instance!!
        }
    }

    fun initDevice(context: Context?) {
        if (context == null) {
            return
        }
        mContext = context
        mPrinterOpertion = UsbOperation(mContext, mHandler)
        val manager = mContext?.getSystemService(Context.USB_SERVICE) as UsbManager
        mPrinterOpertion!!.usbAutoConn(manager);
    }

    fun prepare() {
        if (mPrinter != null && isConnected) {
            mPrinter?.init()
        }
    }

    fun printTextLeft(str: String?) {
        if (mPrinter != null && isConnected && !str.isNullOrEmpty()) {
            mPrinter?.setPrinter(PrinterConstants.Command.ALIGN, LEFT)
            mPrinter?.printText(str)
        }
    }

    fun printTextCenter(str: String?) {
        Log.d("Test", "printTextCenter $mPrinter ------- $isConnected --------> $str")
        if (mPrinter != null && isConnected && !str.isNullOrEmpty()) {
            mPrinter?.setPrinter(PrinterConstants.Command.ALIGN, CENTER)
            mPrinter?.printText(str)
        }
    }

    fun printTextRight(str: String?) {
        if (mPrinter != null && isConnected && !str.isNullOrEmpty()) {
            mPrinter?.setPrinter(PrinterConstants.Command.ALIGN, RIGHT)
            mPrinter?.printText(str)
        }
    }

    fun printEmptyLine(count: Int) {
        if (mPrinter != null && isConnected) {
            mPrinter?.setPrinter(PrinterConstants.Command.ALIGN, LEFT)
            mPrinter?.setPrinter(PrinterConstants.Command.PRINT_AND_WAKE_PAPER_BY_LINE, count)
        }
    }

    fun printGapLine() {
        if (mPrinter != null && isConnected) {
            mPrinter?.setPrinter(PrinterConstants.Command.ALIGN, LEFT)
            mPrinter?.printText(GAP_LINE)
        }
    }

    fun onRelease() {
        mHandler.removeCallbacksAndMessages(null)
        isConnected = false
        mPrinterOpertion?.close()
        mPrinterOpertion = null
        mPrinter = null
        mContext = null
        _instance = null
    }

    //用于接受连接状态消息的 Handler
    private val mHandler: Handler by lazy {
        @SuppressLint("HandlerLeak")
        object : Handler() {

            @SuppressLint("HandlerLeak")
            override fun handleMessage(msg: Message) {
                super.handleMessage(msg)
                when (msg.what) {
                    PrinterConstants.Connect.SUCCESS -> {
                        isConnected = true;
                        mPrinter = mPrinterOpertion?.getPrinter()
                    }

                    PrinterConstants.Connect.FAILED -> {
                        showToast("打印机连接失败")
                    }

                    PrinterConstants.Connect.CLOSED -> {
                        isConnected = false;
//                        showToast("打印机已关闭")
                    }

                    PrinterConstants.Connect.NODEVICE -> {
                        isConnected = false;
                        showToast("未检测到打印机")
                    }
                }
            }
        }
    }

    private fun showToast(msg: String?) {
        if (msg.isNullOrEmpty() || mContext == null) {
            return
        }
        Toast.makeText(mContext, msg, Toast.LENGTH_SHORT).show()
    }
}