Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Android下的POS打印机调用的简单实现大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

本文基于GP58系列,它可以兼容ESC/POS指令集,对EPSON的打印机通用.

Android下的设备调试,如果设备提供了驱动,按照厂家的驱动调试即可;设备未提供驱动,只能按照通用的方法进行调试。这里采用的是调用USB接口来控制打印机输出

1.首先获取USB管理器@H_607_5@

public UsbAdmin(Context context) { 
    mUsbManager = (UsbManager) context.getSystemservice(Context.USB_serviCE); 
    mPermissionIntent = PendingIntent.getBroadcast(context,new Intent(ACTION_USB_PERMISSION),0); 
    IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION); 
    context.registerReceiver(mUsbReceiver,filter); 
  }
@H_404_10@

使用一个延迟意图来接收usb接入时的广播,当广播接收到时,说明有新的设备接入。@H_607_5@

添加一个boardcast action@H_607_5@

复制代码 代码如下:@H_404_10@
@H_607_5@ private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION"; @H_607_5@ @H_404_10@@H_607_5@

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); 
          } 
 
        } 
 
      } 
    } 
  }; 
@H_404_10@

取到usb设备的引用,android系统会询问你是否允许设备访问,认为false;当允许了访问之后,会判断USB的引用是否为null,如果不为空则会调用setDevice来创建一个Connection,否则会关闭本次连接。@H_607_5@

在setDevice中,我们可以获取设备的功能集(UsbInterface),也可以获取通信通道(UsbEndpoint),同时也创建了host与device的连接用来传输数据。@H_607_5@

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,"端点是:" + i + "方向是:" + ep.getDirection() + "类型是:" + ep.getType()); 
            if (ep.getDirection() == 0 && ep.getType() == UsbConstantS.USB_ENDPOINT_XFER_BULK) { 
              Log.i(tag,"接口是:" + j + "端点是:" + i); 
              break; 
            } 
          } 
          if (i != UsbEndpointCount) { 
            break; 
          } 
        } 
      } 
      if (j == InterfaceCount) { 
        Log.i(tag,"没有打印机接口"); 
        return; 
      } 
 
      mEndpoinTintr = ep; 
 
        UsbDeviceConnection connection = mUsbManager.openDevice(devicE); 
 
        if (connection != null && connection.claimInterface(intf,truE)) { 
          Log.i(tag,"打开成功! "); 
          mConnection = connection; 
 
        } else { 
          Log.i(tag,"打开失败! "); 
          mConnection = null; 
        } 
      } 
 
  } 
@H_404_10@

2.在相关的类中新建一个UsbAdmin,调用openUsb,这里首先是走了上面的setDevice()方法获取到了设备的引用,当连接通道建立时列出所有USB设备,当设备的引用不存在时同样列出所有的USB设备,并且都请求获取USB权限。

public void openUsb() { 
    if (mDevice != null) { 
      setDevice(mDevicE); 
      if (mConnection == null) { 
        HashMap<String,UsbDevice> deviceList = mUsbManager.getDeviceList(); 
        Iterator<UsbDevice> deviceIterator = deviceList.values().iterator(); 
 
        while (deviceIterator.hasNext()) { 
          UsbDevice device = deviceIterator.next(); 
          mUsbManager.requestPermission(device,mPermissionIntent); 
        } 
      } 
    } else { 
      HashMap<String,UsbDevice> deviceList = mUsbManager.getDeviceList(); 
      Iterator<UsbDevice> deviceIterator = deviceList.values().iterator(); 
 
      while (deviceIterator.hasNext()) { 
        UsbDevice device = deviceIterator.next(); 
        mUsbManager.requestPermission(device,mPermissionIntent); 
      } 
    } 
  } 

@H_404_10@

3.当上面两部都走完了之后,我们就可以发送指令来控制已经建立连接的打印机了,这里我们使用的是标准的ESC/POS指令集,为硬件认,贴出代码,这里的指令集采用的是十进制表示形式,也可以替换成十六进制。

public class printerCmdUtils { 
 
  /** 
   * 这些数据源自爱普生指令集,为POS机硬件认 
   */ 
 
