Android Как напечатать 1d штрих-код на термопринтере USB

Эй, я новичок в разработке Android и получил некоторые знания для начинающих в Android, сейчас я делаю приложение, которое подключается к термопринтеру через USB. На самом деле я печатаю текстовый файл с некоторыми ссылками в переполнении стека, но мне нужно распечатать штрих-код с уважением на вход. Я пытаюсь напечатать 1D штрих-код, но у меня ничего не получается. Кто-нибудь дать некоторые предложения или решения для моей проблемы.

  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.print);
    final Button printBarcode = findViewById(R.id.barcode);

    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";

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

    mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);
    IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
    registerReceiver(mUsbReceiver, filter);
    mUsbManager.requestPermission(mDevice, mPermissionIntent);

    print.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            print(mConnection, mInterface);
                        }
    });

    printBarcode.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
                  printBarcode(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
    final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
@Override
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);

                    //setup();
                }
            } else {
                //Log.d("SUB", "permission denied for device " + device);
                Toast.makeText(context, "PERMISSION DENIED FOR THIS DEVICE", Toast.LENGTH_SHORT).show();
            }
        }
    }
}
};

распечатать текстовый файл

  private void print(UsbDeviceConnection connection, UsbInterface intrface) {

    String test = "Together Forever";

    byte[] testBytes = test.getBytes(Charset.forName("UTF-8"));


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

Распечатать штрих-код

    private  void printBarcode(UsbDeviceConnection connection, UsbInterface intrface){
    String content  = "115";

    //1D barcode format (hex): 1d 6b 02 0d + barcode data

    byte[] formats  = {(byte) 0x1d, (byte) 0x6b, (byte) 0x02, (byte) 0x0d};
    byte[] contents = content.getBytes();

    byte[] bytes    = new byte[formats.length + contents.length];

    System.arraycopy(formats, 0, bytes, 0, formats.length);
    System.arraycopy(contents, 0, bytes, formats.length, contents.length);
    connection.claimInterface(intrface, forceCLaim);
    connection.bulkTransfer(mEndPoint, bytes, bytes.length, 0);   

ищу много решений в google, но я не получаю подходящего решения.


person Karthi K    schedule 31.10.2017    source источник
comment
Также, пожалуйста, укажите вывод, который вы получите при попытке решения, а также сообщение об ошибке, которое вы получите.   -  person Syed Ekram Uddin    schedule 31.10.2017
comment
на самом деле я не могу проверить сообщение об ошибке в студии Android. Но во время печати, если я нажму кнопку PRINT BARCODE, ничего не произойдет.   -  person Karthi K    schedule 31.10.2017
comment
@Syed Ekramuddin Emon я не получаю никаких ошибок, печать не происходит, когда я пытаюсь напечатать штрих-код   -  person Karthi K    schedule 31.10.2017


Ответы (1)


Я уже реализовал это и работал, но, возможно, использовал другой принтер, который вы использовали

проверьте этот ответ для ссылок https://stackoverflow.com/a/35243569/4168314

здесь измененный код, чтобы соответствовать вашему коду:

private void printBarcode(UsbDeviceConnection connection, UsbInterface intrface) {

    String content  = "115";

    byte[] contents = content.getBytes();
    byte[] formats  = {(byte) 0x1d, (byte) 0x6b, (byte) 0x49, (byte)contents.length};

    byte[] bytes    = new byte[formats.length + contents.length];

    System.arraycopy(formats, 0, bytes, 0, formats.length );
    System.arraycopy(contents, 0, bytes, formats.length, contents.length);

    connection.claimInterface(intrface, forceCLaim);
    connection.bulkTransfer(mEndPoint, bytes, bytes.length, 0);               
}
person Mochamad Taufik Hidayat    schedule 05.04.2018