百富POS機A920安卓系統打印功能的實現

由於打印demo中隻有一些參數設置和基礎打印,也無法實現排版功能,後采用com.pax.gl.imgprocessing中的接口

IImgProcessing.IPage

生成bitmap實現打印,可支持打印排版,打印圖片等。

 

1、重要的引入jar包,一開始隻引入瞭第一個,然後是痛苦的bug排查。。。

2、根據API,添加打印功能,自己封裝瞭一個打印工具類

package com.hisun.pos.utils.printer;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;

import com.hisun.pos.MyApplication;
import com.hisun.pos.R;
import com.hisun.pos.utils.LogUtil;
import com.pax.gl.imgprocessing.IImgProcessing;
import com.pax.ipp.service.aidl.dal.printer.EFontTypeAscii;
import com.pax.ipp.service.aidl.dal.printer.EFontTypeExtCode;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Created by ylh on 2018/1/18 0018.
 */

public class PrinterUtil {

    private static final int FONT_BIG = 24;
    private static final int FONT_NORMAL = 20;
    private static Context mContext;

    public PrinterUtil(Context context) {
        mContext = context;
    }

    public void print(String str, Boolean containBitmap) {
        //初始化
        PrinterTester.getInstance().init();
        //字體設置(ASCII,拓展碼)
        PrinterTester.getInstance().fontSet(EFontTypeAscii.FONT_8_16, EFontTypeExtCode.FONT_16_16);
        //間距設置(字間距,行間距)
        PrinterTester.getInstance().spaceSet(Byte.parseByte("0"),
                Byte.parseByte("0"));

        //字符打印左邊界
        PrinterTester.getInstance().leftIndents(Short.parseShort("0"));
        //打印黑度
        PrinterTester.getInstance().setGray(1);
        //雙倍寬度<->正常寬度
        if (true) {
            PrinterTester.getInstance().setDoubleWidth(true, true);
        }
        //雙倍高度<->正常高度
        if (true) {
            PrinterTester.getInstance().setDoubleHeight(true, true);
        }
        //正常打印<->反顯打印
        PrinterTester.getInstance().setInvert(false);
        //打印圖片
        if (containBitmap) {
            PrinterTester.getInstance().printBitmap(
                    BitmapFactory.decodeResource(mContext.getResources(), R.mipmap.ic_qrcode));
        }
        //打印狀態
        String status = PrinterTester.getInstance().getStatus();

        //打印文本
        PrinterTester.getInstance().printStr(str, null);
        //走紙
        PrinterTester.getInstance().step(150);

        //開始打印
        PrinterTester.getInstance().start();
    }

    public void print(String orderNo, String orderTime, String orderAmt) {
        Bitmap bitmap = generate(orderNo, orderTime, orderAmt);
        //初始化
        PrinterTester.getInstance().init();
        String statues = PrinterTester.getInstance().getStatus();
        LogUtil.debug(statues);
        if (statues.contains("Success")){
            PrinterTester.getInstance().printBitmap(bitmap);
            PrinterTester.getInstance().start();
        }
    }

