android - 如何从 android 检测 USB 打印机并进行打印

标签 android printing

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

Edited

我在检测打印机方面取得了一些进展。我能够检测到打印机。但我仍然无法通过批量传输进行打印。我还尝试使用 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

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

在此先感谢您的帮助。

最佳答案

要么使用:

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一个很好的例子。

关于android - 如何从 android 检测 USB 打印机并进行打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23903724/

相关文章:

google-chrome - 打印预览与 Chrome 中的打印模拟不同

c# 使用 iTextSharp 打印 PDF

审查 STDIN 中找到的单词并打印到 STDOUT 不起作用

c - 我的 C 程序在 Keccak 实现中打印 0xE 而不是 0x0E

android - <shape> 中只有顶角变圆

java - 无法导入 org.apache.commons.io.output.TeeOutputStream

android:如何在 Android Studio 中预览非默认 fragment xml

c# - 如何从打印机队列中检索作业列表或作业数量?

android - 如何用 fragment 进行内容过渡?

android - 如何使用 androids LayoutInflater.Factory 创建自定义 View 类而不是内置类?