打印使用USB电缆问题

时间:2015-05-28 13:19:17

标签: java android printing

我正在使用以下代码通过安装在我的Samsung打印机上的USB线的Android设备进行打印。

使用startPrinting方法时,它会在调试日志中提供以下验证:

  1. 命令到打印机成功发送
  2. 授予打印机许可。
  3. 并且打印机甚至开始发出哔哔声,但我提供的数据无法打印。我陷入了这个阶段,并没有找到谷歌或stackoverflow的帮助。

    注意:没有崩溃也没有错误

    我正在Android Jelly bean 4.3 OS上测试此代码

    任何帮助都将不胜感激。

    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();
        }
    

2 个答案:

答案 0 :(得分:1)

当打印机制造商通过USB总线使用专有(并且未公开的:-()协议时,我从其他操作系统获得了这种确切的行为。具体来说,我想到的是HP Laserjet P1060系列。两者都是GNU / Linux和Mac OS-X,操作系统很好地发现打印机,并尝试使用通用驱动程序(例如HP Laserjet II)打印。打印机的LED开始闪烁 - 但没有任何结果。这感觉有点像一些命令是缺少让打印机实际打印页面。

在这些情况下,需要下载专有固件blob才能使其正常工作。不幸的是,对于家庭/小型企业打印机型号来说,可能很难找到适用于Android的驱动程序。我有三星移动打印应用程序(http://www.samsung.com/us/mobile-print-app/)与部分网络激光打印机(ML 3471-ND等)的运气。这是通过Wifi +以太网。

HTH。

答案 1 :(得分:0)

根据您的描述,一切似乎都有效 - 数据传输正在发生,没有错误,但打印不会产生任何结果。可能是因为三星打印机是一台页面打印机,你所拥有的代码适用于行式打印(Pos打印机和Dot Matrix)。在这种情况下,数据将驻留在打印缓冲区中,等待页面完成。尝试通过发出换页和检查来强制完成页面。