    public Bitmap generate(String orderNo, String orderTime, String orderAmt) {
        IImgProcessing.IPage page = GetObj.getGL().getImgProcessing().createPage();
        //設置字體
//        page.setTypeFace(TYPE_FACE);
        //往頁面裡添加新的一行
//        page.addLine();
        //創建一個元素,可用IImgProcessing.IPage.ILine.addUnit(IUnit)來生成行
        page.adjustLineSpace(10);

        //logo
        page.addLine().addUnit(BitmapFactory.decodeResource(mContext.getResources(), R.mipmap.ic_mpay));

        // 憑單抬頭
        page.addLine().addUnit("Payment Voucher", FONT_BIG, IImgProcessing.IPage.EAlign.CENTER, IImgProcessing.IPage.ILine.IUnit.TEXT_STYLE_BOLD);

        page.addLine().adjustTopSpace(20);

        // 門店名稱
        page.addLine().addUnit("Store:" + MyApplication.getLoginResp().getUserBasicInfo().getMercName(),
                FONT_NORMAL);

        // 商戶id
        page.addLine().addUnit("Merchant ID:" + MyApplication.getLoginResp().getUserBasicInfo().getUserId(), FONT_NORMAL);

        // 操作人員
        page.addLine().addUnit("Operator:" + MyApplication.getLoginResp().getUserBasicInfo().getDisplayNm(), FONT_NORMAL);

        // Order:
        page.addLine().addUnit("Order:" + orderNo, FONT_NORMAL);

        // Payment_time:
        page.addLine().addUnit("Payment_time:" + orderTime, FONT_NORMAL);

        // Amount:
        page.addLine().addUnit("Amount:$" + orderAmt, FONT_NORMAL);

        // ===:
        page.addLine().addUnit("==================================", FONT_NORMAL, IImgProcessing.IPage.EAlign.CENTER);

        // Payment Successful:
        page.addLine().addUnit("Payment Successful", FONT_BIG, IImgProcessing.IPage.EAlign.CENTER, IImgProcessing.IPage.ILine.IUnit.TEXT_STYLE_BOLD);

        page.addLine().adjustTopSpace(20);

        // Print Time:
        page.addLine().addUnit("Print Time:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()), FONT_NORMAL);

        // Terminal:
        page.addLine().addUnit("Terminal:" + SysTester.getInstance().getTerminfoModel() + " " + SysTester.getInstance().getDevInterfaceVer(), FONT_NORMAL);

        page.addLine().adjustTopSpace(20);

        //二維碼
        page.addLine().addUnit(BitmapFactory.decodeResource(mContext.getResources(), R.mipmap.ic_qrcode), IImgProcessing.IPage.EAlign.CENTER);
        page.addLine().adjustTopSpace(2);
        page.addLine().addUnit("Scan to download Mpay", FONT_NORMAL, IImgProcessing.IPage.EAlign.CENTER);

        page.addLine().addUnit("\n\n\n\n\n\n", FONT_NORMAL);

        IImgProcessing imgProcessing = GetObj.getGL().getImgProcessing();
        return imgProcessing.pageToBitmap(page, 384);
    }
}

調用打印方法

new Thread(new Runnable() {
            @Override
            public void run() {
                PrinterUtil printer = new PrinterUtil(CashierChoosePaymentActivity.this);
                printer.print("2018011800000000000345", "2018-01-19  11:27:52", "10.00");
            }
        }).start();

重要的獲取 IPrinterprinter

package com.hisun.pos.utils.printer;

import android.graphics.Bitmap;

import com.pax.ipp.service.aidl.Exceptions;
import com.pax.ipp.service.aidl.dal.printer.EFontTypeAscii;
import com.pax.ipp.service.aidl.dal.printer.EFontTypeExtCode;
import com.pax.ipp.service.aidl.dal.printer.Pic;
import com.pax.ippi.dal.interfaces.IPrinter;


public class PrinterTester extends TestLog {

    private static PrinterTester printerTester;
    private IPrinter printer;

    private PrinterTester() {
        printer = GetObj.getDal().getPrinter();
    }

    public static PrinterTester getInstance() {
        if (printerTester == null) {
            printerTester = new PrinterTester();
        }
        return printerTester;
    }

    public void init() {
        try {
            printer.init();
            logTrue("init");
        } catch (Exceptions e) {
            e.printStackTrace();
            logErr("init", e.toString());
        }
    }

    public String getStatus() {
        try {
            int status = printer.getStatus();
            logTrue("getStatus");
            return statusCode2Str(status);
        } catch (Exceptions e) {
            e.printStackTrace();
            logErr("getStatus", e.toString());
            return "";
        }

    }

    public void fontSet(EFontTypeAscii asciiFontType, EFontTypeExtCode cFontType) {
        try {
            printer.fontSet(asciiFontType, cFontType);
            logTrue("fontSet");
        } catch (Exceptions e) {
            e.printStackTrace();
            logErr("fontSet", e.toString());
        }

    }

    public void spaceSet(byte wordSpace, byte lineSpace) {
        try {
            printer.spaceSet(wordSpace, lineSpace);
            logTrue("spaceSet");
        } catch (Exceptions e) {
            e.printStackTrace();
            logErr("spaceSet", e.toString());
        }
    }

    public void printStr(String str, String charset) {
        try {
            printer.printStr(str, charset);
            logTrue("printStr");
        } catch (Exceptions e) {
            e.printStackTrace();
            logErr("printStr", e.toString());
        }

    }

