安卓系统下的POS打印机调用的简单实现

  

本文基于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打印机调用的简单实现