本文基于GP58系列,它可以兼容ESC/POS指令集,对爱普生的打印机通用。
安卓系统下的设备调试,如果设备提供了驱动,按照厂家的驱动调试即可,设备未提供驱动,只能按照通用的方法进行调试。这里采用的是调用USB接口来控制打印机输出。
1。首先获取USB管理器
公共UsbAdmin(上下文语境){ mUsbManager=(UsbManager) context.getSystemService (Context.USB_SERVICE); mPermissionIntent=PendingIntent。getBroadcast(上下文,0,新意图(ACTION_USB_PERMISSION), 0); IntentFilter过滤器=new IntentFilter (ACTION_USB_PERMISSION); 上下文。registerReceiver (mUsbReceiver、过滤); }
使用一个延迟意图来接收usb接入时的广播,当广播接收到时,说明有新的设备接入。
添加一个重播行动
代码如下:
私有静态最终字符串ACTION_USB_PERMISSION=癱om.android.example.USB_PERMISSION”;
私人最终BroadcastReceiver mUsbReceiver=new BroadcastReceiver () { 公共空间> 私人空间setDevice (UsbDevice设备){ 如果(设备!=null) { UsbInterface intf=零; UsbEndpoint ep=零; int InterfaceCount=device.getInterfaceCount (); int j; mDevice=设备; (j=0;j & lt;InterfaceCount;j + +) { int我; intf=device.getInterface (j); 日志。我(标签,“接口是:“+ j +”类是:”+ intf.getInterfaceClass ()); 如果(intf.getInterfaceClass ()==7) { int UsbEndpointCount=intf.getEndpointCount (); (我=0;我& lt;UsbEndpointCount;我+ +){ ep=intf.getEndpoint(我); 日志。我(标签,“端点是:“+我+”方向是:”+ ep.getDirection() +“类型是:”+ ep.getType ()); 如果(ep.getDirection ()==0,,ep.getType ()==UsbConstants.USB_ENDPOINT_XFER_BULK) { 日志。我(标签,“接口是:“+ j +“端点是:”+ i); 打破; } } 如果(我!=UsbEndpointCount) { 打破; } } } 如果(j==InterfaceCount) { 日志。我(标签,“没有打印机接口”); 返回; } mEndpointIntr=ep; UsbDeviceConnection连接=mUsbManager.openDevice(设备); 如果(连接!=零,,连接。claimInterface (intf,真)){ 日志。我(标签,“打开成功!”); mConnection=连接; 其他}{ 日志。我(标签,“打开失败!”); mConnection=零; } } } >之前2。在相关的类中新建一个UsbAdmin,调用openUsb,这里首先是走了上面的setDevice()方法,获取到了设备的引用,当连接通道建立时列出所有USB设备,当设备的引用不存在时同样列出所有的USB设备,并且都请求获取USB权限。
公共空间openUsb () { 如果(mDevice !=null) { setDevice (mDevice); 如果(mConnection==null) { UsbDevice> HashMap<字符串;deviceList=mUsbManager.getDeviceList (); Iterator.iterator deviceIterator=deviceList.values () (); 而(deviceIterator.hasNext ()) { UsbDevice设备=deviceIterator.next (); mUsbManager。requestPermission(设备,mPermissionIntent); } } 其他}{ UsbDevice> HashMap<字符串;deviceList=mUsbManager.getDeviceList (); Iterator .iterator deviceIterator=deviceList.values () (); 而(deviceIterator.hasNext ()) { UsbDevice设备=deviceIterator.next (); mUsbManager。requestPermission(设备,mPermissionIntent); } } } >之前 3。当上面两部都走完了之后,我们就可以发送指令来控制已经建立连接的打印机了,这里我们使用的是标准的ESC/POS指令集,为硬件默认,贴出代码,这里的指令集采用的是十进制表示形式,也可以替换成十六进制。
公开课printerCmdUtils {/* * *这些数据源自爱普生指令集,为POS机硬件默认 */公共静态最后字节ESC=27;//换码 公共静态最后字节FS=28;//文本分隔符 公共静态最后字节GS=29;//组分隔符 公共静态最后字节DLE=16;//数据连接换码 公共静态最后字节传输结束=4;//传输结束 公共静态最后字节询问=5;//询问字符 公共静态最后字节SP=32;//空格 公共静态最后字节HT=9;//横向列的表 公共静态最后字节低频=10;//打印并换行(水平定位) 公共静态最后字节CR=13;//归位键 公共静态最后字节FF=12;//走纸控制(打印并回到标准模式(在页模式下)) 公共静态最后字节可以=24;//作废(页模式下取消打印数据)//- - - - - - - - - - - - - - - - - - - - - - - -打印机初始化- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -/* * *打印机初始化 * @return */公共静态byte [] init_printer () { byte[]=新字节[2]; 结果[0]=ESC; 结果[1]=64; 返回结果; }//- - - - - - - - - - - - - - - - - - - - - - - -换行- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -/* * *换行 * @param lineNum要换几行 * @return */公共静态byte [] nextLine (int lineNum) { byte[]=新字节(lineNum); (int i=0; i安卓系统下的POS打印机调用的简单实现