    public void step(int b) {
        try {
            printer.step(b);
            logTrue("setStep");
        } catch (Exceptions e) {
            e.printStackTrace();
            logErr("setStep", e.toString());
        }
    }

    public void printBitmap(Bitmap bitmap) {
        try {
            Pic pic = new Pic(bitmap);
            printer.printBitmap(pic);
            logTrue("printBitmap");
        } catch (Exceptions e) {
            e.printStackTrace();
            logErr("printBitmap", e.toString());
        }
    }

    public String start() {
        try {
            int res = printer.start();
            logTrue("start");
            return statusCode2Str(res);
        } catch (Exceptions e) {
            e.printStackTrace();
            logErr("start", e.toString());
            return "";
        }

    }

    public void leftIndents(short indent) {
        try {
            printer.leftIndent(indent);
            logTrue("leftIndent");
        } catch (Exceptions e) {
            e.printStackTrace();
            logErr("leftIndent", e.toString());
        }
    }

    public int getDotLine() {
        try {
            int dotLine = printer.getDotLine();
            logTrue("getDotLine");
            return dotLine;
        } catch (Exceptions e) {
            e.printStackTrace();
            logErr("getDotLine", e.toString());
            return -2;
        }
    }

    public void setGray(int level) {
        try {
            printer.setGray(level);
            logTrue("setGray");
        } catch (Exceptions e) {
            e.printStackTrace();
            logErr("setGray", e.toString());
        }

    }

    public void setDoubleWidth(boolean isAscDouble, boolean isLocalDouble) {
        try {
            printer.doubleWidth(isAscDouble, isLocalDouble);
            logTrue("doubleWidth");
        } catch (Exceptions e) {
            e.printStackTrace();
            logErr("doubleWidth", e.toString());
        }
    }

    public void setDoubleHeight(boolean isAscDouble, boolean isLocalDouble) {
        try {
            printer.doubleHeight(isAscDouble, isLocalDouble);
            logTrue("doubleHeight");
        } catch (Exceptions e) {
            e.printStackTrace();
            logErr("doubleHeight", e.toString());
        }

    }

    public void setInvert(boolean isInvert) {
        try {
            printer.invert(isInvert);
            logTrue("setInvert");
        } catch (Exceptions e) {
            e.printStackTrace();
            logErr("setInvert", e.toString());
        }

    }

    public String statusCode2Str(int status) {
        String res = "";
        switch (status) {
            case 0:
                res = "Success ";
                break;
            case 1:
                res = "Printer is busy ";
                break;
            case 2:
                res = "Out of paper ";
                break;
            case 3:
                res = "The format of print data packet error ";
                break;
            case 4:
                res = "Printer malfunctions ";
                break;
            case 8:
                res = "Printer over heats ";
                break;
            case 9:
                res = "Printer voltage is too low";
                break;
            case 240:
                res = "Printing is unfinished ";
                break;
            case 252:
                res = " The printer has not installed font library ";
                break;
            case 254:
                res = "Data package is too long ";
                break;
            default:
                break;
        }
        return res;
    }
}

首先需要獲取IDal dal對象,再通過getPrinter()方法拿到printer

package com.hisun.pos.utils.printer;

import android.util.Log;

import com.hisun.pos.activity.CashierChoosePaymentActivity;
import com.pax.gl.IGL;
import com.pax.ippi.dal.interfaces.IDal;
import com.pax.ippi.emv.interfaces.IEmv;

public class GetObj {

    private static IDal dal;
    private static IGL gl;
    private static IEmv emv;

    // 獲取IDal dal對象
    public static IDal getDal() {
        dal = CashierChoosePaymentActivity.dal;
        if (dal == null) {
            Log.e("IPPITest", "dal is null");
        }
        return dal;
    }

    // 獲取IGL gl對象
    public static IGL getGL() {

        gl = CashierChoosePaymentActivity.gl;
        if (gl == null) {
            Log.e("IPPITest", "gl is null");
        }
        return gl;

    }

    // 獲取IEmv emv對象
    public static IEmv getEmv() {

        emv = CashierChoosePaymentActivity.emv;
        if (emv == null) {
            Log.e("IPPITest", "emv is null");
        }
        return emv;

    }

}

IDal dal對象可在MainActivity中註冊NeptuneUser對象拿到,dal = neptuneUser.getService().getDal();

