项目笔记:(一)蓝牙打印、POS机打印、播报语音

蓝牙打印:之前在做项目时,遇到要做手机端的蓝牙打印,其实就是手机端结合热敏打印机,通过蓝牙的连接,进行数据的传输,最终打印出所需要的小票。

热敏蓝牙打印机打印小票

POS机打印:POS机的打印也是结合硬件设备,但是与手机端的不同之处在于,POS硬件支持打印功能,一般情况下,不同的厂商制造出的POS机的打印方式是不同的。我在做项目时,遇到了两种POS的打印方式。这两种打印方式的共同点在于都是跨进程通信,调用该硬件提供的SDK的打印方式去进行打印。
语音播报:Jpush和讯飞的结合使用,进行语音播报,类似于现在支付宝收款成功之后的语音。(但是实现方式肯定是不一样的)。
本文主要介绍:蓝牙打印
Talk is cheap ,show me the code.
android蓝牙打印demo源码
结合之前的demo(包括打印图片)

步骤一: 如图所示,导入printerlibs.jar包。
步骤二:复制相关类文件,以及资源文件等。
步骤三:初始化蓝牙

@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
context=this;
//初始化蓝牙
initBlePrint();
btn_connect_printer= (Button) findViewById(R.id.btn_connect_printer);
btn_printer_text= (Button) findViewById(R.id.btn_printer_text);
btn_printer_text.setOnClickListener(this);
btn_connect_printer.setOnClickListener(this);
}
private void initBlePrint() {
        // 初始化字符串资源
        InitGlobalString();
        mHandler = new MHandler(MainActivity.this);
        WorkService.addHandler(mHandler);
        if (null == WorkService.workThread) {
            intent = new Intent(MainActivity.this, WorkService.class);
            startService(intent);
        }
    }
    private void InitGlobalString() {
        Global.toast_success = getString(R.string.toast_success);
        Global.toast_fail = getString(R.string.toast_fail);
        Global.toast_notconnect = getString(R.string.toast_notconnect);
        Global.toast_usbpermit = getString(R.string.toast_usbpermit);
    }

    static class MHandler extends Handler {
        WeakReference<MainActivity> mActivity;
        MHandler(MainActivity activity) {
            mActivity = new WeakReference<MainActivity>(activity);
        }
        @Override
        public void handleMessage(Message msg) {
            MainActivity theActivity = mActivity.get();
            switch (msg.what) {
            }
        }
    }

步骤四:获取已经匹配成功的蓝牙设备

 /**
     * 得到已经匹配的蓝牙的list集合
     * @return
     */
    private List<Map<String, Object>> getBoundedPrinters() {

        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
        BluetoothAdapter mBluetoothAdapter = BluetoothAdapter
                .getDefaultAdapter();
        if (mBluetoothAdapter == null) {
            // Device does not support Bluetooth
            return list;
        }

        Set<BluetoothDevice> pairedDevices = mBluetoothAdapter
                .getBondedDevices();
        // If there are paired devices
        if (pairedDevices.size() > 0) {
            // Loop through paired devices
            for (BluetoothDevice device : pairedDevices) {
                // Add the name and address to an array adapter to show in a
                // ListView
                Map<String, Object> map = new HashMap<String, Object>();
                map.put(ICON, android.R.drawable.stat_sys_data_bluetooth);
                // Toast.makeText(this,
                // ""+device.getBluetoothClass().getMajorDeviceClass(),
                // Toast.LENGTH_LONG).show();
                map.put(PRINTERNAME, device.getName());
                map.put(PRINTERMAC, device.getAddress());
                list.add(map);
            }
        }
        return list;
    }

步骤五:连接蓝牙打印机设备

/**
     * 初始化RecyclerView
     */
    private void initRecyclerView() {
        rvSettingconnect.setLayoutManager(new LinearLayoutManager(this));
        // 创建RecyclerView的数据适配器
        adapter = new BleDevicesRecyclerViewAdapter(this);
        //设置分割线
        rvSettingconnect.addItemDecoration(new DividerItemDecoration(this, VERTICAL_LIST));
        // 设置RecyclerView的数据适配器(适配器包装)
        rvSettingconnect.setAdapter(adapter);
        if (null != boundedPrinters) {
            adapter.setDatas(boundedPrinters);
        }
        //点击item连接蓝牙打印机
        adapter.setOnItemClickListener(new BleDevicesRecyclerViewAdapter.OnItemClickListener() {
            @Override
            public void OnItemClick(View view, int position, Map<String, Object> data) {

                String address = (String) boundedPrinters.get(position).get(PRINTERMAC);
                String name = (String) boundedPrinters.get(position).get(PRINTERNAME);
                dialog.setMessage(Global.toast_connecting + " " + name);
                dialog.setIndeterminate(true);
                dialog.setCanceledOnTouchOutside(false);
                dialog.show();
                if (WorkService.workThread != null) {
                    WorkService.workThread.connectBt(address);
                } else {
                    Toast.makeText(ConnectBTPairedActivity.this, "WorkService.workThread is null", Toast.LENGTH_SHORT).show();
                }


            }
        });
    }

