原文:http://blog.csdn.net/johnwcheung/article/details/71576833

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() {
@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打印机--没有设备驱动sdk,自己实现USB打印功能的更多相关文章

  1. 【Android开发】【第三方SDK】 安卓版分词功能

    功能介绍: 获取剪切板内容,进行分词: 点击分解后的词,填入输入框: 点击叉号将地址拼接起来返回主界面 用途: 增加用户的体验效果,可以直接在微信上复制地址,然后通过此功能确认地址. 附上git地址 ...

  2. Android系统移植与驱动开发

    21世纪,Android发展非常迅速,在市场上占有很大的比例,遥遥领先与iOS,很大程度上是因为任何人都可以利用Android的源代码定制完全属于自己的嵌入式开发系统,而不需要向Google交一分钱. ...

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

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

  4. Android 开发之 ---- 底层驱动开发(一)

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

  5. Linux USB驱动学习总结(二)---- USB设备驱动

    USB 设备驱动: 一.USB 描述符:(存在于USB 的E2PROM里面) 1.  设备描述符:struct usb_device_descriptor 2.  配置描述符:struct usb_c ...

  6. linux设备驱动概述,王明学learn

    linux设备驱动学习-1 本章节主要学习有操作系统的设备驱动和无操作系统设备驱动的区别,以及对操作系统和设备驱动关系的认识. 一.设备驱动的作用 对设备驱动最通俗的解释就是“驱使硬件设备行动” .设 ...

  7. Linux设备驱动框架设计

    引子 Linux操作系统的一大优势就是支持数以万计的芯片设备,大大小小的芯片厂商工程师都在积极地向Linux kernel提交设备驱动代码.能让这个目标得以实现,这背后隐藏着一个看不见的技术优势:Li ...

  8. 乾坤合一~Linux设备驱动之USB主机和设备驱动

    如果不能陪你到最后 是否后悔当初我们牵手 如果当初没能遇见你 现在的我 在哪里逗留 所有的爱都是冒险 那就心甘情愿 等待我们一生中 所有悬念 我一往情深的恋人 她是我的爱人 她给我的爱就像是 带着露水 ...

  9. 《网蜂A8实战演练》——8.Linux USB 主机控制器和设备驱动

    USB 的全称是 Universal Serial Bus,顾名思义:通用串行总线. 提到总线,联想一下,在你心目中总线总是用来干嘛的?还记得 I2C 总线? I2C 总线上挂有二条信号线,一条是 S ...

随机推荐

  1. springMVC参数绑定与数据回显

    简单例子:修改商品信息的jsp页面: 参数绑定过程: 1.2.1  默认支持的参数类型 处理器形参中添加如下类型的参数处理适配器会默认识别并进行赋值. 1.1.1     HttpServletReq ...

  2. c++构造是否要加大括号

    笔者被这个问题困扰良久,终于下决心看个究竟.废话不多说,先上结论: 如果对象是原生类型,加大括号会保证生成对象被初始化(一般是0) 如果对象非原生类型,加大括号或者不加,效果是一样的,都会执行该类的默 ...

  3. grafana模板

    1.安静了这么久,换了一家公司,还有过年,去了上海,去了苏州,去了杭州,认识了一个人,跟老司机他们一起学k8s,所以很累很累,这是监控,也是在老司机的帮助下熟悉使用,3q!

  4. [大数据可视化]-saiku的源码打包运行/二次开发构建

    Saiku构建好之后,会将项目的各个模块达成jar包,整个项目也会打成war包 saiku目录结构:   我们选中saiku-server/target/ 下面的zip压缩包.这是个打包后的文件,进行 ...

  5. (转)MySQL建表设置两个默认CURRENT_TIMESTAMP的技巧

    业务场景: 例如用户表,我们需要建一个字段是创建时间, 一个字段是更新时间. 解决办法可以是指定插入时间,也可以使用数据库的默认时间. 在mysql中如果设置两个默认CURRENT_TIMESTAMP ...

  6. MSBuild问题积累

    我想要当属性ConfigurationType定义为StaticLibrary时,将其重新定义为StaticLibrary,按照以下来做,实现不了. <ConfigurationType> ...

  7. 数学:FFT

    在信息学竞赛中FFT只有一个用处那就是加速多项式的乘法 多项式乘法原本的时间复杂度是O(n^2)的,然后经过FFT之后可以优化为O(nlogn) FFT就是将系数表示法转化成点值表示法相乘,再由点值表 ...

  8. 拖放API中的drag和drop实战

    原文地址:→传送门 写在前面 在HTML5之前,实现拖放功能需要借助mousedown/mousemove/mouseover/mouseout/mouseup等鼠标事件来完成,HTML5中拖放API ...

  9. Shell编程——shell常用命令

    浏览器标签页的切换:Ctrl+Tab [终端]打开终端快捷建:Ctrl+Alt+t关闭终端快捷键:Ctrl+Shift+q打开新的终端标签页快捷键:Ctrl+Shift+t 关闭终端标签页快捷键:Ct ...

  10. 从零搭建SSM框架(五)Maven实现Tomcat热部署

    配置tomcat 第一步:需要修改tomcat的conf/tomcat-users.xml配置文件.添加用户名.密码.权限. <role rolename="manager-gui&q ...