日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

Android下的POS打印機(jī)調(diào)用的簡(jiǎn)單實(shí)現(xiàn)教程


Android下的POS打印機(jī)調(diào)用的簡(jiǎn)單實(shí)現(xiàn)教程


本文基于GP58系列,它可以兼容ESC/POS指令集,對(duì)EPSON的打印機(jī)通用.
Android下的設(shè)備調(diào)試,如果設(shè)備提供了驅(qū)動(dòng),按照廠家的驅(qū)動(dòng)調(diào)試即可;設(shè)備未提供驅(qū)動(dòng),只能按照通用的方法進(jìn)行調(diào)試 。這里采用的是調(diào)用USB接口來(lái)控制打印機(jī)輸出 。
1.首先獲取USB管理器
public UsbAdmin(Context context) {
mUsbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
mPermissionIntent = PendingIntent.getBroadcast(context, 0, new Intent(ACTION_USB_PERMISSION), 0);
IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
context.registerReceiver(mUsbReceiver, filter);
}
使用一個(gè)延遲意圖來(lái)接收usb接入時(shí)的廣播,當(dāng)廣播接收到時(shí),說(shuō)明有新的設(shè)備接入 。
添加一個(gè)boardcast action
復(fù)制代碼 代碼如下:
private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION";
private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (ACTION_USB_PERMISSION.equals(action)) {
synchronized (this) {
UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
if (device != null) {
setDevice(device);
} else {
Closeusb();
// mDevice = device;
}
} else {
Log.d(TAG, "permission denied for device " + device);
}
}
}
}
};
取到usb設(shè)備的引用,android系統(tǒng)會(huì)詢問(wèn)你是否允許設(shè)備訪問(wèn),默認(rèn)為false;當(dāng)允許了訪問(wèn)之后,會(huì)判斷USB的引用是否為null,如果不為空則會(huì)調(diào)用setDevice來(lái)創(chuàng)建一個(gè)Connection,否則會(huì)關(guān)閉本次連接 。
在setDevice中,我們可以獲取設(shè)備的功能集(UsbInterface),也可以獲取通信通道(UsbEndpoint),同時(shí)也創(chuàng)建了host與device的連接用來(lái)傳輸數(shù)據(jù) 。
private void setDevice(UsbDevice device) {
if (device != null) {
UsbInterface intf = null;
UsbEndpoint ep = null;
int InterfaceCount = device.getInterfaceCount();
int j;
mDevice = device;
for (j = 0; j < InterfaceCount; j++) {
int i;
intf = device.getInterface(j);
Log.i(TAG, "接口是:" + j + "類是:" + intf.getInterfaceClass());
if (intf.getInterfaceClass() == 7) {
int UsbEndpointCount = intf.getEndpointCount();
for (i = 0; i < UsbEndpointCount; i++) {
ep = intf.getEndpoint(i);
Log.i(TAG, "端點(diǎn)是:" + i + "方向是:" + ep.getDirection() + "類型是:" + ep.getType());
if (ep.getDirection() == 0 && ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) {
Log.i(TAG, "接口是:" + j + "端點(diǎn)是:" + i);
break;
}
}
if (i != UsbEndpointCount) {
break;
}
}
}
if (j == InterfaceCount) {
Log.i(TAG, "沒(méi)有打印機(jī)接口");
return;
}
【Android下的POS打印機(jī)調(diào)用的簡(jiǎn)單實(shí)現(xiàn)教程】mEndpointIntr = ep;
UsbDeviceConnection connection = mUsbManager.openDevice(device);
if (connection != null && connection.claimInterface(intf, true)) {
Log.i(TAG, "打開(kāi)成功! ");
mConnection = connection;
} else {
Log.i(TAG, "打開(kāi)失敗! ");
mConnection = null;
}
}
}
2.在相關(guān)的類中新建一個(gè)UsbAdmin,調(diào)用openUsb,這里首先是走了上面的setDevice()方法,獲取到了設(shè)備的引用,當(dāng)連接通道建立時(shí)列出所有USB設(shè)備,當(dāng)設(shè)備的引用不存在時(shí)同樣列出所有的USB設(shè)備,并且都請(qǐng)求獲取USB權(quán)限 。
public void openUsb() {
if (mDevice != null) {
setDevice(mDevice);

推薦閱讀