Impresión Uso del problema con el cable USB

Estoy usando código siguiente para imprimir a través del dispositivo androide con el cable USB conectado a mi impresora Samsung.

Cuando uso el método startPrinting me da la siguiente verificación en el registro de depuración:

  1. Comando a la impresora enviada correctamente
  2. Permiso de la impresora concedida.

Y la impresora incluso empieza a sonar, pero los datos que proporciono no se imprimen. Estoy atascado en esta etapa y no he encontrado ninguna ayuda de google o stackoverflow tampoco.

Nota: No hay ningún fallo ni error

Estoy probando este código en Android Jelly bean 4.3 OS

Cualquier ayuda sería apreciada.

 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; int protocol; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE); mDeviceList = mUsbManager.getDeviceList(); mDeviceIterator = mDeviceList.values().iterator(); Button print = (Button) findViewById(R.id.buttonPrint); 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"; protocol = usbDevice1.getDeviceProtocol(); 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(); } print.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mPermissionIntent = PendingIntent.getBroadcast(MainActivity.this, 0, new Intent(ACTION_USB_PERMISSION), 0); IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION); registerReceiver(mUsbReceiver, filter); if (mDevice != null) mUsbManager.requestPermission(mDevice, mPermissionIntent); // else // Toast.makeText(this, "USB ", Toast.LENGTH_SHORT).show(); // 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); Log.i("Info", "Device permission granted"); startPrinting(device); // setup(); } } else { // Log.d("SUB", "permission denied for device " + device); Toast.makeText(context, "PERMISSION DENIED FOR THIS DEVICE", Toast.LENGTH_SHORT).show(); } } } } }; public void startPrinting(final UsbDevice printerDevice) { Handler handler = new Handler(); handler.post(new Runnable() { UsbDeviceConnection conn; UsbInterface usbInterface; @Override public void run() { try { Log.i("Info", "Bulk transfer started"); // usbInterface = printerDevice.getInterface(0); for (int i = 0; i < printerDevice.getInterfaceCount(); i++) { usbInterface = printerDevice.getInterface(i); if (usbInterface.getInterfaceClass() == UsbConstants.USB_CLASS_PRINTER) { // usbInterface = mDevice; } } UsbEndpoint endPoint = usbInterface.getEndpoint(0); conn = mUsbManager.openDevice(mDevice); conn.claimInterface(usbInterface, true); String myStringData = "TEXT"; myStringData += "\n"; byte[] array = myStringData.getBytes(); ByteBuffer output_buffer = ByteBuffer.allocate(array.length); UsbRequest request = new UsbRequest(); request.initialize(conn, endPoint); request.queue(output_buffer, array.length); if (conn.requestWait() == request) { Log.i("Info", output_buffer.getChar(0) + ""); Message m = new Message(); m.obj = output_buffer.array(); output_buffer.clear(); } else { Log.i("Info", "No request recieved"); } int transfered = conn.bulkTransfer(endPoint, myStringData.getBytes(), myStringData.getBytes().length, 5000); Log.i("Info", "Amount of data transferred : " + transfered); } catch (Exception e) { Log.e("Exception", "Unable to transfer bulk data"); e.printStackTrace(); } finally { try { conn.releaseInterface(usbInterface); Log.i("Info", "Interface released"); conn.close(); Log.i("Info", "Usb connection closed"); unregisterReceiver(mUsbReceiver); Log.i("Info", "Brodcast reciever unregistered"); } catch (Exception e) { Log.e("Exception", "Unable to release resources because : " + e.getMessage()); e.printStackTrace(); } } } }); } private void print(UsbDeviceConnection connection, UsbInterface intrface) { String test = "THIS IS A PRINT TEST"; // String text = "#move " + protocol + ";" + "#print" + test; // Log.e("text", text); 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); connection.close(); } 

He tenido este comportamiento exacto de otros sistemas operativos, cuando el fabricante de la impresora utiliza un protocolo propietario (y no revelado :-() a través del bus USB.Específicamente, la HP LaserJet P1060 series viene a la mente.Tanto con GNU / Linux y Mac OS-X, el sistema operativo descubre la impresora bastante bien, e intenta imprimir usando un controlador genérico (por ejemplo, HP Laserjet II) .El LED de la impresora comienza a parpadear – pero no sale nada.Eso sentía un poco como si algo faltaba para hacer La impresora realmente imprime la página.

En estos casos, se necesitaba descargar un bloqueo de firmware propietario para que las cosas funcionaran. Desafortunadamente, puede ser difícil encontrar un controlador de este tipo para Android para modelos de impresora para el hogar y la pequeña empresa. He tenido algo de suerte con Samsung Mobile Print Application ( http://www.samsung.com/us/mobile-print-app/ ) con impresoras láser en red departamental (ML 3471-ND y similares). Esto fue más de Wifi + Ethernet.

HTH.

De su descripción todo parece funcionar – transferencia de datos está sucediendo, no hay errores, pero la impresión no está produciendo nada. Posiblemente porque la impresora Samsung es una impresora de páginas y el código que tiene es bueno para la impresión en línea (impresoras Pos y Matriz de puntos). En tal caso, los datos residirán en el búfer de impresión esperando a que se complete la página. Trate de obligar a una página a completar mediante la emisión de un formfeed y comprobar.

  • Eclipse no crea actividad principal y diseño
  • "No hacer nada" con el operador ternario
  • Array detecta sólo una parte de una palabra de entrada en lugar de toda la palabra
  • Cómo insertar programaticamente entradas de registro de llamadas con nombre de presentación y foto?
  • No se puede ordenar la lista por orden ascendente
  • Android ImageView no está mostrando la imagen?
  • Error de JNI: desbordamiento de tabla de referencia local 512 entradas
  • Estado de comprobación de ListView Viewholder
  • Pruebe una referencia débil antes de usar java
  • Varias versiones de la misma biblioteca
  • ¿Cómo agrega encabezados HTTP personalizados a las pestañas personalizadas de Chrome?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.