藍牙打印:之前在做項目時蓄愁,遇到要做手機端的藍牙打印双炕,其實就是手機端結(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機的打印方式。