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 🙂

  • Anclaje inverso de varios dispositivos Android a través de USB
  • Tarjeta SD no disponible mientras está en modo de depuración USB en DroidX
  • Detectar conexión USB en android
  • Lectura de datos de ratón sin procesar en android
  • Android USB API: cambia entre carga y envío de datos
  • No puedo conectar mi Nexus5 a OSx Yosemite
  • Mi Macbook Pro no detectará mi samsung galaxy s6
  • Modo host Android y modo accesorio
  • Envía datos a través de USB desde la aplicación de Android a la PC
  • ¿Cómo puedo desactivar la depuración de Android USB mediante programación
  • Android Studio no detecta dispositivo Android en Windows 10
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.