Android 小票打印USB
第一步USB通信:
Usb设备有两种,Host与Accessory 简单来说是主模式与从模式,主模式则android设备给外设供电,反之,外设给android设备充电,对于小票打印,使用的是Host模式
用到以下几个类:
1.UsbManager: 这个类用来获取USB设备-UsbDevice
UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE); // 获取设备 HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
UsbInterface & UsbEndpoint : 代表UsbDevice有哪些功能
UsbInterface intf = device.getInterface(0); // 官方文档上边是这样写的,直接获取第一个,但往往不一定只连接一个设备,就要求我们找到自己想要的那个,一般的做法是 int count = device.getInterfaceCount(); for (int i = 0;i < count; i++) { UsbInterface intf = device.getInterface(i); // 之后我们会根据 intf的 getInterfaceClass 判断是哪种类型的Usb设备, // 并且结合 device.getVectorID() 或者厂家ID进行过滤,比如 UsbConstants.USB_CLASS_PRINTER if (device.getVectorID() == '打印机的生产商ID' && intf.getInterfaceClass() == UsbConstants.USB_CLASS_PRINTER) { // 这个device就是你要找的UsbDevice,此时还需要进行权限判断 if (usbManager.hasPermission(device) == false) { // 没有权限 PendingIntent permissionIntent = PendingIntent.getBroadcast(this, 0, new Intent("com.android.example.USB_PERMISSION"), 0); IntentFilter filter = new IntentFilter("com.android.example.USB_PERMISSION"); registerReceiver(mUsbReceiver, filter); return; } } }
建立连接:
UsbDeviceConnection connection = mUsbManager.openDevice(device);
connection.claimInterface(intf, forceClaim);
开始写数据:
//do in another thread connection.bulkTransfer(outEndpoint, bytes, bytes.length, TIMEOUT);
开始读数据:
//do in another thread connection.bulkTransfer(inEndpoint, bytes, bytes.length, TIMEOUT);
初始化打印机:
byte[] bytes = new bytes[]{(byte) 27, (byte) 64}; connection.bulkTransfer(outEndpoint, bytes, bytes.length, TIMEOUT);
输出要打印的格式:
byte[] bytes = "你要打印的文字".getBytes("gbk"); connection.bulkTransfer(outEndpoint, bytes, bytes.length, TIMEOUT);
输出换行:
byte[] bytes = new bytes[]{(byte) 10}; connection.bulkTransfer(outEndpoint, bytes, bytes.length, TIMEOUT);