1. 程式人生 > >Android小票印表機連線 (已封裝好,可直接使用)

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 加密解密與IOSAndroid實現加密通訊

前幾天除錯一個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&