Envío de datos a la impresora térmica desde el dispositivo Android a través de USB

Estoy trabajando con el envío de datos a una impresora térmica de mi aplicación. Ya lo tengo funcionando correctamente a través de la red y mis datos se imprimen correctamente. Ahora hay un requisito adicional por el que también tenemos que ser capaces de imprimir a través de usb.

Esto es lo que he probado:

private UsbManager mUsbManager; private UsbDevice mDevice; private UsbDeviceConnection mConnection; private UsbInterface mInterface; private UsbEndpoint mEndPoint; private PendingIntent mPermissionIntent; private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION"; private static Boolean forceCLaim = true; HashMap<String, UsbDevice> mDeviceList; Iterator<UsbDevice> mDeviceIterator; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE); mDeviceList = mUsbManager.getDeviceList(); mDeviceIterator = mDeviceList.values().iterator(); Button print = (Button)findViewById(R.id.print); Toast.makeText(this, "Device List Size: " + String.valueOf(mDeviceList.size()), Toast.LENGTH_SHORT).show(); TextView textView = (TextView) findViewById(R.id.usbDevice); String usbDevice = ""; //This is just testing what devices are connected while (mDeviceIterator.hasNext()) { UsbDevice usbDevice1 = mDeviceIterator.next(); usbDevice += "\n" + "DeviceID: " + usbDevice1.getDeviceId() + "\n" + "DeviceName: " + usbDevice1.getDeviceName() + "\n" + "DeviceClass: " + usbDevice1.getDeviceClass() + " - " + translateDeviceClass(usbDevice1.getDeviceClass()) + "\n" + "DeviceSubClass: " + usbDevice1.getDeviceSubclass() + "\n" + "VendorID: " + usbDevice1.getVendorId() + "\n" + "ProductID: " + usbDevice1.getProductId() + "\n"; int interfaceCount = usbDevice1.getInterfaceCount(); Toast.makeText(this, "INTERFACE COUNT: " + String.valueOf(interfaceCount), Toast.LENGTH_SHORT).show(); mDevice = usbDevice1; if (mDevice == null) { Toast.makeText(this, "mDevice is null", Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(this, "mDevice is not null", Toast.LENGTH_SHORT).show(); } textView.setText(usbDevice); } if (mDevice == null) { Toast.makeText(this, "mDevice is null", Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(this, "mDevice is not null", Toast.LENGTH_SHORT).show(); } mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0); IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION); registerReceiver(mUsbReceiver, filter); mUsbManager.requestPermission(mDevice, mPermissionIntent); print.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //setup(); print(mConnection, mInterface); } }); } private String translateDeviceClass(int deviceClass){ switch(deviceClass){ case UsbConstants.USB_CLASS_APP_SPEC: return "Application specific USB class"; case UsbConstants.USB_CLASS_AUDIO: return "USB class for audio devices"; case UsbConstants.USB_CLASS_CDC_DATA: return "USB class for CDC devices (communications device class)"; case UsbConstants.USB_CLASS_COMM: return "USB class for communication devices"; case UsbConstants.USB_CLASS_CONTENT_SEC: return "USB class for content security devices"; case UsbConstants.USB_CLASS_CSCID: return "USB class for content smart card devices"; case UsbConstants.USB_CLASS_HID: return "USB class for human interface devices (for example, mice and keyboards)"; case UsbConstants.USB_CLASS_HUB: return "USB class for USB hubs"; case UsbConstants.USB_CLASS_MASS_STORAGE: return "USB class for mass storage devices"; case UsbConstants.USB_CLASS_MISC: return "USB class for wireless miscellaneous devices"; case UsbConstants.USB_CLASS_PER_INTERFACE: return "USB class indicating that the class is determined on a per-interface basis"; case UsbConstants.USB_CLASS_PHYSICA: return "USB class for physical devices"; case UsbConstants.USB_CLASS_PRINTER: return "USB class for printers"; case UsbConstants.USB_CLASS_STILL_IMAGE: return "USB class for still image devices (digital cameras)"; case UsbConstants.USB_CLASS_VENDOR_SPEC: return "Vendor specific USB class"; case UsbConstants.USB_CLASS_VIDEO: return "USB class for video devices"; case UsbConstants.USB_CLASS_WIRELESS_CONTROLLER: return "USB class for wireless controller devices"; default: return "Unknown USB class!"; } //Broadcast receiver to obtain permission from user for connection private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (ACTION_USB_PERMISSION.equals(action)) { synchronized (this) { UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) { if(device != null){ //call method to set up device communication mInterface = device.getInterface(0); mEndPoint = mInterface.getEndpoint(0); mConnection = mUsbManager.openDevice(device); //setup(); } } else { //Log.d("SUB", "permission denied for device " + device); Toast.makeText(context, "PERMISSION DENIED FOR THIS DEVICE", Toast.LENGTH_SHORT).show(); } } } } }; private void print(UsbDeviceConnection connection, UsbInterface intrface){ String test = "THIS IS A PRINT TEST"; byte [] testBytes = test.getBytes(); if(intrface==null){ Toast.makeText(this, "INTERFACE IS NULL", Toast.LENGTH_SHORT).show(); } if(connection==null){ Toast.makeText(this, "CONNECTION IS NULL", Toast.LENGTH_SHORT).show(); } if(forceCLaim==null){ Toast.makeText(this, "FORCE CLAIM IS NULL", Toast.LENGTH_SHORT).show(); } connection.claimInterface(intrface, forceCLaim); connection.bulkTransfer(mEndPoint, testBytes, testBytes.length, 0); } 

