android intent 打印,如何从android检测和打印USB打印机

我正在创建一个Android应用程序(最低API级别16),可以从我的Android设备打印文档,其中打印机通过USB连接。 我find了一个从这个链接中检测USB的代码。 我通过USB连接了打印机(HP Laserjet P1007)。 但它无法检测到打印机。

编辑

我在检测打印机方面取得了一些进展。 我能够检测到打印机。 但我仍然无法通过批量转移进行打印。 我也尝试使用usbRequest.queue方法进行异步传输

这是我的代码

public class MainActivity extends Activity { private final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION"; PendingIntent mPermissionIntent; UsbManager usbManager; UsbDevice device; UsbDevice printer = null; private static final int PRINTER_VENDOR_ID = 1008; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); try { setContentView(R.layout.activity_main); Log.i("Info", "Activity started"); usbManager = (UsbManager) getSystemService(Context.USB_SERVICE); HashMap deviceList = usbManager.getDeviceList(); if (deviceList.size() <= 0) { Log.i("Info", "No device found"); } else { Log.i("Info", "Number of device : " + deviceList.size()); ((TextView) findViewById(R.id.deviceCount)) .setText("No of device : " + deviceList.size()); } Iterator deviceIterator = deviceList.values().iterator(); int count = 0; mPermissionIntent = PendingIntent.getBroadcast(getBaseContext(), 0, new Intent(ACTION_USB_PERMISSION), 0); while (deviceIterator.hasNext()) { count++; device = deviceIterator.next(); Log.i("info", "Device No " + count + "........"); Log.i("info", "Vendor id : " + device.getVendorId()); Log.i("info", "Product id : " + device.getProductId()); Log.i("info", "Device name : " + device.getDeviceName()); Log.i("info", "Device class : " + device.getClass().getName()); Log.i("info", "Device protocol: " + device.getDeviceProtocol()); Log.i("info", "Device subclass : " + device.getDeviceSubclass()); if (device.getVendorId() == PRINTER_VENDOR_ID) { printer = device; break; } } findViewById(R.id.buttonPrint).setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { Log.i("Info", "Print command given"); IntentFilter filter = new IntentFilter( ACTION_USB_PERMISSION); registerReceiver(mUsbReceiver, filter); if (printer != null) { usbManager.requestPermission(printer, mPermissionIntent); } else { Log.e("Exception", "Printer not found"); } } }); } catch (Exception e) { Log.e("Exception", "Exception in onCreate " + e.getMessage()); e.printStackTrace(); } } private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { try { String action = intent.getAction(); if (ACTION_USB_PERMISSION.equals(action)) { synchronized (this) { final UsbDevice printerDevice = (UsbDevice) intent .getParcelableExtra(UsbManager.EXTRA_DEVICE); if (intent.getBooleanExtra( UsbManager.EXTRA_PERMISSION_GRANTED, false)) { if (printerDevice != null) { Log.i("Info", "Device permission granted"); startPrinting(printerDevice); } } else { Log.d("Debug", "permission denied for device " + printerDevice); } } } } catch (Exception e) { Log.e("Exception", "Exception in onRecieve " + e.getMessage()); e.printStackTrace(); } } }; public void startPrinting(final UsbDevice printerDevice) { new Handler().post(new Runnable() { UsbDeviceConnection conn; UsbInterface usbInterface; @Override public void run() { try { Log.i("Info", "Bulk transfer started"); usbInterface = printerDevice.getInterface(0); UsbEndpoint endPoint = usbInterface.getEndpoint(0); conn = usbManager.openDevice(printer); conn.claimInterface(usbInterface, true); String myStringData = "\nThis \nis \nmy \nsample \ntext"; 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(); // handler.sendMessage(m); 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(); } } } }); } }

这是我得到的日志

05-29 11:59:04.627: I/Info(5369): Print command given 05-29 11:59:04.657: I/Info(5369): Device permission granted 05-29 11:59:04.657: I/Info(5369): Bulk transfer started 05-29 11:59:04.657: D/UsbRequestJNI(5369): init 05-29 11:59:04.657: I/Info(5369): ?? 05-29 11:59:04.657: I/Info(5369): Interface released 05-29 11:59:04.657: D/UsbDeviceConnectionJNI(5369): close 05-29 11:59:04.657: I/Info(5369): Usb connection closed 05-29 11:59:04.657: I/Info(5369): Brodcast reciever unregistered

但在打印机方面,我没有得到任何回应……

在此先感谢您的帮助。

使用:

Intent i = new Intent(Intent.ACTION_VIEW); i.setPackage("com.dynamixsoftware.printershare.amazon"); Uri myUri = Uri.parse(new File("file:///mnt/sdcard/download/ww.pdf").toString()); i.setDataAndType(myUri, "application/pdf"); startActivity(i);

或https://github.com/pradeepksingh/Android-USB-printer

编辑:请参阅https://github.com/pradeepksingh/Android-USB-printer/blob/master/com/pradeep/adapter/USBAdapter.java#L72以获得一个很好的例子。

而不是usbInterface = printerDevice.getInterface(0);

循环可用接口并使用UsbConstants.USB_CLASS_PRINTER接口:

for(int i = 0; i < device.getInterfaceCount(); i++){ _interface = device.getInterface(i); if(_interface.getInterfaceClass() == UsbConstants.USB_CLASS_PRINTER){ printer = device; } }

重要的是你必须使用基于PDL的打印机而不是基于主机的打印机!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值