  public static final byte ESC = 27;//换码 
  public static final byte FS = 28;//文本分隔符 
  public static final byte GS = 29;//组分隔符 
  public static final byte DLE = 16;//数据连接换码 
  public static final byte EOT = 4;//传输结束 
  public static final byte ENQ = 5;//询问字符 
  public static final byte SP = 32;//空格 
  public static final byte HT = 9;//横向列表 
  public static final byte LF = 10;//打印并换行(水平定位) 
  public static final byte CR = 13;//归位键 
  public static final byte FF = 12;//走纸控制(打印并回到标准模式(在页模式下) ) 
  public static final byte CAN = 24;//作废(页模式下取消打印数据 ) 
   
   
   
//------------------------打印机初始化----------------------------- 
   
   
  /** 
   * 打印机初始化 
   * @return 
   */ 
  public static byte[] init_printer() 
  { 
    byte[] result = new byte[2]; 
    result[0] = ESc; 
    result[1] = 64; 
    return result; 
  } 
   
   
//------------------------换行----------------------------- 
  
   
  /** 
   * 换行 
   * @param lineNum要换几行 
   * @return 
   */ 
  public static byte[] nextLine(int lineNum) 
  { 
      byte[] result = new byte[lineNum]; 
      for(int i=0;i<lineNum;i++) 
      { 
        result[i] = LF; 
      } 
       
      return result; 
  } 
   
 
//------------------------下划线-----------------------------   
   
   
  /** 
   * 绘制下划线(1点宽) 
   * @return 
   */ 
  public static byte[] underlineWithOneDotWidthOn() 
  { 
      byte[] result = new byte[3]; 
    result[0] = ESc; 
    result[1] = 45; 
    result[2] = 1; 
    return result; 
  } 
   
   
  /** 
   * 绘制下划线(2点宽) 
   * @return 
   */ 
  public static byte[] underlineWithTwoDotWidthOn() 
  { 
      byte[] result = new byte[3]; 
    result[0] = ESc; 
    result[1] = 45; 
    result[2] = 2; 
    return result; 
  } 
  /** 
   * 取消绘制下划线 
   * @return 
   */ 
  public static byte[] underlineOff() 
  { 
      byte[] result = new byte[3]; 
    result[0] = ESc; 
    result[1] = 45; 
    result[2] = 0; 
    return result; 
  } 
 
   
//------------------------加粗----------------------------- 
  
   
  /** 
   * 选择加粗模式 
   * @return 
   */ 
  public static byte[] boldOn() 
  { 
      byte[] result = new byte[3]; 
    result[0] = ESc; 
    result[1] = 69; 
    result[2] = 0xF; 
    return result; 
  } 
   
   
  /** 
   * 取消加粗模式 
   * @return 
   */ 
  public static byte[] boldOff() 
  { 
      byte[] result = new byte[3]; 
    result[0] = ESc; 
    result[1] = 69; 
    result[2] = 0; 
    return result; 
  } 
 
 
//------------------------对齐----------------------------- 
   
   
  /** 
   * 左对齐 
   * @return 
   */ 
  public static byte[] alignLeft() 
  { 
      byte[] result = new byte[3]; 
    result[0] = ESc; 
    result[1] = 97; 
    result[2] = 0; 
    return result; 
  } 
   
   
  /** 
   * 居中对齐 
   * @return 
   */ 
  public static byte[] alignCenter() 
  { 
      byte[] result = new byte[3]; 
    result[0] = ESc; 
    result[1] = 97; 
    result[2] = 1; 
    return result; 
  } 
   
   
  /** 
   * 右对齐 
   * @return 
   */ 
  public static byte[] alignRight() 
  { 
      byte[] result = new byte[3]; 
    result[0] = ESc; 
    result[1] = 97; 
    result[2] = 2; 
    return result; 
  } 
 
   
  /** 
   * 水平方向向右移动col列 
   * @param col 
   * @return 
   */ 
  public static byte[] set_HT_position( byte col ) 
  { 
    byte[] result = new byte[4]; 
    result[0] = ESc; 
    result[1] = 68; 
    result[2] = col; 
    result[3] = 0; 
    return result; 
  } 
//------------------------字体变大----------------------------- 
  
   
  /** 
   * 字体变大为标准的n倍 
   * @param num 
   * @return 
   */ 
  public static byte[] fontSizeSetBig(int num) 
  { 
      byte realSize = 0; 
      switch (num) 
      { 
      case 1: 
        realSize = 0;break; 
      case 2: 
        realSize = 17;break; 
      case 3: 
        realSize = 34;break; 
      case 4: 
        realSize = 51;break; 
      case 5: 
        realSize = 68;break; 
      case 6: 
        realSize = 85;break; 
      case 7: 
        realSize = 102;break; 
      case 8: 
        realSize = 119;break; 
      } 
      byte[] result = new byte[3]; 
      result[0] = 29; 
      result[1] = 33; 
      result[2] = realSize; 
      return result; 
  } 
 
   
//------------------------字体变小----------------------------- 
  
   
  /** 
   * 字体取消倍宽倍高 
   * @param num 
   * @return 
   */ 
  public static byte[] fontSizeSetsmall(int num) 
  { 
      byte[] result = new byte[3]; 
      result[0] = ESc; 
      result[1] = 33; 
     
    return result; 
  } 
 
 
//------------------------切纸-----------------------------   
  
   
  /** 
   * 进纸并全部切割 
   * @return 
   */ 
  public static byte[] FeedPaperCutAll() 
  { 
      byte[] result = new byte[4]; 
     result[0] = GS; 
     result[1] = 86; 
     result[2] = 65; 
     result[3] = 0; 
     return result; 
  } 
   
   
  /** 
   * 进纸并切割(左边留一点不切) 
   * @return 
   */ 
  public static byte[] FeedPaperCutPartial() 
  { 
      byte[] result = new byte[4]; 
     result[0] = GS; 
     result[1] = 86; 
     result[2] = 66; 
     result[3] = 0; 
     return result; 
  } 
 
//------------------------切纸----------------------------- 
  public static byte[] byteMerger(byte[] byte_1,byte[] byte_2){  
    byte[] byte_3 = new byte[byte_1.length+byte_2.length];  
    System.arraycopy(byte_1,byte_3,byte_1.length);  
    System.arraycopy(byte_2,byte_1.length,byte_2.length);  
    return byte_3;  
  }  
   
   
  public static byte[] byteMerger(byte[][] byteList){  
     
      int length = 0; 
    for(int i=0;i<byteList.length;i++) 
    { 
        length += byteList[i].length; 
    } 
    byte[] result = new byte[length]; 
     
    int index = 0; 
    for(int i=0;i<byteList.length;i++) 
    { 
        byte[] NowByte = byteList[i]; 
        for(int k=0;k<byteList[i].length;k++) 
        { 
          result[index] = NowByte[k]; 
          index++; 
        } 
    } 
    return result;  
  }  
   
  
   
} 

