Android下的设备调试,如果设备提供了驱动,按照厂家的驱动调试即可;设备未提供驱动,只能按照通用的方法进行调试。

对于智能POS、收银机以及其他打印设备,如果厂商不提供打印相关sdk,那么打印功能怎么实现呢?其实我们可以基于USB通信机制,自己去实现打印驱动。

整个实现流程如下

  1. 初始化打印机:首先要获取USB管理器;其次要注册监听USB设备插拔变化和请求权限的广播;最后列出所有的USB设备,并且都请求获取USB权限;

  2. 实现这个广播接收器:当接收到请求权限的广播时,获取USB设备的引用,android系统会询问你是否允许设备访问,默认为false;当允许了访问之后,会判断USB的引用是否为null, 如果不为空,说明该设备可以连接,否则提示设备拒绝访问;如果接收到已连接的打印设备移除的广播,则要关闭本次连接。

  3. 对于获得权限可使用的USB,我们将获取设备的功能集(UsbInterface)和通信通道(UsbEndpoint),然后创建host与device的连接用来传输数据。

  4. 最后,我们在需要打印的地方调用上面封装好的打印方法,就可以发送指令来控制已经建立连接的打印机了。

USB打印机实现

/*** USB打印机* Created by john on 17-5-10.*/public class USBPrinter {private static final String ACTION_USB_PERMISSION = "com.usb.printer.USB_PERMISSION";private static USBPrinter mInstance;private Context mContext;private UsbDevice mUsbDevice;private PendingIntent mPermissionIntent;private UsbManager mUsbManager;private UsbDeviceConnection mUsbDeviceConnection;private final BroadcastReceiver mUsbDeviceReceiver = new BroadcastReceiver() {public void onReceive(Context context, Intent intent) {String action = intent.getAction();if (ACTION_USB_PERMISSION.equals(action)) {synchronized (this) {UsbDevice usbDevice = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {mUsbDevice = usbDevice;} else {Toast.makeText(context, "Permission denied for device " + usbDevice, Toast.LENGTH_SHORT).show();}}} else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {if (mUsbDevice != null) {Toast.makeText(context, "Device closed", Toast.LENGTH_SHORT).show();if (mUsbDeviceConnection != null) {mUsbDeviceConnection.close();}}}}};private USBPrinter() {}public static USBPrinter getInstance() {if (mInstance == null) {mInstance = new USBPrinter();}return mInstance;}/*** 初始化打印机,需要与destroy对应** @param context 上下文*/public static void initPrinter(Context context) {getInstance().init(context);}/*** 销毁打印机持有的对象*/public static void destroyPrinter() {getInstance().destroy();}private void init(Context context) {mContext = context;mUsbManager = (UsbManager) mContext.getSystemService(Context.USB_SERVICE);mPermissionIntent = PendingIntent.getBroadcast(mContext, 0, new Intent(ACTION_USB_PERMISSION), 0);IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);mContext.registerReceiver(mUsbDeviceReceiver, filter);// 列出所有的USB设备,并且都请求获取USB权限HashMap<String, UsbDevice> deviceList = mUsbManager.getDeviceList();for (UsbDevice device : deviceList.values()) {mUsbManager.requestPermission(device, mPermissionIntent);}}private void destroy() {mContext.unregisterReceiver(mUsbDeviceReceiver);if (mUsbDeviceConnection != null) {mUsbDeviceConnection.close();mUsbDeviceConnection = null;}mContext = null;mUsbManager = null;}/*** 打印方法* @param msg*/public void print(String msg) {final String printData = msg;if (mUsbDevice != null) {UsbInterface usbInterface = mUsbDevice.getInterface(0);for (int i = 0; i < usbInterface.getEndpointCount(); i++) {final UsbEndpoint ep = usbInterface.getEndpoint(i);if (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) {if (ep.getDirection() == UsbConstants.USB_DIR_OUT) {mUsbDeviceConnection = mUsbManager.openDevice(mUsbDevice);if (mUsbDeviceConnection != null) {Toast.makeText(mContext, "Device connected", Toast.LENGTH_SHORT).show();mUsbDeviceConnection.claimInterface(usbInterface, true);new Thread(new Runnable() {@Overridepublic void run() {byte[] bytes = printData.getBytes();int b = mUsbDeviceConnection.bulkTransfer(ep, bytes, bytes.length, 100000);Log.i("Return Status", "b-->" + b);}}).start();mUsbDeviceConnection.releaseInterface(usbInterface);break;}}}}} else {Toast.makeText(mContext, "No available USB print device", Toast.LENGTH_SHORT).show();}}
}

