上一篇文章重点介绍了android中蓝牙的开启配对连接及通信的相关知识,本文介绍连接打印机实现打印并格式化的方案,前提便是开启蓝牙并配对连接成功。

1.实现字符串的打印

private boolean isConnection = false;   //上文的连接代码   bluetoothSocket = device.createRfcommSocketToServiceRecord(uuid);   bluetoothSocket.connect();   if(device.getBondState()==BluetoothDevice.BOND_BONDED) {        outputStream = bluetoothSocket.getOutputStream();        isConnection=true;   }    /**    * 发送数据    */    private void send(String sendData){        if(isConnection) {            System.out.println("开始打印!!");            try {                byte[] data = sendData.getBytes("gbk");                outputStream.write(data,0,data.length);                outputStream.flush();            } catch (IOException e) {                Toast.makeText(PrintDataActivity.this,"发送失败!",Toast.LENGTH_SHORT)                        .show();            }        } else {            Toast.makeText(PrintDataActivity.this,"设备未连接,请重新连接!",Toast.LENGTH_SHORT)                    .show();        }    }

2.实现格式化打印

本文提供一种样式的代码。其实样式的实现无非就是计算起始点的位置而已,至于其中的数据可以通过循环或者反射的方式放进去,如果有疑问或者需要其他的样式可留言。

private static final int LINE_BYTE_SIZE = 32;// 打印纸一行最大的字节    private static final String SEPARATOR = "$";//分隔符    private static StringBuffer sb = new StringBuffer();    /**     * 排版居中标题     * @param title     * @return     */    public static String printTitle(String title){        sb.delete(0, sb.length());        //前面一半用空格填充        for(int i=0;i<(LINE_BYTE_SIZE - getBytesLength(title))/2;i++){            sb.append(" ");        }        sb.append(title);        return sb.toString();    }    /**     * 获取最大长度     * @param msgs     * @return     */    private static int getMaxLength(Object[] msgs){        int max = 0;        int tmp;        for(Object oo : msgs){            tmp = getBytesLength(oo.toString());            if(tmp>max){                max = tmp;            }        }        return max;    }    /**     * 获取数据长度     * @param msg     * @return     */    private static int getBytesLength(String msg){        return msg.getBytes(Charset.forName("GB2312")).length;    }    /**     * 打印订餐单 (左中右对称)     *      * 例:   菜名                           数量            单价                                   *      豆沙包                           1              3.0     *        蛋                             1              1.5     *       包子                            3              11.0     *       土豆                            2              4.1     * @param menuMsgMap    Key为餐次 Value为 菜谱字符串数组    格式为:豆沙包$数量$单价     * @return     */    public static String printMenuMSG(LinkedHashMap> menuMsgMap){        sb.delete(0, sb.length());        String menus[] = null;        List menuNames = new ArrayList();        List menuPrices = new ArrayList();        for(List strList : menuMsgMap.values()){            for(String str : strList){                if(str.contains(SEPARATOR)){                    menus = str.split("["+SEPARATOR+"]");                    if(menus!=null && menus.length!=0){                        menuNames.add(menus[0]);                        menuPrices.add(menus[2]);                    }                }            }        }        String menuNameTxt = "菜名";        String numTxt = "数量";        String priceTxt = "单价\n";        int leftPrefixLength = getMaxLength(menuNames.toArray());        int rightPrefixLength = getMaxLength(menuPrices.toArray());        if(rightPrefixLengthint leftMiddleNameLength = (leftPrefixLength-getBytesLength(menuNameTxt))/2;        for(int i=0;i" ");        }        sb.append(menuNameTxt);        int middleNumTxtLength = (LINE_BYTE_SIZE - leftPrefixLength - rightPrefixLength - getBytesLength(numTxt))/2;        for(int i=0;i" ");        }        sb.append(numTxt);        int middlePriceTxtLength = (rightPrefixLength-getBytesLength(priceTxt))/2;        for(int i=0;i" ");        }        sb.append(priceTxt);        for(Entry> entry : menuMsgMap.entrySet()){            if(!"".equals(entry.getKey()))                sb.append(entry.getKey()+"\n");            for(String menu : entry.getValue()){                if(menu.contains(SEPARATOR)){                    menus = menu.split("["+SEPARATOR+"]");                    if(menus!=null && menus.length!=0){                        sb.append(menus[0]);                        for(int i=0;i<(leftPrefixLength - getBytesLength(menus[0]) + middleNumTxtLength + getBytesLength(numTxt)/2 -1);i++){                            sb.append(" ");                        }                        sb.append(menus[1]);                        for(int i=0;i<(middleNumTxtLength+getBytesLength(numTxt)/2 + 1 -getBytesLength(menus[1])+middlePriceTxtLength);i++){                            sb.append(" ");                        }                        sb.append(menus[2]+"\n");                    }                }else{  //不包含分隔符  直接打印                    for(int i=0;i"\n");i++){                        sb.append(menu);                    }                    sb.append("\n");                }            }        }        return sb.toString();    }

至此,关于android连接打印机实现格式化打印的知识介绍完毕了,如有疑问欢迎留言。

更多相关文章

  1. 漫谈Android数据缓存、数据序列化和Intent传递复杂数据
  2. Android(安卓)6.0 BluetoothAdapter.startDiscovery()扫描不到蓝
  3. Android(安卓)蓝牙开发(九)A2DP基本功能
  4. Android(安卓)TextView 添加下划线的几种方式
  5. Android蓝牙开发(一)蓝牙模块及核心API
  6. Android软件开发之盘点自定义View界面大合集(二)
  7. android string.xml %问题
  8. Android(安卓)平台软件兼容性问题凸显
  9. Android(安卓)Java包

随机推荐

  1. Android(安卓)窗体泄露问题
  2. Android(安卓)LinearLayout和FrameLayout
  3. android:shape
  4. window.requestWindowFeature()基本用法
  5. android 如何屏蔽Home键(长按短按都不起作
  6. Android(安卓)LruCache
  7. android 获得手机运营商
  8. 关于android上的定位
  9. android跳转权限设置页面
  10. Android中在OnCreate时获得控件高度