第一步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);