步骤六:连接成功之后,进行打印

 /**
     * 打印dialog
     */
    Dialog dialog;

    private void toDialogActivity() {
        View view = LayoutInflater.from(context).inflate(R.layout.print_dialog, null);
        // 对话框
        dialog = new Dialog(context);
        dialog.getWindow().setBackgroundDrawable(new ColorDrawable(0));
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.show();
        // 设置宽度为屏幕的宽度
        WindowManager windowManager = getWindowManager();
        Display display = windowManager.getDefaultDisplay();
        WindowManager.LayoutParams lp = dialog.getWindow().getAttributes();
        lp.width = (int) (display.getWidth()); // 设置宽度
        dialog.getWindow().setAttributes(lp);
        dialog.getWindow().setContentView(view);

        Button btn_cancle_schexiao = (Button) view.findViewById(R.id.btn_cancle_schexiao);
        Button btn_ok_schexiao = (Button) view.findViewById(R.id.btn_ok_schexiao);
        btn_cancle_schexiao.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //取消打印
                dialog.hide();

            }
        });
        btn_ok_schexiao.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.hide();
                printText();

            }
        });

    }

    String payMethod = "对账单";

    public void printText() {
        // 不要直接和Pos打交道,要通过workThread来交流

        if (WorkService.workThread.isConnected()) {
            String text = "null";
            text = "=============================" + "\n"
                    + "金额:" + "12.5元" + "\n"
                    + "状态:" + "给我退款" + "\n"
                    + "用户:" + "Sagelu" + "\n"
                    + "时间:" + "2017-06-06" + "\n"
                    + "人物:" + "RNG" + "\n"
                    + "编号:" + "1231521591596" + "\n"
                    + "金额:" + "50W" + "\n"
                    + "时间:" + "2012-06-23" + "\n"
                    + "-----------------------------" + "\n"
                    + "此小票不需要顾客签字"
                    + "\r\n\r\n\r\n"; // 加三行换行,避免走纸


            byte header[] = null;
            byte strbuf[] = null;


            // 设置GBK编码
            // Android手机默认也是UTF8编码
            header = new byte[]{0x1b, 0x40, 0x1c, 0x26, 0x1b, 0x39,
                    00};
            try {
                strbuf = text.getBytes("GBK");
            } catch (UnsupportedEncodingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            //打印订单头部--字体大小以及居中sage...
            String headText = "付款" + "\r\n\r\n";
            Bundle dataAlign = new Bundle();
            dataAlign.putInt(Global.INTPARA1, 1);
            Bundle dataTextOut = new Bundle();
            dataTextOut.putString(Global.STRPARA1, headText);
            dataTextOut.putString(Global.STRPARA2, "GBK");
            dataTextOut.putInt(Global.INTPARA1, 0);
            dataTextOut.putInt(Global.INTPARA2, 1);
            dataTextOut.putInt(Global.INTPARA3, 1);
            WorkService.workThread.handleCmd(Global.CMD_POS_SALIGN,
                    dataAlign);
            WorkService.workThread.handleCmd(Global.CMD_POS_STEXTOUT,
                    dataTextOut);

            //打印订单详情body
            byte buffer[] = DataUtils.byteArraysToBytes(new byte[][]{
                    header, strbuf});
            Bundle data = new Bundle();
            data.putByteArray(Global.BYTESPARA1, buffer);
            data.putInt(Global.INTPARA1, 0);
            data.putInt(Global.INTPARA2, buffer.length);
            WorkService.workThread.handleCmd(Global.CMD_POS_WRITE, data);


        } else {
            Toast.makeText(context, Global.toast_notconnect,
                    Toast.LENGTH_SHORT).show();
            Intent intent = new Intent(context, ConnectBTPairedActivity.class);
            startActivity(intent);
//            toDialog();
        }

    }

其实也就是基于printerlibs.jar包进行的蓝牙打印开发。难度不是很大,其中的打印原理等内容封装在jar中。
之后会写POS机的打印方式。

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

推荐阅读更多精彩内容