Android打印机--没有设备驱动sdk,自己实现USB打印功能
2017-05-10 19:44
417 查看
Android下的设备调试,如果设备提供了驱动,按照厂家的驱动调试即可;设备未提供驱动,只能按照通用的方法进行调试。
对于智能POS、收银机以及其他打印设备,如果厂商不提供打印相关sdk,那么打印功能怎么实现呢?其实我们可以基于USB通信机制,自己去实现打印驱动。
实现这个广播接收器:当接收到请求权限的广播时,获取USB设备的引用,android系统会询问你是否允许设备访问,默认为false;当允许了访问之后,会判断USB的引用是否为null, 如果不为空,说明该设备可以连接,否则提示设备拒绝访问;如果接收到已连接的打印设备移除的广播,则要关闭本次连接。
对于获得权限可使用的USB,我们将获取设备的功能集(UsbInterface)和通信通道(UsbEndpoint),然后创建host与device的连接用来传输数据。
最后,我们在需要打印的地方调用上面封装好的打印方法,就可以发送指令来控制已经建立连接的打印机了。
对于智能POS、收银机以及其他打印设备,如果厂商不提供打印相关sdk,那么打印功能怎么实现呢?其实我们可以基于USB通信机制,自己去实现打印驱动。
整个实现流程如下
初始化打印机:首先要获取USB管理器;其次要注册监听USB设备插拔变化和请求权限的广播;最后列出所有的USB设备,并且都请求获取USB权限;实现这个广播接收器:当接收到请求权限的广播时,获取USB设备的引用,android系统会询问你是否允许设备访问,默认为false;当允许了访问之后,会判断USB的引用是否为null, 如果不为空,说明该设备可以连接,否则提示设备拒绝访问;如果接收到已连接的打印设备移除的广播,则要关闭本次连接。
对于获得权限可使用的USB,我们将获取设备的功能集(UsbInterface)和通信通道(UsbEndpoint),然后创建host与device的连接用来传输数据。
最后,我们在需要打印的地方调用上面封装好的打印方法,就可以发送指令来控制已经建立连接的打印机了。
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() { @Override public 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系统利用uinput设备驱动实现虚拟输入设备
- Android系统利用uinput设备驱动实现虚拟输入设备
- 解读Android LOG机制的实现:(4)LOG设备驱动Logger
- 最近根据别人提示的一个想法,东拼西凑,终于实现了android系统中只能看到自己的系统,我称之为唯一系统。 很多企业做设备或是做产品的或是集成商 其中的一部分设备直接用android智能机。担是又不让
- i2c 驱动三:自己实现设备和驱动分离
- Android USB Gadget复合设备驱动(打印机)测试方法
- 利用Foxit SDK快速实现自己的Mobile PDF阅读器-Android篇
- 管理一个项目团队的问题就是要实现以十当一,而不是以一当十!世界上没有任何两个人是完全相同的,任何人管理自己的方式也没有完全一样的。因而以一当十的英雄式的工作方式不难实现,难的是把这些能以一当十的英雄聚到一起,变成以十当一的团队工作方式
- WinCE流设备驱动简介及GPIO驱动的实现
- 转载——WinCE流设备驱动简介及GPIO驱动的实现(驱动最佳入门文章)
- Window CE 打印机驱动实现
- 基于ARM9开发板的按键字符设备驱动实现(全集)
- WinCE流设备驱动简介及GPIO驱动的实现
- 自己动手编写,编译,测试,安装Solaris设备驱动
- 设备驱动中环形缓冲区数据存储和读写同步的实现[转自:http://hi.baidu.com/whandsome/blog/item/3834e32a9994692cd52af1f9.html]
- 程序实现启用/禁用设备(驱动)enable/disable device with windows api
- 经验之谈:驱动更新最新,在控制面板显示没有音频设备,电脑没声音的解决方法
- 用拖拉实现设备驱动配置(EsayHMI最新驱动配置方式)
- 没有活动混音器可用。要安装活动混音器设备,请转到“控制面板”,单击“打印机和其他硬件”
- 内核启动时,设备及驱动初始化的实现