我正在处理从我的应用程序向热敏打印机发送数据。我已经让它在网络上正常工作,我的数据打印正确。现在还有一个额外的要求,即我们还必须能够通过usb打印。
这是我尝试过的:
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;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
mDeviceList = mUsbManager.getDeviceList();
mDeviceIterator = mDeviceList.values().iterator();
Button print = (Button)findViewById(R.id.print);
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 view) {
//setup();
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);
//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 = "THIS IS A PRINT TEST";
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);
}
所以设备连接到usb设备,但是当我尝试批量传输没有任何反应时,是否有人可以解释这一点? Usb连接对我来说是一个新领域,所以任何提示都值得赞赏
修改
所以事实证明端点存在问题而且批量传输没有返回,但是,现在这些问题已经解决,并且它返回批量传输成功,但仍然无法打印。有没有人对此有任何想法?
答案 0 :(得分:0)
private void print(UsbDeviceConnection连接,UsbInterface intrface){
String test = "THIS IS A PRINT TEST";
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);
//Just Add
connection.close();
}
答案 1 :(得分:0)
@ DJ-DOO,我尝试过相同的方法,但我是这样做的:
而不是String test = "THIS IS A PRINT TEST";
使用此:String test = "THIS IS A PRINT TEST\r\n";
如需更多检查:What is the difference between \r and \n?
和您的上一个代码行&#34; connection.bulkTransfer(mEndPoint, testBytes, testBytes.length, 0);
&#34;应该在另一个主题中。
例如:
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
connection.bulkTransfer(mEndPoint, testBytes, testBytes.length, 0);
}
});
thread.run(); //or thread.start(); -as you wish
奖金: 用于剪纸用途:byte[] cut_paper = {0x1D, 0x56, 0x41, 0x10};
在此字节数组之前,我建议发送带有上述\n
的字符串。
在第一行之后将cut_paper字节数组放在同一行就足够了:
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
connection.bulkTransfer(mEndPoint, testBytes, testBytes.length, 0);
connection.bulkTransfer(mEndPoint, cut_paper, cut_paper.length, 0);
}
});
thread.run();
也是求助的来源:https://developer.android.com/guide/topics/connectivity/usb/host.html
希望有所帮助:)
答案 2 :(得分:0)
我更改了函数print(),并且可以正常工作。
这是我的代码
private void print(final UsbDeviceConnection connection, final UsbInterface usbInterface) {
final String test = ed_txt.getText().toString() + "\n\n";
testBytes = test.getBytes();
Log.e(TAG, "print Click........................ ");
if (usbInterface == null) {
Log.e(TAG, "INTERFACE IS NULL");
} else if (connection == null) {
Log.e(TAG, "CONNECTION IS NULL");
} else if (forceCLaim == null) {
Log.e(TAG, "FORCE CLAIM IS NULL");
} else {
Log.e(TAG, "Prepare print... ");
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
Log.e(TAG, "Printing.. ");
UsbInterface intf = mDevice.getInterface(0);
UsbEndpoint endpoint = intf.getEndpoint(0);
UsbDeviceConnection conn = mUsbManager.openDevice(mDevice);
conn.claimInterface(intf, true);
byte[] cut_paper = {0x1D, 0x56, 0x41, 0x10};
conn.bulkTransfer(endpoint, testBytes, testBytes.length, 0);
conn.bulkTransfer(endpoint, cut_paper, cut_paper.length, 0);
}
});
thread.run();
}
}