/**
|
* 初始化参数
|
*/
|
//#ifdef APP-PLUS
|
let UsbManager = plus.android.importClass("android.hardware.usb.UsbManager");
|
let IntentFilter = plus.android.importClass("android.content.IntentFilter");
|
let PendingIntent = plus.android.importClass("android.app.PendingIntent");
|
let UsbConstants = plus.android.importClass("android.hardware.usb.UsbConstants");
|
let UsbInterface = plus.android.importClass("android.hardware.usb.UsbInterface");
|
let Intent = plus.android.importClass("android.content.Intent");
|
let Context = plus.android.importClass("android.content.Context");
|
let HashMap = plus.android.importClass("java.util.HashMap");
|
let Toast = plus.android.importClass("android.widget.Toast");
|
|
let invoke = plus.android.invoke;
|
let activity = plus.android.runtimeMainActivity();
|
const VIDQR = 0x09C5;
|
const VIDMY = 0x09C6;
|
const VIDIP = 0x353D;
|
const deviceList = []
|
let mPermissionIntent = null
|
let mUsbManager = null
|
let currentDevice = null
|
let mUsbDeviceConnection = null
|
let mUsbInterface = null
|
let mUsbEndpointIn = null
|
let mUsbEndpointOut = null
|
let usbStatusReceiver = null; //usb状态监听广播
|
let isOpen = false;
|
//#endif
|
/**
|
* 构造对象
|
*/
|
var usbTool = {
|
state: {
|
USBState: "",
|
readThreadState: false, //数据读取线程状态
|
},
|
options: {
|
/**
|
* 监听USB状态回调
|
* @param {String} state
|
*/
|
listenUSBStatusCallback: function(state) {},
|
/**
|
* 接收到数据回调
|
* @param {Array} dataByteArr
|
*/
|
readDataCallback: function(dataByteArr) {},
|
},
|
init(setOptions) {
|
Object.assign(this.options, setOptions);
|
this.listenUsbStatus();
|
mUsbManager = activity.getSystemService(Context.USB_SERVICE)
|
mPermissionIntent = PendingIntent.getBroadcast(activity, 0, new Intent(
|
'com.application.usbhost.USB_PERMISSION'), PendingIntent
|
.FLAG_IMMUTABLE);
|
},
|
shortToast(msg) {
|
Toast.makeText(activity, msg, Toast.LENGTH_SHORT).show();
|
},
|
// 打开设备
|
async openUsb() {
|
let mDevices = new HashMap();
|
mDevices = mUsbManager.getDeviceList();
|
if (mDevices === null) return false;
|
const devicesSize = invoke(mDevices, "size"); //获取几个长度
|
if (devicesSize === 0) return false;
|
const values = invoke(mDevices, "values")
|
const iterator = invoke(values, "iterator");
|
while (invoke(iterator, "hasNext")) {
|
const device = invoke(iterator, "next");
|
const vendorId = invoke(device, "getVendorId"); // 获取vendorId
|
if ((vendorId == VIDQR) || (vendorId == VIDMY) || (vendorId == VIDIP)) {
|
currentDevice = device;
|
if (!mUsbManager.hasPermission(currentDevice)) {
|
// 获取权限弹框
|
mUsbManager.requestPermission(currentDevice, mPermissionIntent)
|
for (let i = 10; i > 0; i--) {
|
await this.delay(1000);
|
if (i == 1 && !mUsbManager.hasPermission(currentDevice)) {
|
return false;
|
}
|
if (mUsbManager.hasPermission(currentDevice)) {
|
break;
|
}
|
}
|
}
|
if (this.initCommunication(currentDevice, UsbConstants.USB_CLASS_PRINTER)) {
|
return true;
|
}
|
}
|
}
|
return false;
|
},
|
delay(ms) {
|
return new Promise(resolve => setTimeout(resolve, ms));
|
},
|
initCommunication(device, type) {
|
const interfaceCount = invoke(device, "getInterfaceCount"); //获取接口数量
|
for (let interfaceIndex = 0; interfaceIndex < interfaceCount; interfaceIndex++) {
|
const usbInterface = invoke(device, "getInterface", interfaceIndex); // 遍历获取接口
|
const interfaceClass = invoke(usbInterface, "getInterfaceClass");
|
if (type != interfaceClass) {
|
continue;
|
}
|
mUsbInterface = usbInterface;
|
for (let i = 0; i < invoke(usbInterface, "getEndpointCount"); i++) {
|
const ep = invoke(usbInterface, "getEndpoint", i);
|
if (invoke(ep, "getType") == UsbConstants.USB_ENDPOINT_XFER_BULK) {
|
if (invoke(ep, "getDirection") == UsbConstants.USB_DIR_OUT) {
|
mUsbEndpointOut = ep;
|
} else if (invoke(ep, "getDirection") == UsbConstants.USB_DIR_IN) {
|
mUsbEndpointIn = ep;
|
}
|
}
|
}
|
if ((null == mUsbEndpointIn) || (null == mUsbEndpointOut)) {
|
mUsbEndpointIn = null;
|
mUsbEndpointOut = null;
|
isOpen = false;
|
return false;
|
} else {
|
if (!mUsbManager.hasPermission(currentDevice)) {
|
isOpen = false;
|
return false;
|
} else {
|
isOpen = true;
|
return true;
|
}
|
}
|
}
|
return false;
|
},
|
/**
|
* usb状态监听
|
* @param {Activity} activity
|
*/
|
listenUsbStatus() {
|
if (usbStatusReceiver != null) {
|
try {
|
activity.unregisterReceiver(usbStatusReceiver);
|
} catch (e) {
|
console.error(e);
|
}
|
usbStatusReceiver = null;
|
}
|
usbStatusReceiver = plus.android.implements("io.dcloud.android.content.BroadcastReceiver", {
|
"onReceive": (context, intent) => {
|
plus.android.importClass(context);
|
plus.android.importClass(intent);
|
|
let action = intent.getAction();
|
switch (action) {
|
case UsbManager.ACTION_USB_DEVICE_ATTACHED:
|
this.options.listenUSBStatusCallback && this.options.listenUSBStatusCallback(
|
'ACTION_USB_DEVICE_ATTACHED');
|
break;
|
case UsbManager.ACTION_USB_DEVICE_DETACHED:
|
isOpen = false;
|
this.options.listenUSBStatusCallback && this.options.listenUSBStatusCallback(
|
'ACTION_USB_DEVICE_DETACHED');
|
break;
|
}
|
}
|
});
|
let filter = new IntentFilter();
|
filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
|
filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
|
activity.registerReceiver(usbStatusReceiver, filter);
|
},
|
/**
|
* 关闭usb
|
*/
|
closeUsb() {
|
mUsbEndpointIn = null;
|
mUsbEndpointOut = null;
|
if (mUsbDeviceConnection != null) {
|
mUsbDeviceConnection.releaseInterface(mUsbInterface);
|
mUsbDeviceConnection.close();
|
mUsbDeviceConnection = null;
|
isOpen = false;
|
}
|
},
|
/**
|
* 获得usb打开状态
|
*
|
* @return true:USB打开 false:USB关闭
|
*/
|
isOpened() {
|
return isOpen;
|
},
|
sendByteData(byteData) {
|
if (currentDevice == null) {
|
console.log("未检测到打印机设备");
|
return false;
|
}
|
if (mUsbDeviceConnection == null) {
|
mUsbManager.requestPermission(currentDevice, mPermissionIntent);
|
mUsbDeviceConnection = mUsbManager.openDevice(currentDevice);
|
const ret = invoke(mUsbDeviceConnection, "claimInterface", mUsbInterface, true);
|
}
|
if (mUsbEndpointOut == null) {
|
return false;
|
}
|
const result = invoke(mUsbDeviceConnection, "bulkTransfer", mUsbEndpointOut, byteData, byteData.length,
|
1500);
|
if (result == -1) {
|
return false;
|
} else {
|
return true;
|
}
|
}
|
}
|
|
module.exports = usbTool
|