如何在安卓系统中检测并打印来自USB打印机的文件

11

我正在创建一个Android应用程序(API级别最低为16),可以从连接到USB的打印机中打印文档。我在此链接中找到了一个检测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<String, UsbDevice> 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<UsbDevice> 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

但是在打印机方面我没有得到任何响应...

先行感谢您的帮助。


是的,它支持OTG。我使用PrinterShare应用程序进行了测试,并成功打印了测试页面。 - Bhupesh
1
你解决了这个问题吗? - Mohamed Hussien
@Bhupesh,你解决了这个问题吗?我也在寻找类似的答案。 - Nandakishore Shetty
抱歉,伙计...还没有得到答案。 - Bhupesh
好的,谢谢@Bhupesh... 如果您找到答案,请告诉我。 - Nandakishore Shetty
显示剩余3条评论
2个回答

2

1
尽管您没有正确回答OP的问题,但上面的链接提供了一个很好的示例代码,展示如何打印到USB: https://github.com/pradeepksingh/Android-USB-printer/blob/master/com/pradeep/adapter/USBAdapter.java#L72 关键是要使用正确的端点和接口。 - micwallace
@micwallace 在这个例子中出现了错误:system.err: java.lang.NullPointerException: 尝试在空对象引用上调用虚拟方法'java.lang.String android.hardware.usb.UsbDevice.getDeviceName()' - kartheeki j
在我调用BulkTransfer HP打印机后,它开始闪烁,但没有任何打印输出。型号为LaserJet Pro M102a。请帮忙解决。 - Nicks

1

不要使用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 的打印机,而不是基于主机的打印机!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接