'Android printing images with a usb printer
I am trying to print images (jpeg, jpg, png...) using a USB printer.
Searching for examples and outputting text to a USB printer was successful.
But I want to print the image to a USB printer.
package com.android.usb_printer;
import androidx.appcompat.app.AppCompatActivity;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.hardware.usb.UsbConstants;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbDeviceConnection;
import android.hardware.usb.UsbEndpoint;
import android.hardware.usb.UsbInterface;
import android.hardware.usb.UsbManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
public class MainActivity extends AppCompatActivity {
private UsbManager mUsbManager;
private UsbDevice mDevice;
private UsbDeviceConnection mConnection;
private UsbInterface mInterface;
private UsbEndpoint mEndPoint;
private PendingIntent mPermissionIntent;
EditText ed_txt;
private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION";
private static Boolean forceCLaim = true;
HashMap<String, UsbDevice> mDeviceList;
Iterator<UsbDevice> mDeviceIterator;
byte[] testBytes;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ed_txt = (EditText) findViewById(R.id.ed_txt);
Button print = (Button) findViewById(R.id.print);
mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
mDeviceList = mUsbManager.getDeviceList();
if (mDeviceList.size() > 0) {
mDeviceIterator = mDeviceList.values().iterator();
Toast.makeText(this, "Device List Size: " + String.valueOf(mDeviceList.size()), Toast.LENGTH_SHORT).show();
TextView textView = (TextView) findViewById(R.id.usbDevice);
String usbDevice = "";
while (mDeviceIterator.hasNext()) {
UsbDevice usbDevice1 = mDeviceIterator.next();
usbDevice += "\n" +
"DeviceID: " + usbDevice1.getDeviceId() + "\n" +
"DeviceName: " + usbDevice1.getDeviceName() + "\n" +
"Protocol: " + usbDevice1.getDeviceProtocol() + "\n" +
"Product Name: " + usbDevice1.getProductName() + "\n" +
"Manufacturer Name: " + usbDevice1.getManufacturerName() + "\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;
Toast.makeText(this, "Device is attached", Toast.LENGTH_SHORT).show();
textView.setText(usbDevice);
}
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);
} else {
Toast.makeText(this, "USB를 연결해주세요.", Toast.LENGTH_SHORT).show();
}
print.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try {
print(mConnection, mInterface);
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
private void print(final UsbDeviceConnection connection, final UsbInterface usbInterface) throws IOException {
final String test = ed_txt.getText().toString();
// testBytes = "USB 프린트 테스트".getBytes(StandardCharsets.UTF_8);
InputStream inputStream = getAssets().open("score1.jpeg");
byte[] buffer = new byte[8192];
int bytesRead;
ByteArrayOutputStream output = new ByteArrayOutputStream();
while((bytesRead = inputStream.read(buffer)) != -1){
output.write(buffer, 0, bytesRead);
}
testBytes = output.toByteArray();
if (usbInterface == null) {
Toast.makeText(this, "INTERFACE IS NULL", Toast.LENGTH_SHORT).show();
} else if (connection == null) {
Toast.makeText(this, "CONNECTION IS NULL", Toast.LENGTH_SHORT).show();
} else if (forceCLaim == null) {
Toast.makeText(this, "FORCE CLAIM IS NULL", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "forceCLaim start", Toast.LENGTH_SHORT).show();
connection.claimInterface(usbInterface, forceCLaim);
Toast.makeText(this, "forceCLaim done", Toast.LENGTH_SHORT).show();
Toast.makeText(this, "bulkTransfer start", Toast.LENGTH_SHORT).show();
connection.bulkTransfer(mEndPoint, testBytes, testBytes.length, 10000);
Toast.makeText(this, "bulkTransfer done", Toast.LENGTH_SHORT).show();
}
}
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);// 0 IN and 1 OUT to printer.
mConnection = mUsbManager.openDevice(device);
}
} else {
Toast.makeText(context, "PERMISSION DENIED FOR THIS DEVICE", Toast.LENGTH_SHORT).show();
}
}
}
}
};
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!";
}
}
}
For testing, I want to save an image in the Assets folder and print the image to a USB printer.
Get the asset image.
InputStream inputStream = getAssets().open("score1.jpeg");
After reading and writing the image, it is saved as a byteArray.
byte[] buffer = new byte[8192];
int bytesRead;
ByteArrayOutputStream output = new ByteArrayOutputStream();
while((bytesRead = inputStream.read(buffer)) != -1){
output.write(buffer, 0, bytesRead);
}
Finally, connect to a USB printer and print.
connection.claimInterface(usbInterface, forceCLaim);
connection.bulkTransfer(mEndPoint, testBytes, testBytes.length, 10000);
However, the USB printer is found, but printing is not performed.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
