?安卓使用usb調取打印機
/*** 安卓usb調取打印機*@param { string | bytes[] } html 傳入的打印內容*傳入一段文本或一個bytes數組* @returns*/
export const printUsb = (html) => {return new Promise((resolve, reject) => {if (!window.plus) return reject(new Error("請在安卓環境中使用!"));//如果參數不是字符串或bytes數組直接報錯if (!Array.isArray(html) && typeof html !== "string")return reject(new Error("參數不正確!"));try {const context = plus.android.runtimeMainActivity();const usbManager = context.getSystemService("usb");//引入usb類plus.android.importClass(usbManager);//獲取到設備列表const devices = usbManager.getDeviceList();const values = plus.android.invoke(devices, "values");//調用values方法獲取usb設備列表const deviceList = plus.android.invoke(values, "toArray");const printerList = deviceList.filter((item) => {const usbInterface = plus.android.invoke(item, "getInterface", 0);const usbType = plus.android.invoke(usbInterface, "getInterfaceClass");//usb類型為7的時候是打印機if (usbType === 7) return item;});//如果打印機不存在,直接阻斷if (!printerList.length) return reject(new Error("請連接打印機設備!"));//usb設備(我這里選擇打印機的第一臺連接,如果要連多臺打印機可以用上面獲取的pinterList打印機列表進行操作)const device = printerList[0];const PendingIntent = plus.android.importClass("android.app.PendingIntent",);const Intent = plus.android.importClass("android.content.Intent");//申請usb傳輸權限const pendingIntent = PendingIntent.getBroadcast(context,0,new Intent("ACTION_USB_PERMISSION"),PendingIntent.FLAG_UPDATE_CURRENT,);//判斷是否具有權限const isExist = plus.android.invoke(usbManager, "hasPermission", device);//如果權限不存在申請權限if (!isExist) {//請求讀寫權限usbManager.requestPermission(device, pendingIntent);return resolve('已獲取usb權限!');}//建立連接const socket = usbManager.openDevice(device);if (!socket) return reject(new Error("usb連接失敗!"));const iface = plus.android.invoke(device, "getInterface", 0);plus.android.invoke(socket, "claimInterface", iface, true);//批量傳輸示例const endpoint = plus.android.invoke(iface, "getEndpoint", 0);//根據傳入的內容類型做處理const buffer =typeof html === "string"? plus.android.invoke(html, "getBytes", "gbk"): html;plus.android.invoke(socket,"bulkTransfer",endpoint,buffer,buffer.length,5000,);//釋放usb端口資源plus.android.invoke(socket, "releaseInterface", iface);//關閉usb連接plus.android.invoke(socket, "close");resolve("打印成功!");} catch (error) {reject(error);}});
};
安卓使用藍牙調取打印機設備
/**
*安卓使用藍牙調取打印機
*@param { string } deviceId 藍牙的mac地址(即設備id)
*@param { string } html 需要打印的文本
*/
export const printBluetooth(deviceId, html) {return new Promise((resolve, reject) => {try {plus.android.runtimeMainActivity();const BluetoothAdapter = plus.android.importClass("android.bluetooth.BluetoothAdapter",);const UUID = plus.android.importClass("java.util.UUID");const uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");const Adapter = BluetoothAdapter.getDefaultAdapter();Adapter.cancelDiscovery(); //停止掃描const device = Adapter.getRemoteDevice(deviceId);plus.android.importClass(device);const bluetoothSocket =device.createInsecureRfcommSocketToServiceRecord(uuid);plus.android.importClass(bluetoothSocket);if (!bluetoothSocket.isConnected()) {bluetoothSocket.connect();}const outputStream = bluetoothSocket.getOutputStream();plus.android.importClass(outputStream);const bytes = plus.android.invoke(html, "getBytes", "gbk");outputStream.write(bytes);outputStream.flush();outputStream.close();resolve();} catch (error) {reject(error);}});
}