gpt4 book ai didi

android - 如何从 android 检测 USB 打印机并进行打印

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:40:45 25 4
gpt4 key购买 nike

我正在创建一个 android 应用程序(最低 API 级别 16),它可以从我的 android 设备打印文档,其中打印机通过 USB 连接。我从这个链接找到了检测 USB 的代码。我已经通过 USB 连接了我的打印机 (HP Laserjet P1007)。但是它无法检测到打印机。

Edited

我在检测打印机方面取得了一些进展。我能够检测到打印机。但我仍然无法通过批量传输进行打印。我还尝试使用 usbRequest.queue

方法进行异步传输

这是我的代码

public class MainActivity extends Activity {

private final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION";
PendingIntent mPermissionIntent;
UsbManager usbManager;
UsbDevice device;
UsbDevice printer = null;
private static final int PRINTER_VENDOR_ID = 1008;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {
setContentView(R.layout.activity_main);
Log.i("Info", "Activity started");
usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
HashMap<String, UsbDevice> deviceList = usbManager.getDeviceList();
if (deviceList.size() <= 0) {
Log.i("Info", "No device found");
} else {
Log.i("Info", "Number of device : " + deviceList.size());
((TextView) findViewById(R.id.deviceCount))
.setText("No of device : " + deviceList.size());
}
Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
int count = 0;
mPermissionIntent = PendingIntent.getBroadcast(getBaseContext(), 0,
new Intent(ACTION_USB_PERMISSION), 0);
while (deviceIterator.hasNext()) {
count++;
device = deviceIterator.next();
Log.i("info", "Device No " + count + "........");
Log.i("info", "Vendor id : " + device.getVendorId());
Log.i("info", "Product id : " + device.getProductId());
Log.i("info", "Device name : " + device.getDeviceName());
Log.i("info", "Device class : " + device.getClass().getName());
Log.i("info", "Device protocol: " + device.getDeviceProtocol());
Log.i("info", "Device subclass : " + device.getDeviceSubclass());
if (device.getVendorId() == PRINTER_VENDOR_ID) {
printer = device;
break;
}
}

findViewById(R.id.buttonPrint).setOnClickListener(
new OnClickListener() {
@Override
public void onClick(View v) {
Log.i("Info", "Print command given");
IntentFilter filter = new IntentFilter(
ACTION_USB_PERMISSION);
registerReceiver(mUsbReceiver, filter);
if (printer != null) {
usbManager.requestPermission(printer,
mPermissionIntent);
} else {
Log.e("Exception", "Printer not found");
}
}
});

} catch (Exception e) {
Log.e("Exception", "Exception in onCreate " + e.getMessage());
e.printStackTrace();
}

}

private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {

@Override
public void onReceive(Context context, Intent intent) {
try {
String action = intent.getAction();
if (ACTION_USB_PERMISSION.equals(action)) {
synchronized (this) {
final UsbDevice printerDevice = (UsbDevice) intent
.getParcelableExtra(UsbManager.EXTRA_DEVICE);
if (intent.getBooleanExtra(
UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
if (printerDevice != null) {
Log.i("Info", "Device permission granted");
startPrinting(printerDevice);
}
} else {
Log.d("Debug", "permission denied for device "
+ printerDevice);
}
}
}
} catch (Exception e) {
Log.e("Exception", "Exception in onRecieve " + e.getMessage());
e.printStackTrace();
}
}

};

public void startPrinting(final UsbDevice printerDevice) {
new Handler().post(new Runnable() {
UsbDeviceConnection conn;
UsbInterface usbInterface;

@Override
public void run() {
try {
Log.i("Info", "Bulk transfer started");
usbInterface = printerDevice.getInterface(0);
UsbEndpoint endPoint = usbInterface.getEndpoint(0);
conn = usbManager.openDevice(printer);
conn.claimInterface(usbInterface, true);
String myStringData = "\nThis \nis \nmy \nsample \ntext";
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();
// handler.sendMessage(m);
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();
}
}

}
});
}

}

这是我得到的日志

05-29 11:59:04.627: I/Info(5369): Print command given
05-29 11:59:04.657: I/Info(5369): Device permission granted
05-29 11:59:04.657: I/Info(5369): Bulk transfer started
05-29 11:59:04.657: D/UsbRequestJNI(5369): init
05-29 11:59:04.657: I/Info(5369): ??
05-29 11:59:04.657: I/Info(5369): Interface released
05-29 11:59:04.657: D/UsbDeviceConnectionJNI(5369): close
05-29 11:59:04.657: I/Info(5369): Usb connection closed
05-29 11:59:04.657: I/Info(5369): Brodcast reciever unregistered

但是在打印机端我没有得到任何响应...

在此先感谢您的帮助。

最佳答案

要么使用:

Intent i = new Intent(Intent.ACTION_VIEW);
i.setPackage("com.dynamixsoftware.printershare.amazon");
Uri myUri = Uri.parse(new File("file:///mnt/sdcard/download/ww.pdf").toString());
i.setDataAndType(myUri, "application/pdf");
startActivity(i);

https://github.com/pradeepksingh/Android-USB-printer

编辑:参见 https://github.com/pradeepksingh/Android-USB-printer/blob/master/com/pradeep/adapter/USBAdapter.java#L72一个很好的例子。

关于android - 如何从 android 检测 USB 打印机并进行打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23903724/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com