USBDeviceConnection.bulkTransfer не может отправить буфер данных на принтер, возвращает -1? - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть приложение Android, которое отправляет данные с устройства Android, выступающего в качестве хоста для модели принтера Zebra GK420t, на принтер Zebra, есть щелчок btnPrint с событием, которое вызывает метод connectToPrinter () с следующий код:

UsbManager manager;
private void connectToPrinter(PendingIntent mPendingIntent) {
try {
    manager = (UsbManager) mContext.getSystemService(Context.USB_SERVICE);
    HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
    UsbDevice device = null;
    for (String s : deviceList.keySet()) {
        device = deviceList.get(s);
        if (UsbDiscoverer.isZebraUsbDevice(device)) {
            break;
        }
    }
    if (manager != null && device != null) {
        manager.requestPermission(device, mPendingIntent);
    }
} catch (Exception ex) {
    Toast.makeText(mContext, "From connectToPrinterAndPrint: " + ex.getMessage(), Toast.LENGTH_LONG).show();
    ex.printStackTrace();
}

}

Intent mPendingIntent - это BroadCastReceiver, который включает мой следующий код:

private static final String ACTION_USB_PERMISSION =
    "com.android.example.USB_PERMISSION";
private final BroadcastReceiver usbReceiver = new BroadcastReceiver() {

public void onReceive(Context context, Intent intent) {
    try {
        String action = intent.getAction();
        if (ACTION_USB_PERMISSION.equals(action)) {
            synchronized (this) {
                final UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);

                if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                    if (device != null) {
                        final UsbInterface intf = device.getInterface(0);
                        //final UsbEndpoint endpoint = intf.getEndpoint(0);
                        UsbEndpoint _endpoint = null;
                        for(int i = 0; i <= intf.getEndpointCount()  -1; i ++){
                            if(intf.getEndpoint(i).getType() == UsbConstants.USB_ENDPOINT_XFER_BULK && intf.getEndpoint(i).getDirection() == UsbConstants.USB_DIR_OUT /*Indicates DataFlow From Host to Device*/ ){
                                _endpoint = intf.getEndpoint(i);
                                break;
                            }
                        }
                        final UsbEndpoint endpoint = _endpoint;
                        final UsbDeviceConnection connection = manager.openDevice(device);
                        if(connection.claimInterface(intf, forceClaim)){
                            //Toast.makeText(mContext, "claimInterface: Successful", Toast.LENGTH_LONG).show();
                        }
                        else {
                            //Toast.makeText(mContext, "claimInterface: Not Successful", Toast.LENGTH_LONG).show();
                        }
                        new Thread(new Runnable() {
                            public void run() {
                                Looper.prepare();
                                String printString = "^XA\n^FO20,10^A0,N,20,16^FDTest^FS\n^XZ";

                          /* PROBLEM HERE */      int val = connection.bulkTransfer(endpoint, printString.getBytes(), printString.getBytes().length, TIMEOUT);
                                Toast.makeText(mContext, "bulkTransfer returned: " + Integer.toString(val), Toast.LENGTH_LONG).show();
                                Looper.loop();
                                Looper.myLooper().quit();
                            }
                        }).start();
                        connection.close();
                    }
                } else {
                    Log.d("SSTag", "permission denied for device " + device);
                }
            }
        }
    } catch (Exception ex) {
        Toast.makeText(mContext, "From onReceive: " + ex.getMessage, Toast.LENGTH_LONG).show();
    }
}
};

Но проблема в том, что строка, которая показывает Тост с текстом «вернул массовый перенос:» всегда печатает -1, что свидетельствует о сбое в массовом переносе, и принтер ничего не печатает,

Как получить массовый перенос для передачи буфера данных на принтер, чтобы принтер Zebra печатал предполагаемые данные,

Пожалуйста, сообщите, спасибо заранее,

...