Así que el dispositivo se conecta al dispositivo usb, pero cuando intento el bulktransfer no pasa nada, ¿podría alguien arrojar luz sobre esto? La conectividad del Usb es una nueva área para mí así que cualquier extremidad es apreciada

EDITAR

Por lo que resulta que había problemas con puntos finales y no hay devoluciones de bulktransfer, sin embargo, ahora esos problemas se resuelven y devuelve que la transferencia masiva tiene éxito, sin embargo, todavía no se imprime. ¿Alguien tiene alguna idea sobre esto, por favor?

private void print (conexión UsbDeviceConnection, interfaz de UsbInterface) {

  String test = "THIS IS A PRINT TEST"; byte [] testBytes = test.getBytes(); if(intrface==null){ Toast.makeText(this, "INTERFACE IS NULL", Toast.LENGTH_SHORT).show(); } if(connection==null){ Toast.makeText(this, "CONNECTION IS NULL", Toast.LENGTH_SHORT).show(); } if(forceCLaim==null){ Toast.makeText(this, "FORCE CLAIM IS NULL", Toast.LENGTH_SHORT).show(); } connection.claimInterface(intrface, forceCLaim); connection.bulkTransfer(mEndPoint, testBytes, testBytes.length, 0); //Just Add connection.close(); } 

@ DJ-DOO, he intentado el mismo enfoque, pero lo hice de esta manera:

en lugar de String test = "THIS IS A PRINT TEST";

utilice esto: String test = "THIS IS A PRINT TEST\r\n";

Para más verificación: ¿Cuál es la diferencia entre \ ry \ n?

y su última línea de código " connection.bulkTransfer(mEndPoint, testBytes, testBytes.length, 0); " debería estar en otro subproceso.

Por ejemplo:

 Thread thread = new Thread(new Runnable() { @Override public void run() { connection.bulkTransfer(mEndPoint, testBytes, testBytes.length, 0); } }); thread.run(); //or thread.start(); -as you wish 

Bono: para el corte de papel uso: byte[] cut_paper = {0x1D, 0x56, 0x41, 0x10}; Antes de esta matriz de bytes, recomiendo enviar una cadena con \n mencionada anteriormente. Basta con poner la misma línea con la matriz de byte de cut_paper después de la primera:

 Thread thread = new Thread(new Runnable() { @Override public void run() { connection.bulkTransfer(mEndPoint, testBytes, testBytes.length, 0); connection.bulkTransfer(mEndPoint, cut_paper, cut_paper.length, 0); } }); thread.run(); 

También fuente de ayuda: https://developer.android.com/guide/topics/connectivity/usb/host.html

Espero eso ayude 🙂

  • ¿Qué sucede después de que DTR / RTS sea enviado a una placa Arduino basada en FTDI?
  • Leer la entrada de energía de usb
  • Modo de Android Host Depuración USB
  • ¿Cómo montar la trayectoria del USB en androide?
  • No se puede configurar los controladores de usb para depurar en Galaxy Nexus
  • ¿Es posible identificar el modo de comunicación USB mediante programación?
  • Enumeración usb Android
  • Android USB API: cambia entre carga y envío de datos
  • Android Studio no reconocerá Nexus 7 como dispositivo
  • Reproducir vídeo utilizando USB conectado a través de cable OTG en Android?
  • Utilizar la cámara conectada a través de USB en lugar de la cámara incorporada
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.