Android小票印表機連線 (已封裝好,可直接使用)
一、新建MyUsbPrinterUtil工具類,程式碼如下:
import android.annotation.SuppressLint; 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.Build; import android.util.Log; import com.posin.usbprinter.UsbPrinter; import java.io.IOException; import java.util.ArrayList;import java.util.Iterator; import java.util.List; /** * Created by Administrator on 2018/1/5. * 這是小票印表機工具類 */ public class MyUsbPrinterUtil { private static final String TAG = "UsbPrinter"; private final Context mContext; private final UsbManager mUsbManager; private volatile List<UsbDevice> mUsbPrinterList= null; private static String ACTION_USB_PERMISSION = "com.posin.usbdevice.USB_PERMISSION"; private com.posin.usbprinter.UsbPrinterUtil.OnUsbPermissionCallback onPermissionCallback = null; public static final byte[] PUSH_CASH = {0x1b, 0x70, 0x00, 0x1e, (byte) 0xff, 0x00}; public UsbDeviceConnection mConnection; private UsbEndpoint mEndpointIntr; final BroadcastReceiver mReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { Log.d("UsbPrinter", intent.getAction()); if (MyUsbPrinterUtil.ACTION_USB_PERMISSION.equals(intent.getAction())) { UsbDevice device = (UsbDevice) intent.getParcelableExtra("device"); if (intent.getBooleanExtra("permission", false)) { if (MyUsbPrinterUtil.this.onPermissionCallback != null) { MyUsbPrinterUtil.this.onPermissionCallback.onUsbPermissionEvent(device, true); } } else if (MyUsbPrinterUtil.this.onPermissionCallback != null) { MyUsbPrinterUtil.this.onPermissionCallback.onUsbPermissionEvent(device, false); } context.unregisterReceiver(this); } } }; public MyUsbPrinterUtil(Context context) { this.mContext = context; this.mUsbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE); } /** * 獲取所有的小票印表機裝置 */ public List<UsbDevice> getUsbPrinterList() { // if (Build.MODEL.substring(0, 3).equalsIgnoreCase("TPS")) { if (this.mUsbPrinterList == null) { this.mUsbPrinterList = this.findAllUsbPrinter(); } return this.mUsbPrinterList; // } else { // Log.e("_ERROR", "ERROR--->Device is not support! This Demo just developer for TPS device"); // return null; // } } public boolean requestPermission(UsbDevice usbDevice, com.posin.usbprinter.UsbPrinterUtil.OnUsbPermissionCallback callback) { if (!this.mUsbManager.hasPermission(usbDevice)) { IntentFilter ifilter = new IntentFilter(ACTION_USB_PERMISSION); this.mContext.registerReceiver(this.mReceiver, ifilter); PendingIntent pi = PendingIntent.getBroadcast(this.mContext, 0, new Intent(ACTION_USB_PERMISSION), 0); this.onPermissionCallback = callback; this.mUsbManager.requestPermission(usbDevice, pi); return false; } else { return true; } } /** * 獲取所有的小票印表機 */ private List<UsbDevice> findAllUsbPrinter() { List<UsbDevice> result = new ArrayList(); Log.d("UsbPrinter", "find usb printer..."); Iterator var3 = this.mUsbManager.getDeviceList().values().iterator(); while (var3.hasNext()) { UsbDevice usbDevice = (UsbDevice) var3.next(); Log.d("UsbPrinter", String.format("usb %04X:%04X : device_id=%d, device_name=%s", new Object[]{Integer.valueOf(usbDevice.getVendorId()), Integer.valueOf(usbDevice.getProductId()), Integer.valueOf(usbDevice.getDeviceId()), usbDevice.getDeviceName()})); if (isUsbPrinterDevice(usbDevice)) { Log.d("UsbPrinter", String.format("usb printer %04X:%04X : device_id=%d, device_name=%s", new Object[]{Integer.valueOf(usbDevice.getVendorId()), Integer.valueOf(usbDevice.getProductId()), Integer.valueOf(usbDevice.getDeviceId()), usbDevice.getDeviceName()})); result.add(usbDevice); } } return result; } /** * 識別不同的小票印表機裝置 * * @param usbDevice * @return */ public static boolean isUsbPrinterDevice(UsbDevice usbDevice) { /** * getVendorId()返回一個供應商id *getProductId()為裝置返回一個產品ID * */ int vid = usbDevice.getVendorId(); int pid = usbDevice.getProductId(); return vid == 5455 && pid == 5455 || vid == 26728 && pid == 1280 || vid == 26728 && pid == 1536 || vid == '衦' || vid == 1137 || vid == 1659 || vid == 1137 || vid == 1155 && pid == 1803 || vid == 17224 || vid == 7358 || vid == 6790 || vid == 1046 && pid == 20497 || vid == 10685 || vid == 4070 && pid == 33054; } /* 開啟錢箱 */ public boolean pushReceiptCash() { boolean canPush = false; if (this.sendUsbCommand(PUSH_CASH)) { canPush = true; } else { canPush = false; } return canPush; } //傳送資訊 一是列印訊息,切紙,開啟錢箱等 @SuppressLint("NewApi") public boolean sendUsbCommand(byte[] Content) { boolean Result; synchronized (this) { int len = -1; if (mConnection != null) { len = mConnection.bulkTransfer(mEndpointIntr, Content, Content.length, 10000); } if (len < 0) { Result = false; // Log.i(TAG, "傳送失敗! " + len); } else { Result = true; // Log.i(TAG, "傳送" + len + "位元組資料"); } } return Result; } @SuppressLint("NewApi") public void setUsbDevice(UsbDevice device) { if (device != null) { UsbInterface intf = null; UsbEndpoint ep = null; int InterfaceCount = device.getInterfaceCount(); Log.i(TAG, "InterfaceCount:" + InterfaceCount); int j; // mDevice = device; for (j = 0; j < InterfaceCount; j++) { int i; intf = device.getInterface(j); Log.i(TAG, "介面是:" + j + "類是:" + intf.getInterfaceClass()); if (intf.getInterfaceClass() == 7) { int UsbEndpointCount = intf.getEndpointCount(); for (i = 0; i < UsbEndpointCount; i++) { ep = intf.getEndpoint(i); Log.i(TAG, "端點是:" + i + "方向是:" + ep.getDirection() + "型別是:" + ep.getType()); if (ep.getDirection() == 0 && ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) { Log.i(TAG, "介面是:" + j + "端點是:" + i); break; } } if (i != UsbEndpointCount) { break; } } } if (j == InterfaceCount) { Log.i(TAG, "沒有印表機介面"); return; } mEndpointIntr = ep; UsbDeviceConnection connection = mUsbManager.openDevice(device); if (connection != null && connection.claimInterface(intf, true)) { Log.i(TAG, "開啟成功! "); Log.i(TAG, "connection " + connection); mConnection = connection; } else { Log.i(TAG, "開啟失敗! "); mConnection = null; } } } @SuppressLint("NewApi") public void CloseReceiptUsb() { if (mConnection != null) { mConnection.close(); mConnection = null; } } public interface OnUsbPermissionCallback { void onUsbPermissionEvent(UsbDevice var1, boolean var2); } }
二、新建二維碼列印方法類PrintCategory,程式碼如下:
import android.graphics.Bitmap; import com.google.zxing.EncodeHintType; import com.google.zxing.MultiFormatWriter; import com.google.zxing.WriterException; import com.google.zxing.common.BitMatrix; import java.util.Hashtable; /** * Created by Administrator on 2018/1/6. * 這是小票列印類別類 */ public class PrintCategory { /** * 生成條碼、二維碼 * * @param str 條碼內容 * @param type 條碼型別: AZTEC, CODABAR, CODE_39, CODE_93, CODE_128, DATA_MATRIX, * EAN_8, EAN_13, ITF, MAXICODE, PDF_417, QR_CODE, RSS_14, * RSS_EXPANDED, UPC_A, UPC_E, UPC_EAN_EXTENSION; * @param bmpWidth 生成點陣圖寬,寬不能大於384,不然大於列印紙寬度 * @param bmpHeight 生成點陣圖高,8的倍數 */ public Bitmap CreateCode(String str, com.google.zxing.BarcodeFormat type, int bmpWidth, int bmpHeight) throws WriterException { Hashtable<EncodeHintType, String> mHashtable = new Hashtable<EncodeHintType, String>(); mHashtable.put(EncodeHintType.CHARACTER_SET, "UTF-8"); // 生成二維矩陣,編碼時要指定大小,不要生成了圖片以後再進行縮放,以防模糊導致識別失敗 BitMatrix matrix = new MultiFormatWriter().encode(str, type, bmpWidth, bmpHeight, mHashtable); int width = matrix.getWidth(); int height = matrix.getHeight(); // 二維矩陣轉為一維畫素陣列(一直橫著排) int[] pixels = new int[width * height]; for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { if (matrix.get(x, y)) { pixels[y * width + x] = 0xff000000; } else { pixels[y * width + x] = 0xffffffff; } } } Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); // 通過畫素陣列生成bitmap,具體參考api bitmap.setPixels(pixels, 0, width, 0, 0, width, height); return bitmap; } }
三、新建列印方法類PrintReceived,呼叫此方法類直接列印,程式碼如下:
import android.graphics.Bitmap; import com.google.zxing.BarcodeFormat; import com.google.zxing.WriterException; import com.posin.usbprinter.UsbPrinter; import java.io.IOException; import java.io.UnsupportedEncodingException; /** * Created by hboxs028 on 2018/1/30. * 這是小票列印類 */ public class PrintReceipt { //列印的資料 private static String cmd = ""; public static boolean receiptPrint(final PrintfBean printfBean, int type) { Boolean print = (Boolean) ACache.get(App.getInstance().getApplicationContext()).getAsObject(Constants.WHETHER_PRINT); final UsbPrinter usbPrinter = App.getInstance().getUsbPrinter(); final PrintCategory mPrintCategory = App.getInstance().getMpPrintCategory(); if (usbPrinter == null) { ToastUtil.shortShow("小票印表機未連線"); return false; } else { try { if ((print == null || !print)) { return false; } switch (type) { case TYPE_COLLECTION: cmd = productCollectFormat((CollectionPrintBean) printfBean);//收銀訂單/銷售訂單 break; case TYPE_WEB_ORDER: cmd = webOrderFormat((WebOrderPrintBean) printfBean);//網路訂單 break; case TYPE_VIP_CARD: cmd = buyVipCardFormat((CollectionPrintBean) printfBean); break; case TYPE_TRANSFER: cmd = transferFormat((TransferPrintBean) printfBean);//交接班 break; case TYPE_STOCK: cmd = strokFlowFormat((StockFlowPrintBean) printfBean);//貨流通知 break; case MEMBER_RECHARGE: cmd = memberRechargeFormat((MemberRechargePrintBean) printfBean); break; default: break; } new Thread() { @Override public void run() { super.run(); try { usbPrinter.resetInit(); usbPrinter.selectAlignment(UsbPrinter.ALIGNMENT.LEFT);//設定對齊方式 Bitmap qrBitMap = null; qrBitMap = mPrintCategory.CreateCode("http://www.hao123.com", BarcodeFormat.QR_CODE, 256, 256);//設定列印二維碼的資料和寬高 Bitmap barBitMap = mPrintCategory.CreateCode("201801050943308072", BarcodeFormat.CODE_128, 350, 40);//設定條形碼的資料和寬高 usbPrinter.selectFONT(UsbPrinter.FONT.FONT_A);//設定字型 usbPrinter.selectBold(false);//設定是否加粗 usbPrinter.selectUnderlined(false);//設定是否有下劃線 usbPrinter.doubleFontSize(false, false);//設定是否放大 usbPrinter.setLineSpace(0);//設定間距 usbPrinter.printString(cmd);//列印正文 // usbPrinter.selectAlignment(UsbPrinter.ALIGNMENT.RIGHT);//設定對齊方式 // usbPrinter.printBitmapByLine(barBitMap);//列印條形碼 // usbPrinter.printBitmapByLine(qrBitMap);//列印二維碼 usbPrinter.walkPaper(3);//走紙 usbPrinter.cutPaper();//切紙 } catch (IOException e) { e.printStackTrace(); } catch (WriterException e) { e.printStackTrace(); } finally { try { sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return true; } } //列印測試 public boolean printReceiptTest() { final UsbPrinter usbPrinter = App.getInstance().getUsbPrinter(); final PrintCategory mPrintCategory = App.getInstance().getMpPrintCategory(); if (usbPrinter == null) { ToastUtil.shortShow("小票印表機未連線"); return false; } else { new Thread() { @Override public void run() { super.run(); try { usbPrinter.resetInit(); usbPrinter.selectAlignment(UsbPrinter.ALIGNMENT.LEFT);//設定對齊方式 Bitmap qrBitMap = null; qrBitMap = mPrintCategory.CreateCode("http://www.hao123.com", BarcodeFormat.QR_CODE, 256, 256); Bitmap barBitMap = mPrintCategory.CreateCode("201801050943308072", BarcodeFormat.CODE_128, 350, 40); usbPrinter.selectFONT(UsbPrinter.FONT.FONT_A); usbPrinter.selectBold(false); usbPrinter.selectUnderlined(false); usbPrinter.doubleFontSize(false, false); usbPrinter.setLineSpace(0); usbPrinter.printString("小票印表機列印測試\n"); // usbPrinter.printBitmapByLine(barBitMap); // usbPrinter.selectAlignment(UsbPrinter.ALIGNMENT.RIGHT); // usbPrinter.printBitmapByLine(qrBitMap); usbPrinter.walkPaper(3); usbPrinter.cutPaper(); } catch (IOException e) { e.printStackTrace(); } catch (WriterException e) { e.printStackTrace(); } finally { try { sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }.start(); return true; } } }
注:如需要,可直接使用列印測試裡面的程式碼,第一個方法是自己需要實現的方式,可根據列印測試裡面的程式碼去實現自己想要的方式
四、連線方式
/** * 連線印表機 */
public static MyUsbPrinterUtil myUsbPrinterUtil = null; private static List<UsbDevice> devices; public static UsbPrinter usbPrinter = null; public static PrintCategory mpPrintCategory = null;
private static ArrayList<UsbDevice> receiptDeviceList; public static UsbDevice receiptUSBDevice;
/** * 連線印表機 */ public static void getReceiptDevice() { if (usbPrinter == null) { myUsbPrinterUtil = new MyUsbPrinterUtil(mContext); mpPrintCategory = new PrintCategory(); devices = myUsbPrinterUtil.getUsbPrinterList();//獲取所有列印裝置 receiptDeviceList = new ArrayList<>(); for (UsbDevice usbDevice : devices) { if (myUsbPrinterUtil.isUsbPrinterDevice(usbDevice)) { myUsbPrinterUtil.requestPermission(usbDevice, null);//請求許可權 /** * 優庫印表機:pid=33054 vid=4070 * 君時達印表機:pid=1803 vid=1155 * 票據印表機:pid=20497 vid=1046 * 佳博印表機:pid=1536 vid=26728 */ if (usbDevice.getVendorId() == 26728 && usbDevice.getProductId() == 1536 || usbDevice.getVendorId() == 4070 && usbDevice.getProductId() == 33054 || usbDevice.getVendorId() == 1155 && usbDevice.getProductId() == 1803 || usbDevice.getVendorId() == 1046 && usbDevice.getProductId() == 20497) { receiptDeviceList.add(usbDevice); } } } if (receiptDeviceList.isEmpty()) { ToastUtil.shortShow(mContext.getResources().getString(R.string.no_connected)); return; } receiptUSBDevice = receiptDeviceList.get(0); if (receiptUSBDevice == null) { receiptHandler.sendEmptyMessage(4); return; } try { usbPrinter = new UsbPrinter(mContext, receiptUSBDevice);//列印物件 /** * 設定全域性變數 */ App.getInstance().setUsbPrinter(usbPrinter); App.getInstance().setMyUsbPrinterUtil(myUsbPrinterUtil); App.getInstance().setReceiptUSBDevice(receiptUSBDevice); App.getInstance().setMpPrintCategory(mpPrintCategory); receiptHandler.sendEmptyMessage(1); } catch (IOException e) { e.printStackTrace(); } } }
五、handle
// 用於接受連線狀態訊息的 Handler @SuppressLint("HandlerLeak") public static Handler receiptHandler = new Handler() { @SuppressLint("ShowToast") @Override public void handleMessage(Message msg) { switch (msg.what) { case 1: ToastUtil.shortShow("連線成功"); isConnected = true; Constants.ISCONNECTED = isConnected; break; case 2: isConnected = false; ToastUtil.shortShow(mContext.getResources().getString(R.string.conn_failed)); break; case 3: isConnected = false; Constants.ISCONNECTED = isConnected; Log.i(TAG, "連線關閉!"); break; case 4: isConnected = false; ToastUtil.shortShow(mContext.getResources().getString(R.string.conn_no)); break; case 0: ToastUtil.shortShow("列印通訊正常"); break; case -1: ToastUtil.shortShow("印表機通訊異常,請檢查藍芽連線"); vibrator(); break; case -2: ToastUtil.shortShow("列印缺紙"); vibrator(); break; case -3: ToastUtil.shortShow("印表機開蓋"); vibrator(); break; default: break; } updateButtonState(isConnected);//更新印表機狀態 } };
六、斷開印表機
/** * 斷開印表機連線 */ public static void breakPrinter() { if (usbPrinter != null) { /** * 斷開列印裝置的連線 */ usbPrinter.close(); usbPrinter = null; myUsbPrinterUtil.CloseReceiptUsb(); myUsbPrinterUtil = null; mpPrintCategory = null; receiptDeviceList = null; receiptUSBDevice = null; App.getInstance().setUsbPrinter(null); App.getInstance().setMyUsbPrinterUtil(null); App.getInstance().setReceiptUSBDevice(null); App.getInstance().setMpPrintCategory(null); receiptHandler.sendEmptyMessage(3); ToastUtil.shortShow("已斷開連線"); } else { ToastUtil.shortShow("印表機未連線"); } if (isConnected) { receipt_device_name.setText("裝置名稱: " + "小票印表機"); receipt_print_state.setText(mContext.getResources().getString(R.string.on_line)); } else { receipt_device_name.setText("裝置名稱:未連線"); receipt_print_state.setText(mContext.getResources().getString(R.string.off_line)); } }
以上就是連線的主要方法了,還有一些功能就根據自己的需要去實現了,只需要連線方法就基本解決掉了小票印表機的連線了
下面直接貼全部程式碼:
程式碼是在一個fragment裡面點選按鈕去連線,如需要啊activity中去連線,可直接設定,直接看點選事件裡面的步驟就可實現。
import android.annotation.SuppressLint; import android.content.Context; import android.hardware.usb.UsbDevice; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.RelativeLayout; import android.widget.TextView; import com.posin.usbprinter.UsbPrinter; import java.io.IOException; import java.util.ArrayList; import java.util.List; /** * 這是設定的列印小票機的設定 */ public class SettingBillPrinterFragment extends Fragment implements OnClickListener { //usb授權設定 public UsbAdmin mUsbAdmin = null; private App相關推薦
Android小票印表機連線 (已封裝好,可直接使用)
一、新建MyUsbPrinterUtil工具類,程式碼如下:import android.annotation.SuppressLint; import android.app.PendingIntent; import android.content.BroadcastRe
那些牛b的ios開發第三方工具(利器雖好,新手慎用)
http://www.open-open.com/lib/view/open1406645989202.html#hud 第三方框架使用對於提高我們的開發效率非常有益,但請知道務必要知其所以然,否則你不理解的強大工具往往會給你帶來更大的困擾。不能駕馭的工具還不如不使用,起碼
MATLAB五子棋遊戲(雙人對戰,可悔棋)
程式介紹:1、此遊戲只可用於雙人對戰。 2、棋盤顏色、棋盤格數、棋子顏色等引數均可自由設定 &nb
使用java實現郵件傳送功能(已封裝)
現如今,用郵件傳送訊息的人越來越少,可是並不影響我們學習java。 以下給大家帶來自己寫的封裝類,可以直接使用。 首先,需要jar包: 普通javaweb專案:mail.jar maven管理專案: <dependency> &
android studio 除錯技巧(簡直太好用)
說到android studio的除錯,很多人可能會說,這有什麼可講的不就是一個斷點除錯麼,剛開始我也是這麼認為的,直到我瞭解之後,才發現,除錯原來可以玩的這麼牛。下面我分別一一做介紹。 條件斷點(Conditional Breakpoints) 這個除錯模式是我最喜歡的,簡直不能再方便了,
android實現的簡單的計算器(原始碼+打包好的apk檔案)
一、啥也不說,先看效果 二、再來看一下目錄結構吧: 三、原始碼: .java檔案 package com.kjgym.mycalculatorv10; import android.support.v7.app.AppCompatActivity; imp
JS cookie使用方法 已封裝好可直接使用
封裝好的程式碼: //設定cookie值 function setCookie(name,value){ document.cookie = name+"="+value+";path=/"; } //獲取cookie值 function getCookie(name)
SpringBoot使用已封裝好的Redis
一 json工具類 package com.imooc.utils; import java.util.List; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterx
360內推Android面經 - 2018(已拿offer)
上週參加了360的內推面試,一天3面,兩輪技術,一輪HR。不得不說效率很高。和其他公司隔幾天再面相比,感覺最重要的是能夠及時的知道自己過沒過,不用焦急的等待後續面試通知。差不多一週左右的時間,offer意向書已經發放,效率很高。 以下是我的面經,供參考。 一面
docker部署Oracle,無法遠端連線(已解決)
docker部署Oracle,無法遠端連線 多方嘗試,包括客戶機的配置檔案,伺服器埠開放情況,偵聽服務等等 網上搜了很多教程 docker pull wnameless/oracle-xe-11g docker run -d -p 49160:22 -p 49161:15
Android使用okhttp封裝多檔案批量下載 (帶進度條,取消下載)
在網上搜索了很多關於okhttp封裝的網路框架,唯獨沒找到完美實現了多個檔案批量下載的案例,當前使用的最多的也就是okhttp了,所以,我學習了各位大神的封裝後,自己也試著封裝了一個關於okhttp的網路請求框架,方便專案中的使用。 實現的功能基本如下:
Android Socket連線(模擬心跳包,斷線重連,傳送資料等)
這兩天做了一個專案是app通過socket連線自動炒菜機,給炒菜機發指令,炒菜機接收到指令會執行相應的操作。(程式雖然做的差不多了,然而我連炒菜機長什麼樣都沒見過) 其實作為一個會做飯的程式猿,我堅信還是自己動手做的飯菜比較好吃,畢竟做飯還是很有趣的。 閒話不
關於js jQuery獲取本月、上月、本年的方法(已封裝)
/ ** *獲取本月,上月,今年開始日期,結束日期 * / var now = new Date(); //當前日期var nowMonth = now.getMonth(); //當前月var
點選圖片檢視大圖,已封裝好
之前研究了點選檢視大圖方法,現在封裝好,分享下 用的glide庫載入,需要本地匯入。圖片載入庫也可以改為別的。 例子在MainActivyt裡寫好,兩個方法,一個只需傳入context和urllist,另一個要加上index(當前圖片位置),該引數不傳預設從第1張圖片開始檢
hellocharts-android開源圖表庫(效果非常好)
之前我們介紹了一個非常優秀開源圖表庫 MPAndroidChart ,但是我們今天介紹的將是一個更為優秀的圖表庫,比MPAndroidChart效能更好,功能更完善,UI風格更美觀,座標軸更精細。 他就是github上出現的新專案HelloCharts。 HelloCharts支援以下chart型別
虎牙直播 2019暑期實習生-Android開發 面試經歷(已拿offer)
一面 兩個執行緒,一個執行緒輸出”A”,一個執行緒輸出”B”,使用兩個執行緒輸出”ABABABABABAB”,要保證輸出的次序。 int c = 5;在編譯生成可執行檔案後這個變數儲存在檔案的什麼位
Android標籤印表機連線與列印位置調動方法總結
一、獲取連線的標籤列印裝置private static List<UsbDevice> deviceList;private static String deviceArrayLisr;private static UsbDevice mUSBDevice;pub
Node.js 基於 ursa 模組的 RSA 加密解密(已與IOS,Android實現加密通訊)
前幾天除錯一個RSA加密,遇到一些問題,在網上找了好久好久,與Node.js相關的資源少得非常可憐,最後還是靠自己一步一步解決了,今天把程式碼和一些心得拿出來分享一下: cnode連結地址:https://cnodejs.org/topic/54d2de4cf
cmder安裝(window下好用的終端)
href 執行 targe 壓縮 tar In 配置環境變量 輸入 gis cmder下載地址:cmder官網 安裝步驟: 下載cmder(cmder官網)並解壓縮 配置環境變量 先配置CMDER_HOME(cmder.exe所在目錄) 配置path:%
ajax非同步請求關鍵字提示(適用於註冊使用者時顯示已註冊使用者,避免重複)
1.前端程式碼 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>staff_insert.html</title&