    public static NeptuneUser neptuneUser;
    public static IDal dal;
    public static IGL gl;
    public static IEmv emv;
	
	@Override
    protected void setLayout() {
        setContentView(R.layout.activity_cashier_choose_payment);

        neptuneUser = NeptuneUser.getInstance(this);
        dal = neptuneUser.getService().getDal();
        gl = neptuneUser.getService().getGl();
        emv = neptuneUser.getService().getEmv();
    }
	
    @Override
    protected void onResume() {
        super.onResume();
        neptuneUser.register();
    }

    @Override
    protected void onPause() {
        super.onPause();
        neptuneUser.unRegister();
    }

補充:獲取pos機設備信息的API,源自demo

package com.hisun.pos.utils.printer;

import com.hisun.pos.activity.CashierChoosePaymentActivity;
import com.pax.ipp.service.aidl.Exceptions;
import com.pax.ipp.service.aidl.dal.sys.EBeepMode;
import com.pax.ipp.service.aidl.dal.sys.ENavigationKey;
import com.pax.ipp.service.aidl.dal.sys.ETermInfoKey;
import com.pax.ipp.service.aidl.dal.sys.ETouchMode;
import com.pax.ippi.dal.interfaces.ISys;

import java.util.Map;

public class SysTester extends TestLog {

    private static SysTester sysTester;
    private ISys iSys = null;

    private SysTester() {
        iSys = GetObj.getDal().getSys();
    }

    public static SysTester getInstance() {
        if (sysTester == null) {
            sysTester = new SysTester();
        }
        return sysTester;
    }

    public void beep(final EBeepMode beepMode, final int delayTime) {
        try {
            iSys.beep(beepMode, delayTime);
            logTrue("beep");
        } catch (Exceptions e) {
            e.printStackTrace();
            logErr("beep", e.toString());
        }

    }

    public String getTerminfo() {
        try {
            Map termInfo = iSys.getTermInfo();
            logTrue("getTerminfo");
            StringBuilder termInfoStr = new StringBuilder();
            for (ETermInfoKey key : ETermInfoKey.values()) {
                termInfoStr.append(key.name() + ":" + termInfo.get(key) + "\n");
            }
            return termInfoStr.toString();
        } catch (Exceptions e) {
            e.printStackTrace();
            logErr("getTerminfo", e.toString());
            return "";
        }

    }

    public String getTerminfoModel() {
        try {
            Map termInfo = iSys.getTermInfo();
            logTrue("getTerminfoModel");
            return termInfo.get(ETermInfoKey.MODEL);
        } catch (Exceptions e) {
            e.printStackTrace();
            logErr("getTerminfoModel", e.toString());
            return "";
        }
    }

    public String getRadom(int len) {
        try {
            byte[] random = iSys.getRandom(len);
            if (random != null) {
                logTrue("getRadom");
                return CashierChoosePaymentActivity.gl.getConvert().bcdToStr(random);
            } else {
                logErr("getRadom", "return null");
                return "null";
            }
        } catch (Exceptions e) {
            e.printStackTrace();
            logErr("getRadom", e.toString());
            return "";
        }

    }

    public String getDevInterfaceVer() {
        try {
            String verString = iSys.getDevInterfaceVer();
            logTrue("getDevInterfaceVer");
//            return "version of device interface:" + verString;
            return verString;
        } catch (Exceptions e) {
            e.printStackTrace();
            logErr("getDevInterfaceVer", e.toString());
            return "";
        }
    }

    public void showNavigationBar(boolean flag) {
        try {
            iSys.showNavigationBar(flag);
            logTrue("showNavigationBar");
        } catch (Exceptions e) {
            e.printStackTrace();
            logErr("showNavigationBar", e.toString());
        }
    }

    public void enableNavigationBar(boolean flag) {
        try {
            iSys.enableNavigationBar(flag);
            logTrue("enableNavigationBar");
        } catch (Exceptions e) {
            e.printStackTrace();
            logErr("enableNavigationBar", e.toString());
        }
    }

