最近在做小票打印这块,项目需求是蓝牙和WiFi两种都要实现,开始做的时候也是一脸懵,然后网上找了一些代码,看了好多博主的文章,最后自己把这些都综合到一起0.0,结果还好成功了
先看看图吧,蓝牙和WiFi打印出的都是一样的,毕竟都是同一个工具类(打印机型号 爱宝POS-80C 、 资江 ZJ-80)
先来看看WiFi打印(旁边的色块是打印纸自带的,我也很无奈)
首先在你的activity里触发点击事件
right = (TextView) findViewById(R.id.right);//点击WiFi打印 right.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { pos(); } }); //调用打印的方法
private void pos() {
// 开启一个子线程
new Thread() {
public void run() {
try { //打印机网口IP 打印机端口号 编码方式
pos = new Pos(Preference.instance(PayTypeActivity.this).getIPAddress(), Integer.parseInt(Preference.instance(PayTypeActivity.this).getPost_IDs()), "gbk");
//初始化打印机
pos.initPos();
if (!TextUtils.isEmpty(objBean.getHead_img())){
pos.printLocation(1);
bitmap = pos.compressPic(returnBitMap(objBean.getHead_img()));
pos.draw2PxPoint(bitmap);
}
pos.printLocation(1);
pos.bold(true);
pos.printTabSpace(2);
pos.printWordSpace(1);
pos.printTextNewLine(objBean.getShop_name());
pos.printLocation(0);
pos.printTextNewLine("----------------------------------------------");
pos.bold(false);
pos.printTextNewLine("订 单 号:"+objBean.getSn());
pos.printTextNewLine("用 户 名:"+objBean.getMember());
pos.printTextNewLine("订单日期:"+objBean.getCreate_time());
pos.printTextNewLine("支付方式:"+objBean.getPay_way());
pos.printTextNewLine("订单折扣:"+objBean.getDiscount());
pos.printTextNewLine("订单备注:"+objBean.getRemarks());
pos.printLine(2);
pos.printText("货号 尺码 颜色 数量 小计");
pos.printLocation(20, 1);
pos.printTextNewLine("----------------------------------------------");
for (ParentBean foods : foodsBean) {
pos.printTextNewLine(foods.getGoods_name()+" "+foods.getCode_number()+" "+foods.getColour()+" "+foods.getNum()+" "+foods.getPay_back());
pos.printLocation(20, 1);
}
pos.printTextNewLine("----------------------------------------------");
pos.printLocation(0);
pos.printLine(1);
pos.printTextNewLine("订单总数:"+objBean.getNums());
pos.printTextNewLine("应收金额:"+objBean.getActual_pay());
pos.printTextNewLine("优惠金额:"+objBean.getDiscount_pay());
pos.printTextNewLine("实收金额:"+objBean.getPay());
pos.printLine(2);
// //打印二维码 -- 如果提供了二维码的地址则用该方法
// pos.qrCode(objBean.getQr_code());
//打印二维码的图片 -- 如果提供了二维码的截图则用该方法
if (!TextUtils.isEmpty(objBean.getQr_code())){
pos.printLocation(1);
Qbitmap = pos.compressPic(returnBitMap(objBean.getQr_code()));//url 转换为bitmap
pos.draw2PxPoint(Qbitmap);
}
//切纸
pos.feedAndCut();
pos.closeIOAndSocket();
pos = null;
} catch (UnknownHostException e) {
e.printStackTrace();
showToast(e.toString());
Log.d("tag", "错误信息1:" + e.toString());
} catch (IOException e) {
e.printStackTrace();
showToast(e.toString());
Log.d("tag", "错误信息2:" + e.toString());
}
}
}.start();
}
//将图片url转换为bitmap
public Bitmap returnBitMap(String url) {
URL myFileUrl = null;
Bitmap bitmap = null;
try {
myFileUrl = new URL(url);
} catch (MalformedURLException e) {
e.printStackTrace();
}
try {
HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection();
conn.setDoInput(true);
conn.connect();
InputStream is = conn.getInputStream();
bitmap = BitmapFactory.decodeStream(is);
is.close();
} catch (IOException e) {
e.printStackTrace();
}
return bitmap;
}
再来看看调用的工具类(蓝牙和WiFi共用一个,只是初始化方式不同)
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Rect;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
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);
}
//蓝牙初始化
public Pos(OutputStream outputStream, String encoding) throws IOException {
writer = new OutputStreamWriter(outputStream, encoding);
socketOut = outputStream;
initPrinter();
}
public void print(byte[] bs) throws IOException {
socketOut.write(bs);
}
public void printRawBytes(byte[] bytes) throws IOException {
socketOut.write(bytes);
socketOut.flush();
}
/**
* 初始化打印机
*
* @throws IOException
*/
public void initPrinter() throws IOException {
socketOut.write(0x1B);
socketOut.write(0x40);
socketOut.flush();
}
/**
* 关闭IO流和Socke