Android小票打印,蓝牙打印、固定IP打印、黑白图片打印

Printer

ICON
ICON

标准ES-POS命令打印,固定IP或蓝牙打印,支持黑白图片打印

预览

Screenshots
Screenshots

打印样例
打印样例

要求

  • minSdkVersion 5
  • <uses-permission android:name="android.permission.INTERNET" />
  • <uses-permission android:name="android.permission.BLUETOOTH" />

引用

dependencies {
    ⋯
    compile 'am.util:printer:1.1.3'
    ⋯
}

详情

  • 继承PrintTask来实现打印任务
  • 继承PrinterWriter来实现更多纸张类型的打印
  • PrinterUtils包含了众多打印指令

使用

  1. 添加蓝牙权限<uses-permission android:name="android.permission.BLUETOOTH" />或者网络请求权限<uses-permission android:name="android.permission.INTERNET" />
  2. 继承PrintTask类,实现具体打印任务:
private class TestPrintTask extends PrintTask {

    public TestPrintTask(BluetoothDevice device, int type) {
        super(device, type);
    }

    public TestPrintTask(String ip, int port, int type) {
        super(ip, port, type);
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        //打印前的准备工作,比如显示对话框
    }

    @Override
    protected byte[] getPrintData(int type) throws Exception {
        //实现打印数据的排版,生成字节流
        //根据不同的type创建不同的PrinterWriter,包内提供PrinterWriter80mm和PrinterWriter58mm,对应的是80mm小票打印机及58mm小票打印机。也可以自己创建PrinterWriter
        PrinterWriter80mm printer = new PrinterWriter80mm();
        printer.setAlignCenter();
        printer.printDrawable(res, R.drawable.ic_printer_logo);
        printer.setAlignLeft();
        printer.printLine();
        printer.printLineFeed();
        printer.setLineHeight(80);
        printer.print("最时尚的明星餐厅");
        printer.printLineFeed();
        printer.print("客服电话:400-8008800");
        printer.printLineFeed();
        ...
        printer.feedPaperCutPartial();
        return printer.getData();
    }

    @Override
    protected void onPrinterStateChanged(int state) {
        super.onPrinterStateChanged(state);
        //这些状态的变更是在主线程内
        switch (state) {
            case PrintRequest.STATE_0:
                //生成打印页面数据...
                break;
            case PrintRequest.STATE_1:
                ///生成数据成功,开始创建Socket连接...
                break;
            case PrintRequest.STATE_2:
                //创建Socket成功,开始发送测试数据...
                break;
            case PrintRequest.STATE_3:
                //获取输出流成功,开始写入打印页面数据...
                break;
            case PrintRequest.STATE_4:
                //写入打印页面数据成功,正在完成打印...
                break;
        }
    }

    @Override
    protected void onResult(int errorCode) {
        super.onResult(errorCode);
        switch (errorCode) {
            case PrintRequest.ERROR_0:
                //打印成功完成!
                break;
            case PrintRequest.ERROR_1:
                //生成打印页面数据失败!
                break;
            case PrintRequest.ERROR_2:
                //创建Socket失败!
                break;
            case PrintRequest.ERROR_3:
                //获取输出流失败!
                break;
            case PrintRequest.ERROR_4:
                //写入打印页面数据失败!
                break;
            case PrintRequest.ERROR_5:
                //必要的参数不能为空!
                break;
        }
    }
}
  1. 执行打印:
new TestPrintTask(device, type).execute();
new TestPrintTask(ip, port, type).execute();

如果你要实现自己的打印机PrinterWriter,那么你需要继承

public class PrinterWriter80mm extends PrinterWriter{

    public static final int TYPE_80 = 80;// 纸宽80mm

    public PrinterWriter80mm() throws IOException {
    }

    @Override
    protected int getLineWidth() {
        //一行能够放下多少个“-”
        return 24;
    }

    @Override
    protected int getLineStringWidth(int textSize) {
        //根据字体的大小,一行可以放下多少个英文字符
        switch (textSize) {
            default:
            case 0:
                return 47;
            case 1:
                return 23;
        }
    }

    @Override
    protected int getDrawableMaxWidth() {
        //图片能够全部打印在纸上的最大宽度
        return 500;
    }
}

注意

  • 仅提供建立蓝牙连接打印,不包括蓝牙搜索及配对功能
  • 不包含二维码生成功能
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容

  • Guide to BluetoothSecurity原文 本出版物可免费从以下网址获得:https://doi.o...
    公子小水阅读 7,897评论 0 6
  • 最近竞品公司出了一个接入蓝牙打印机的功能,作为竞争对手公司肯定不能少所以就给我分了任务,搞定蓝牙打印机 首先介绍一...
    呆北默阅读 3,243评论 12 10
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,498评论 25 707
  • 蓝牙 注:本文翻译自https://developer.android.com/guide/topics/conn...
    RxCode阅读 8,626评论 11 99
  • IJK中的消息处理 原因ijk的给我们暴露了几个通知,让我们可以方便的使用通知来监控播放器的状态,不过我们总是觉得...
    nullyy阅读 1,460评论 1 1