    public void enableNavigationKey(ENavigationKey navigationKey, boolean flag) {
        try {
            iSys.enableNavigationKey(navigationKey, flag);
            logTrue("enableNavigationKey");
        } catch (Exceptions e) {
            e.printStackTrace();
            logErr("enableNavigationKey", e.toString());
        }
    }

    public boolean isNavigationBarVisible() {
        boolean res = true;
        try {
            res = iSys.isNavigationBarVisible();
            logTrue("isNavigationBarVisible");
            return res;
        } catch (Exceptions e) {
            e.printStackTrace();
            logErr("isNavigationBarVisible", e.toString());
        }
        return res;
    }

    public boolean isNavigationBarEnabled() {
        boolean res = true;
        try {
            res = iSys.isNavigationBarEnabled();
            logTrue("isNavigationBarEnabled");
            return res;
        } catch (Exceptions e) {
            e.printStackTrace();
            logErr("isNavigationBarEnabled", e.toString());
        }
        return res;
    }

    public boolean isNavigationKeyEnabled(ENavigationKey navigationKey) {
        boolean res = true;
        try {
            res = iSys.isNavigationKeyEnabled(navigationKey);
            logTrue("isNavigationKeyEnabled");
            return res;
        } catch (Exceptions e) {
            e.printStackTrace();
            logErr("isNavigationKeyEnabled", e.toString());
        }
        return res;
    }

    public void showStatusBar(boolean flag) {
        try {
            iSys.showStatusBar(flag);
            logTrue("showStatusBar");
        } catch (Exceptions e) {
            e.printStackTrace();
            logErr("showStatusBar", e.toString());
        }
    }

    public void enableStatusBar(boolean flag) {
        try {
            iSys.enableStatusBar(flag);
            logTrue("enableStatusBar");
        } catch (Exceptions e) {
            e.printStackTrace();
            logErr("enableStatusBar", e.toString());
        }
    }

    public boolean isStatusBarEnabled() {
        boolean res = true;
        try {
            res = iSys.isStatusBarEnabled();
            logTrue("isStatusBarEnabled");
            return res;
        } catch (Exceptions e) {
            e.printStackTrace();
            logErr("isStatusBarEnabled", e.toString());
        }
        return res;
    }

    public boolean isStatusBarVisible() {
        boolean res = true;
        try {
            res = iSys.isStatusBarVisible();
            logTrue("isStatusBarVisible");
            return res;
        } catch (Exceptions e) {
            e.printStackTrace();
            logErr("isStatusBarVisible", e.toString());
        }
        return res;
    }

    public void resetStatusBar() {
        try {
            iSys.resetStatusBar();
            logTrue("resetStatusBar");
        } catch (Exceptions e) {
            e.printStackTrace();
            logErr("resetStatusBar", e.toString());
        }
    }

    public void enablePowerKey(boolean flag) {
        try {
            iSys.enablePowerKey(flag);
            logTrue("enablePowerKey");
        } catch (Exceptions e) {
            e.printStackTrace();
            logErr("enablePowerKey", e.toString());
        }
    }

    public boolean isPowerKeyEnabled() {
        boolean res = true;
        try {
            res = iSys.isPowerKeyEnabled();
            logTrue("isPowerKeyEnabled");
            return res;
        } catch (Exceptions e) {
            e.printStackTrace();
            logErr("isPowerKeyEnabled", e.toString());
        }
        return res;
    }

    public void setSettingsNeedPassword(boolean flag) {
        try {
            iSys.setSettingsNeedPassword(flag);
            logTrue("setSettingsNeedPassword");
        } catch (Exceptions e) {
            e.printStackTrace();
            logErr("setSettingsNeedPassword", e.toString());
        }
    }

    public void reboot() {
        try {
            iSys.reboot();
            logTrue("reboot");
        } catch (Exceptions e) {
            e.printStackTrace();
            logErr("reboot", e.toString());
        }
    }

    public void shutdown() {
        try {
            iSys.shutdown();
            logTrue("shutdown");
        } catch (Exceptions e) {
            e.printStackTrace();
            logErr("shutdown", e.toString());
        }
    }

    public void switchTouchMode(ETouchMode touchMode) {
        try {
            iSys.switchTouchMode(touchMode);
            logTrue("switchTouchMode");
        } catch (Exceptions e) {
            e.printStackTrace();
            logErr("switchTouchMode", e.toString());
        }
    }

}

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *