亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android進階――安卓調用ESC/POS打印機打印實例

2019-12-12 03:09:57
字體:
來源:轉載
供稿:網友

前言

前一段時間由于工作需要,要研究一下安卓程序調用打印機打印小票,并且要求不能使用藍牙調用,研究了一下,可以利用socket連接,來實現打印功能。寫了個Demo,分享一下。

工具:一臺打印機(芯燁XP-80XX),一臺安卓測試機

開發環境:Android Studio 1.5

需求:點擊按鈕,實現打印小票功能,小票上除必要文字外,還要有二維碼。

封裝了一個Pos打印工具類:

package com.example.haoguibao.myapplication;  import java.io.DataOutputStream; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.Socket;  /**  * Created by haoguibao on 16/2/18.  * Description : 封裝Pos機打印工具類  * Revision :  */ public class Pos {   //定義編碼方式   private static String encoding = null;    private Socket sock = null;   // 通過socket流進行讀寫   private OutputStream socketOut = null;   private OutputStreamWriter writer = null;    /**    * 初始化Pos實例    *    * @param ip 打印機IP    * @param port 打印機端口號    * @param encoding 編碼    * @throws IOException    */   public Pos(String ip, int port, String encoding) throws IOException {     sock = new Socket(ip, port);     socketOut = new DataOutputStream(sock.getOutputStream());     this.encoding = encoding;     writer = new OutputStreamWriter(socketOut, encoding);   }    /**    * 關閉IO流和Socket    *    * @throws IOException    */   protected void closeIOAndSocket() throws IOException {     writer.close();     socketOut.close();     sock.close();   }    /**    * 打印二維碼    *    * @param qrData 二維碼的內容    * @throws IOException    */   protected void qrCode(String qrData) throws IOException {     int moduleSize = 8;     int length = qrData.getBytes(encoding).length;      //打印二維碼矩陣     writer.write(0x1D);// init     writer.write("(k");// adjust height of barcode     writer.write(length + 3); // pl     writer.write(0); // ph     writer.write(49); // cn     writer.write(80); // fn     writer.write(48); //     writer.write(qrData);      writer.write(0x1D);     writer.write("(k");     writer.write(3);     writer.write(0);     writer.write(49);     writer.write(69);     writer.write(48);      writer.write(0x1D);     writer.write("(k");     writer.write(3);     writer.write(0);     writer.write(49);     writer.write(67);     writer.write(moduleSize);      writer.write(0x1D);     writer.write("(k");     writer.write(3); // pl     writer.write(0); // ph     writer.write(49); // cn     writer.write(81); // fn     writer.write(48); // m      writer.flush();    }    /**    * 進紙并全部切割    *    * @return    * @throws IOException    */   protected void feedAndCut() throws IOException {     writer.write(0x1D);     writer.write(86);     writer.write(65);     //    writer.write(0);     //切紙前走紙多少     writer.write(100);     writer.flush();      //另外一種切紙的方式     //    byte[] bytes = {29, 86, 0};     //    socketOut.write(bytes);   }    /**    * 打印換行    *    * @return length 需要打印的空行數    * @throws IOException    */   protected void printLine(int lineNum) throws IOException {     for (int i = 0; i < lineNum; i++) {       writer.write("/n");     }     writer.flush();   }    /**    * 打印換行(只換一行)    *    * @throws IOException    */   protected void printLine() throws IOException {     writer.write("/n");     writer.flush();   }    /**    * 打印空白(一個Tab的位置,約4個漢字)    *    * @param length 需要打印空白的長度,    * @throws IOException    */   protected void printTabSpace(int length) throws IOException {     for (int i = 0; i < length; i++) {       writer.write("/t");     }     writer.flush();   }    /**    * 打印空白(一個漢字的位置)    *    * @param length 需要打印空白的長度,    * @throws IOException    */   protected void printWordSpace(int length) throws IOException {     for (int i = 0; i < length; i++) {       writer.write(" ");     }     writer.flush();   }    /**    * 打印位置調整    *    * @param position 打印位置 0:居左(默認) 1:居中 2:居右    * @throws IOException    */   protected void printLocation(int position) throws IOException {     writer.write(0x1B);     writer.write(97);     writer.write(position);     writer.flush();   }    /**    * 絕對打印位置    *    * @throws IOException    */   protected void printLocation(int light, int weight) throws IOException {     writer.write(0x1B);     writer.write(0x24);     writer.write(light);     writer.write(weight);     writer.flush();   }    /**    * 打印文字    *    * @param text    * @throws IOException    */   protected void printText(String text) throws IOException {     String s = text;     byte[] content = s.getBytes("gbk");     socketOut.write(content);     socketOut.flush();   }    /**    * 新起一行,打印文字    *    * @param text    * @throws IOException    */   protected void printTextNewLine(String text) throws IOException {     //換行     writer.write("/n");     writer.flush();      String s = text;     byte[] content = s.getBytes("gbk");     socketOut.write(content);     socketOut.flush();   }    /**    * 初始化打印機    *    * @throws IOException    */   protected void initPos() throws IOException {     writer.write(0x1B);     writer.write(0x40);     writer.flush();   }    /**    * 加粗    *    * @param flag false為不加粗    * @return    * @throws IOException    */   protected void bold(boolean flag) throws IOException {     if (flag) {       //常規粗細       writer.write(0x1B);       writer.write(69);       writer.write(0xF);       writer.flush();     } else {       //加粗       writer.write(0x1B);       writer.write(69);       writer.write(0);       writer.flush();     }   } } 

其中,打印機的IP和端口號從打印機的屬性設置處可查。

MainActivity中進行調用:

package com.example.haoguibao.myapplication;  import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button;  import java.io.IOException; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List;  public class MainActivity extends AppCompatActivity {   //訂單菜品集合   private List<FoodsBean> foodsBean;    private Pos pos;    @Override   protected void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.activity_main);      Button bt_print = (Button) findViewById(R.id.button);       bt_print.setOnClickListener(new View.OnClickListener() {       @Override       public void onClick(View v) {          // 開啟一個子線程         new Thread() {           public void run() {             try {               pos = new Pos("IP", 9100, "GBK");  //第一個參數是打印機網口IP                //初始化打印機               pos.initPos();                //初始化訂單數據               initData();                pos.bold(true);               pos.printTabSpace(2);               pos.printWordSpace(1);               pos.printText("**測試店鋪");                pos.printLocation(0);               pos.printTextNewLine("----------------------------------------------");               pos.bold(false);               pos.printTextNewLine("訂 單 號:1005199");               pos.printTextNewLine("用 戶 名:15712937281");               pos.printTextNewLine("桌  號:3號桌");               pos.printTextNewLine("訂單狀態:訂單已確認");               pos.printTextNewLine("訂單日期:2016/2/19 12:34:53");               pos.printTextNewLine("付 款 人:線下支付(服務員:寶哥)");               pos.printTextNewLine("服 務 員:1001");               pos.printTextNewLine("訂單備注:不要辣,少鹽");               pos.printLine(2);                pos.printText("品項");               pos.printLocation(20, 1);               pos.printText("單價");               pos.printLocation(99, 1);               pos.printWordSpace(1);               pos.printText("數量");               pos.printWordSpace(3);               pos.printText("小計");               pos.printTextNewLine("----------------------------------------------");                 for (FoodsBean foods : foodsBean) {                 pos.printTextNewLine(foods.getName());                 pos.printLocation(20, 1);                 pos.printText(foods.getPrice());                 pos.printLocation(99, 1);                 pos.printWordSpace(1);                 pos.printText(foods.getNumber());                 pos.printWordSpace(3);                 pos.printText(foods.getSum());               }                pos.printTextNewLine("----------------------------------------------");                pos.printLocation(1);               pos.printLine(2);               //打印二維碼               pos.qrCode("http://blog.csdn.net/haovip123");                //切紙               pos.feedAndCut();                pos.closeIOAndSocket();               pos = null;             } catch (UnknownHostException e) {               e.printStackTrace();             } catch (IOException e) {               e.printStackTrace();             }           }          }.start();        }     });   }    private void initData() {     foodsBean = new ArrayList<>();      for (int i = 0; i < 4; i++) {       FoodsBean fb = new FoodsBean();       fb.setName("測試菜品" + i);       fb.setPrice("90.00");       fb.setNumber("1" + i);       fb.setSum("10" + i + ".00");       foodsBean.add(fb);     }   } } 

附:小票中菜品的Bean類

public class FoodsBean {   private String name;   private String price;   private String number;   private String sum;    public String getName() {     return name;   }   public void setName(String name) {     this.name = name;   }   public String getPrice() {     return price;   }   public void setPrice(String price) {     this.price = price;   }   public String getNumber() {     return number;   }   public void setNumber(String number) {     this.number = number;   }   public String getSum() {     return sum;   }   public void setSum(String sum) {     this.sum = sum;   } } 

打印小票樣品如圖:

小結:

對于調用打印機,不論使用Java語言還是其他語言,思路都是一樣的,利用Socket連接上打印機以后,通過IO流進行輸出打印,它們的打印指令都是一樣的,可以下載打印手冊,針對不同的設置,使用不同的打印指令即可。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩亚洲视频| 欧美极度另类性三渗透| 欧美高清在线播放| 国产suv精品一区二区三区88区| 国产精品久久久久久久久久三级| 最好看的2019年中文视频| 精品国产一区久久久| 庆余年2免费日韩剧观看大牛| 亚洲综合第一页| 国产欧美精品一区二区三区-老狼| 中文字幕一区电影| 亚洲一级一级97网| 最近更新的2019中文字幕| 一本色道久久88亚洲综合88| 日韩av色综合| 亚洲精品成人免费| 永久免费看mv网站入口亚洲| 久久这里只有精品视频首页| 欧美亚洲成人免费| 岛国av一区二区在线在线观看| 欧美片一区二区三区| 亚洲精品日产aⅴ| 欧美做受高潮电影o| 亚洲久久久久久久久久久| 亚洲人成电影网站色| 欧美专区在线观看| 日韩电影大全免费观看2023年上| 亚洲午夜av电影| xxx欧美精品| 57pao成人国产永久免费| 亚洲精品资源在线| 欧美日韩国产一区在线| 亚洲女在线观看| 福利一区视频在线观看| 91av视频在线免费观看| 亚洲欧美中文另类| 亚洲第一av网站| 日本久久91av| 色噜噜亚洲精品中文字幕| 中文字幕日韩高清| 久久久久久国产精品美女| 日本成人在线视频网址| 伊人久久久久久久久久久久久| 亚洲男人的天堂网站| 久久99热这里只有精品国产| 日本韩国欧美精品大片卡二| 久久国产加勒比精品无码| 色婷婷av一区二区三区在线观看| 亚洲成人av片在线观看| 中文综合在线观看| 国产日本欧美一区二区三区在线| 欧美精品在线免费观看| 亚洲综合日韩中文字幕v在线| 亚洲区免费影片| 日韩在线免费视频| 91性高湖久久久久久久久_久久99| 亚洲人成在线观| 亚洲国产天堂久久国产91| 97精品一区二区三区| 久久精品国产久精国产思思| 成人黄色在线播放| 国产亚洲精品美女久久久| 久久精品中文字幕免费mv| 亚洲无亚洲人成网站77777| 成人黄色网免费| 国产91色在线播放| 精品久久久视频| 国产精品美女主播在线观看纯欲| 91在线观看免费网站| 国产精品吹潮在线观看| 中文字幕日韩有码| 一本一道久久a久久精品逆3p| 亚洲国产私拍精品国模在线观看| 欧美极品少妇xxxxx| 一区二区三区国产在线观看| 精品欧美激情精品一区| 欧美肥臀大乳一区二区免费视频| 亚洲国产成人爱av在线播放| 一本色道久久综合狠狠躁篇的优点| 亚洲自拍偷拍一区| 欧美日韩一二三四五区| 日韩欧美综合在线视频| 456亚洲影院| 国产成人精品网站| 成人有码在线播放| 欧美色图在线视频| 亚洲男人的天堂在线播放| 国产成人精品一区| 久久色精品视频| 亚洲人成网站色ww在线| www.美女亚洲精品| 中文字幕精品久久| yellow中文字幕久久| 欧美高清激情视频| 亚洲精品白浆高清久久久久久| 国产欧亚日韩视频| 美日韩精品免费观看视频| 日韩欧美国产网站| 亚洲一区二区三区毛片| 亚洲国产欧美一区二区丝袜黑人| 欧美视频专区一二在线观看| 精品久久久久久久久国产字幕| 红桃视频成人在线观看| 成人免费xxxxx在线观看| 69精品小视频| 美女少妇精品视频| 国内精品在线一区| 国产精品欧美一区二区| www.久久色.com| 成人久久久久久| 欧美性猛交xxxx乱大交蜜桃| 2019中文字幕在线免费观看| 久久精品视频播放| 国产精品视频精品视频| 红桃视频成人在线观看| 91精品久久久久久久久久久久久| 裸体女人亚洲精品一区| 精品毛片三在线观看| 亚洲天堂av在线免费| 成人精品久久一区二区三区| 91久久久久久国产精品| 欧美午夜丰满在线18影院| 色妞在线综合亚洲欧美| 精品久久中文字幕| 亚洲福利影片在线| 日韩在线视频中文字幕| 国产成人极品视频| 久久电影一区二区| 国产啪精品视频网站| 日韩经典中文字幕在线观看| 亚洲图片欧美午夜| 亚洲图片在线综合| 国产精品狼人色视频一区| 97香蕉超级碰碰久久免费软件| 久久久国产精品免费| 亚洲全黄一级网站| 欧美理论电影在线播放| 成人在线视频福利| 欧美高清在线观看| 久久91亚洲精品中文字幕奶水| 国产在线精品一区免费香蕉| 亚洲va欧美va国产综合剧情| 视频在线观看99| 一区二区三区国产视频| 色婷婷av一区二区三区久久| 欧美性xxxx极品高清hd直播| 日韩精品一区二区视频| 欧美自拍大量在线观看| 亚洲第一中文字幕| 亚洲欧美综合v| 国产网站欧美日韩免费精品在线观看| 国产精品美女999| 色天天综合狠狠色| 久久视频免费在线播放| 亚洲精品98久久久久久中文字幕| 美女精品久久久| 欧美激情xxxxx| 欧美极品美女电影一区| 亚洲自拍偷拍第一页| 亚洲精品视频中文字幕| 日韩女在线观看| 色妞欧美日韩在线| 精品国产乱码久久久久久天美| 永久免费看mv网站入口亚洲|