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:
- Descargar Android SDK de forma programática
- Cómo crear un archivo de encabezado C utilizando la herramienta Javah
- Android cómo hacer la diapositiva de pantalla de imagen?
- Android DevicePolicyManager lockNow ()
- Abrir URL en webView en android
- Comando a la impresora enviada correctamente
- 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(); }
- Evitar / prevenir que un fragmento se refresque al cambiar las pestañas
- Android: Bug con ThreadSafeClientConnManager descargar imágenes
- ¿Qué es eso "MainActivity.this no está encerrando clase" error en realidad?
- No se puede recuperar la clave
- Android sherlock setDisplayHomeAsUpEnabled no funciona y cómo establecer destino personalizado?
- Las filas visibles en recyclerview saltan un poco después de girar de retrato a paisaje
- Android: el teclado no aparece en la ventana flotante
- SQLiteConstraintException no detectado
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.