Android读取USB Descriptor获取manufacture和product信息

Android中通过UsbDevice.getDeviceName()返回类似/dev/usb/002/002,不能获取真正的设备名称,
只能通过读取Raw USB Descriptors获取manufacturer名称

private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION";
private PendingIntent mPermissionIntent;

protected static final int STD_USB_REQUEST_GET_DESCRIPTOR = 0x06;
protected static final int LIBUSB_DT_STRING = 0x03;

private String getUsbDetail(UsbDevice device) {
    String manufacturer = "", product = "", serial = "";

    UsbManager manager = (UsbManager) mContext.getSystemService(Context.USB_SERVICE);
    manager.requestPermission(device, mPermissionIntent);

    UsbDeviceConnection connection = manager.openDevice(device);
    byte[] rawDescs = connection.getRawDescriptors();
    try {
        byte[] buffer = new byte[255];
        int idxMan = rawDescs[14];
        int idxPrd = rawDescs[15];

        int rdo = connection.controlTransfer(UsbConstants.USB_DIR_IN | UsbConstants.USB_TYPE_STANDARD,
                STD_USB_REQUEST_GET_DESCRIPTOR, (LIBUSB_DT_STRING << 8) | idxMan, 0x0409, buffer, 0xFF, 0);
        manufacturer = new String(buffer, 2, rdo - 2, "UTF-16LE");

        rdo = connection.controlTransfer(UsbConstants.USB_DIR_IN | UsbConstants.USB_TYPE_STANDARD,
                STD_USB_REQUEST_GET_DESCRIPTOR, (LIBUSB_DT_STRING << 8) | idxPrd, 0x0409, buffer, 0xFF, 0);
        product = new String(buffer, 2, rdo - 2, "UTF-16LE");

        serial = connection.getSerial();
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }

    LogUtils.d("manufacturer:" + manufacturer);
    LogUtils.d("product:" + product);
    LogUtils.d("serial:" + serial);

    return manufacturer;
}

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
                   }
                } 
                else {
                    txtInfo.append("permission denied for device " + device);
                }
            }
        }
    }
};

参考:USB interface in android