Android打印机--没有设备驱动sdk,自己实现USB打印功能相关推荐

  1. GdPicture.NET SDK Crack,提供多种打印功能

    GdPicture.NET SDK Crack,提供多种打印功能 GdPicture.NET SDK(以前称为 GdPicture.NET Document Imaging SDK Ultimate) ...

  2. android mipi数据,基于Android的MIPI设备驱动设计与实现

    摘要: 随着科技的进步和人们生活水平不断提高,人们越来越离不开移动应用设备,手机和平板作为Android系统的重要载体已经走进了千家万户,Android作为目前市场份额最大的嵌入式操作系统,跟Symb ...

  3. linux设备驱动子系统,Linux设备驱动子系统终极弹 - USB

    0. 预备理论 1. USB Core 2. USB Hub 3. USB OTG 4. USB Host 5. USB Gadget 6. USB Mass Storage USB博大精深,不是一两 ...

  4. linux usb驱动 probe,linux USB设备驱动之2:usb设备的probe全过程

    本文将详细讲述2.6.22下的一个USB设备插上linux系统的PC后是如何一步一步调到我们的usb设备驱动的probe函数的,我们知道我们的USB驱动的probe函数中的一个参数是interface ...

  5. USB设备驱动开发之远程访问USB设备(一USB设备数据采集端)

    By Fanxiushu 2016 05-15  转载或引用本文,请注明原始作者. 使用过vmware的人都应该知道,vmware虚拟机有这样的一个功能, 当在宿主机上插入一个USB设备的时候,通过设 ...

  6. Android 尝试写一份Linux 字符设备驱动

    从事android工作几年时间,功底不是很深,一直围绕这android系统定制移植开发,慢慢的从应用层接触到framework层,在接触到hal,目前从事的工作wifi驱动相关工作.但是没有系统的学习 ...

  7. android 设备驱动

    驱动概述 说到 android 驱动是离不开 Linux 驱动的.Android 内核采用的是 Linux2.6 内核 (最近Linux 3.3 已经包含了一些 Android 代码).但 Andro ...

  8. Android 开发之 ---- 底层驱动开发(一) 【转】

    转自:http://blog.csdn.net/jmq_0000/article/details/7372783 版权声明:本文为博主原创文章,未经博主允许不得转载. 驱动概述 说到 Android  ...

  9. Linux设备驱动之usb设备驱动详解

    原文地址:http://blog.csdn.net/chenjin_zhong/article/details/6329316 1.Linux usb设备驱动框架 USB是通用串行总线的总称,Linu ...

最新文章

  1. 10亿美元续命!OpenAI获微软投资,意在通用人工智能?
  2. php批量处理图片大小,word图片怎么批量调整大小
  3. matlab 将矩阵A写入文件
  4. 是否有一个不区分大小写的string.Replace的替代方法?
  5. 中国12个工科世界第一,网友:全是不吃香的|软科2021世界一流学科排名
  6. Docker 概念详解
  7. oracle 清理跟踪文件.trc .trm
  8. OSI七层模型加协议
  9. CM: transformation CRM_OFFICE_INT_RT_ADD_NS
  10. mysql服务不能启动的几大原因
  11. 订阅号微信公众号历史文章爬虫php,一步步教你怎么打造微信公众号历史文章爬虫...
  12. 31寸Aoc显示器写代码真香!包邮送一台!
  13. 机器学习(九)初识BP神经网络
  14. 分析ARP***与欺骗
  15. VMware 修复 Workstation、Fusion 和 ESXi中的多个漏洞
  16. Jar 包依赖冲突排查思路和解决方法(logback + slf4j-log4j12)
  17. jquery手机横屏竖屏判断显示
  18. 计算机声卡和显卡驱动,电脑系统会不会影响声卡和显卡程序
  19. java oracle spool,Oracle 数据导出工具 Spool | 学步园
  20. 用计算机数字技术制作的电影是,计算机数字技术为电影带来的空前发展.doc

热门文章

  1. Yale CAS单点(不强制)登录问题
  2. ubuntu 16.04安装显卡驱动超详细步骤
  3. Nginx配置+注释
  4. 腾讯云centos7.5安装ClamAV杀毒软件
  5. (一)软件过程(持续更新)
  6. 云之家宣布2017全年收款破亿 企业用户350万
  7. 美图即将上市,是时候重新评估其用户价值了
  8. Python学习-使用Python爬取陈奕迅新歌《我们》网易云热门评论
  9. 详解HTTP协议和HTTPS协议
  10. linux 信号优先级,linux内核中的信号机制