@H_404_10@

4.在以上都完成之后,就可以把你需要的字符串转换成byte数组并调用sendCommand方法来进行打印了

@SuppressLint("NewApi") 
  public Boolean sendCommand(byte[] Content) { 
    Boolean Result; 
    synchronized (this) { 
      int len = -1; 
      if (mConnection != null) { 
        len = mConnection.bulkTransfer(mEndpoinTintr,Content,Content.length,10000); 
      } 
 
      if (len < 0) { 
        Result = false; 
        Log.i(tag,"发送失败! " + len); 
      } else { 
        Result = true; 
        Log.i(tag,"发送" + len + "字节数据"); 
      } 
    } 
    return Result; 

@H_404_10@

复制代码 代码如下:@H_404_10@
@H_607_5@ len = mConnection.bulkTransfer(mEndpoinTintr,10000);  @H_607_5@ @H_404_10@@H_607_5@

这一步仅仅加了同步锁,并未开启一个新的线程去处理,在本机上没有问题,但上面的USB通信机制的文章有提到要放到异步线程,这里需要注意。@H_607_5@

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

本图文内容来源于网友网络收集整理提供,作为学习参使用,版权属于原作者。

猜你在找的Android相关文章

问题描述:预览图像被拉伸变形问题原因:由于预览图像大小跟SurfaceView 大小不一致引起 解决方法:获取系统支持的所有预览尺寸[getSupportedPictureSizes],然后再取一个比
可以忽略onWindowFocusChanged、onSaveInstanceState、onRestoreInstanceState几个事件,这几个事件官网中的生命周期里面没有提到、忽略掉这几个方法
ListView 的高度 必须要设置成一个明确的值 或者match_parent 不然就会调用多次getView方法
一. 在Android的源文件中的乱码问题Android studio安装后发现所有的中文,不管是界面上的还是输出的log中的中文都变成小框框,具体的解决方法如下,可以肯定是字体的问题解决:菜单Fil
第一部分 个性化控件(View)主要介绍那些不错个性化的 View,包括 ListView、ActionBar、Menu、ViewPager、Gallery、GridView、ImageView、ProgressBar、TextView、ScrollView、TimeView、TipView、FlipView、ColorPickView、GraphView、UI Style 等等。一、Li...
View与Widget带小红点的提示:BadgeViewBadgeView(stefanjauker的,改颜色需要在BadgeView源码里面改) android-viewbadger(可以设置提示为数字或者文字,以及背景颜色)标签tagviewTAGView(可以设置背景图片的形状和颜色,可以同时显示图片和文字) android-tagview(Android-Cloud-Ta...
内容抽屉菜单 ListView WebView SwitchButton 按钮 点赞按钮 进度条 TabLayout 图标 下拉刷新 ViewPager 图表(Chart) 菜单(Menu) 浮动菜单 对话框 空白页 滑动删除 手势操作 RecyclerView Card Color Drawable Spinner 布局 模糊效果 TabBar AppBar 选择器(Picker) 跑马灯 日历时间 主题样式 ImageView 通知
Android Context作用Context 用于访问全局信息的接口App的资源: Strings, drawable资源等等下面咱们来看一个例子public class MainActivity extends Activity { String TAG = "CARLOZ"; @Override protected void onCreate(Bundle savedIn

Android下的POS打印机调用的简单实现

微信公众号搜 "程序精选"关注
@H_475_262@

大佬总结

以上是大佬教程为你收集整理的Android下的POS打印机调用的简单实现全部内容,希望文章能够帮你解决Android下的POS打印机调用的简单实现所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
猜你在找的Android相关文章