項目筆記:(一)藍牙打印、POS機打印、播報語音

藍牙打印:之前在做項目時蓄愁,遇到要做手機端的藍牙打印双炕,其實就是手機端結(jié)合熱敏打印機,通過藍牙的連接撮抓,進行數(shù)據(jù)的傳輸妇斤,最終打印出所需要的小票。

熱敏藍牙打印機打印小票

POS機打印:POS機的打印也是結(jié)合硬件設(shè)備胀滚,但是與手機端的不同之處在于趟济,POS硬件支持打印功能,一般情況下咽笼,不同的廠商制造出的POS機的打印方式是不同的。我在做項目時剑刑,遇到了兩種POS的打印方式媳纬。這兩種打印方式的共同點在于都是跨進程通信,調(diào)用該硬件提供的SDK的打印方式去進行打印施掏。
語音播報:Jpush和訊飛的結(jié)合使用钮惠,進行語音播報,類似于現(xiàn)在支付寶收款成功之后的語音素挽。(但是實現(xiàn)方式肯定是不一樣的)预明。
本文主要介紹:藍牙打印
Talk is cheap 撰糠,show me the code.
android藍牙打印demo源碼
結(jié)合之前的demo(包括打印圖片)

步驟一: 如圖所示阅酪,導(dǎo)入printerlibs.jar包术辐。
步驟二:復(fù)制相關(guān)類文件,以及資源文件等扇丛。
步驟三:初始化藍牙

@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) {
            }
        }
    }

步驟四:獲取已經(jīng)匹配成功的藍牙設(shè)備

 /**
     * 得到已經(jīng)匹配的藍牙的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;
    }

步驟五:連接藍牙打印機設(shè)備

/**
     * 初始化RecyclerView
     */
    private void initRecyclerView() {
        rvSettingconnect.setLayoutManager(new LinearLayoutManager(this));
        // 創(chuàng)建RecyclerView的數(shù)據(jù)適配器
        adapter = new BleDevicesRecyclerViewAdapter(this);
        //設(shè)置分割線
        rvSettingconnect.addItemDecoration(new DividerItemDecoration(this, VERTICAL_LIST));
        // 設(shè)置RecyclerView的數(shù)據(jù)適配器(適配器包裝)
        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();
        // 設(shè)置寬度為屏幕的寬度
        WindowManager windowManager = getWindowManager();
        Display display = windowManager.getDefaultDisplay();
        WindowManager.LayoutParams lp = dialog.getWindow().getAttributes();
        lp.width = (int) (display.getWidth()); // 設(shè)置寬度
        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"
                    + "狀態(tài):" + "給我退款" + "\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;


            // 設(shè)置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包進行的藍牙打印開發(fā)。難度不是很大冰评,其中的打印原理等內(nèi)容封裝在jar中木羹。
之后會寫POS機的打印方式。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末抛人,一起剝皮案震驚了整個濱河市脐瑰,隨后出現(xiàn)的幾起案子苍在,更是在濱河造成了極大的恐慌忌穿,老刑警劉巖掠剑,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件井佑,死亡現(xiàn)場離奇詭異躬翁,居然都是意外死亡盯拱,警方通過查閱死者的電腦和手機盒发,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門拼卵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來腋腮,“玉大人即寡,你說我怎么就攤上這事聪富∩普牵” “怎么了草则?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長源内。 經(jīng)常有香客問我膜钓,道長卿嘲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任沃疮,我火速辦了婚禮司蔬,結(jié)果婚禮上俊啼,老公的妹妹穿的比我還像新娘授帕。我一直安慰自己豪墅,他們只是感情好偶器,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著霎苗,像睡著了一般唁盏。 火紅的嫁衣襯著肌膚如雪厘擂。 梳的紋絲不亂的頭發(fā)上刽严,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天舞萄,我揣著相機與錄音,去河邊找鬼倒脓。 笑死崎弃,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的艇炎。 我是一名探鬼主播缀踪,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼奏候,長吁一口氣:“原來是場噩夢啊……” “哼蔗草!你這毒婦竟也來了咒精?” 一聲冷哼從身側(cè)響起模叙,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤厂庇,失蹤者是張志新(化名)和其女友劉穎宋列,沒想到半個月后灭返,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蚓聘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盟劫。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡侣签,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出僚碎,到底是詐尸還是另有隱情勺阐,我是刑警寧澤裂七,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響无埃,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜侦镇,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧荔棉,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽柳弄。三九已至,卻和暖如春睡腿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背纤控。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工耿导, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留态贤,地道東北人。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容