上週剛搞完ApiCould的自定義模塊開發,這周又有一個新的需求Cordova插件開發,經過幾天的奮鬥,看了不少博客,總算搞出了Cordova的打印插件。在完成ApiCodld和Cordova插件後感覺這兩個在插件開發步驟上差不了太多,這篇文章主要記錄下自己的開發過程,方便以後使用。
一、環境
1、node.js、cordova
2、Android studio3.5.1、jdk1.8
二、開發準備
1、安裝cordova,npm install -g cordova
2、創建項目:cordova create MyTestProgject
3、添加android:cordova platforms add android
項目結構如下,android工程在platforms裏
三、開始開發 1、導入上面創建的cordova項目裏的android工程 2、創建自己的插件類並繼承CordovaPlugin,實現initialize、execute方法,execute方法就是你js裏面執行的,我的插件如下
public class PrintlcPlugin extends CordovaPlugin { private final String TAG=PrintlcPlugin.class.getName (); private IPosApi mPosApi; private Context context; private CallbackContext callbackContext; @Override public void initialize(CordovaInterface cordova, CordovaWebView webView) { super.initialize (cordova, webView); Log.e (TAG, "initialize:"); context=cordova.getContext (); mPosApi=PosFactory.getPosDevice (context); } @Override public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { this.callbackContext=callbackContext; switch (action) { case "initPrint": initPrint(callbackContext); break; case "resume": resumePrint (); break; case "pause": pausePrint (); break; case "setEncode": setEncode (args); break; case "setLanguage": setLanguage (args); break; case "printFeatureList": printFeatureList (); break; case "closePrint": closePrint (callbackContext); break; case "printText": printText (args); break; case "printQR": printQR (args); break; case "printBarcode": printBarcode (args); break; case "printCheckMark": printCheckMark (args); break; case "printFeedPaper": printFeedPaper (args); break; case "printBackPaper": printBackPaper (args); break; case "printImage": printImage (); break; case "startPrint": startPrint (); break; default: return false; } return false; } public void initPrint(CallbackContext callbackContext) { try{ Log.e (TAG, "initPrint: "); mPosApi.setPos (); mPosApi.setPrintEventListener (new OnPrintEventListener () { @Override public void onPrintState(int state) { switch (state) { case BarCode.ERR_POS_PRINT_SUCC: showToastShort ("print success"); break; case BarCode.ERR_POS_PRINT_FAILED: showToastShort ("print error"); break; case BarCode.ERR_POS_PRINT_HIGH_TEMPERATURE: showToastShort ("high temperature"); break; case BarCode.ERR_POS_PRINT_NO_PAPER: showToastShort ("no paper"); break; case 4: break; } } }); mPosApi.openDev (); callbackContext.success (0); }catch (Exception e){ callbackContext.error (1); } } public void resumePrint() { mPosApi.resume (); } public void pausePrint() { mPosApi.stop (); } public void setEncode(JSONArray args) { // Integer encode=args.optInt (0); try { Log.e (TAG, "setEncode:" + args.get (0)); } catch (JSONException e) { e.printStackTrace (); } // mPosApi.setEncode (encode); } public void setLanguage(JSONArray args) { Integer language=args.optInt (0); mPosApi.setLanguage (language); } public void printFeatureList() { mPosApi.printFeatureList (); } public void closePrint(CallbackContext callbackContext) { if (mPosApi != null) { mPosApi.closeDev (); PosFactory.Destroy (); callbackContext.success (0); }else{ callbackContext.success (1); } } public void printText(JSONArray args) { String text=args.optString (0); boolean bold=args.optBoolean (1); String align=args.optString (2); // 1 、2、3 String fontSize=args.optString (3);// 1、2、3 Integer concentration=args.optInt (4); Log.e (TAG, "text: " + text + " bold: " + bold + " align: " + align + " fontSize: " + fontSize + " concentration: " + concentration); TextData textData=new TextData (); textData.addConcentration (concentration); textData.addFont (BarCode.FONT_ASCII_12x24); textData.addTextAlign (align); textData.addCharBold (bold); textData.addFontSize (fontSize); textData.addText (text + "\n"); mPosApi.addText (textData); } public void printQR(JSONArray args) { String text=args.optString (0); Integer pix=args.optInt (1); Integer unit=args.optInt (2); Integer concentration=args.optInt (3); Log.e (TAG, "jsmethod_printQR: " + text + "" + pix + "" + unit + "" + concentration); QRBean qrBean=new QRBean (); qrBean.setConcentration (concentration); qrBean.setPix (pix); // 像素點 qrBean.setUnit (unit); // 單元大小也就是二維碼的版本號,版本號越大二維碼容量越大 qrBean.setLevel (49);// 這個不用改,這個是二維碼的糾錯級別 qrBean.setText (text); mPosApi.addQR (qrBean, ALIGN_MODE.ALIGN_CENTER); } public void printBarcode(JSONArray args) { String text=args.optString (0); Integer height=args.optInt (1); Integer width=args.optInt (2); Integer concentration=args.optInt (3); BarCodeBean barCodeBean=new BarCodeBean (); barCodeBean.setConcentration (concentration); barCodeBean.setBarType (BarCode.CODE128); barCodeBean.setHeight (height); barCodeBean.setWidth (width); barCodeBean.setText (text); mPosApi.addBarCode (barCodeBean, ALIGN_MODE.ALIGN_CENTER); } public void printCheckMark(JSONArray args) { mPosApi.addMark (); } public void printFeedPaper(JSONArray args) { boolean feedPaper=args.optBoolean (0); Integer Length=args.optInt (1); mPosApi.addFeedPaper (feedPaper, Length); } public void printBackPaper(JSONArray args) { Integer Length=args.optInt (0); mPosApi.addBackPaper (Length); } public void printImage() { } public void startPrint() { mPosApi.printStart (); } public void showToastShort(String str) { Toast.makeText (context, str, Toast.LENGTH_SHORT).show (); } }
3、編寫插件js文件,這裏的exec調的就是你插件類的那個execute,第一、第二參數successCallback,errorCallback返回狀態有就傳,沒有就不傳,第三個參數是你的插件類名,第四個參數是你的方法名,第五個參數是你方法需要的參數,有就傳,沒有就不傳。
cordova.define( "cordova-plugin-printlc.PrintlcPlugin" , function(require, exports, module) { var exec = require('cordova/exec'); /** * Provides access to notifications on the device. */ module.exports = { initPrint:function(successCallback,errorCallback){ exec(successCallback, errorCallback, "PrintlcPlugin", "initPrint", []); }, printTest:function(){ exec(null, null, "PrintlcPlugin", "printTest", []); }, printText:function(text,bold,align,fontSize,concentration){ exec(null, null, "PrintlcPlugin", "printText", [text,bold,align,fontSize,concentration]); }, setEncode:function(encode){ exec(null, null, "PrintlcPlugin", "setEncode", [encode]); }, setLanguage:function(number){ exec(null, null, "PrintlcPlugin", "setLanguage", [number]); }, printFeatureList:function(){ exec(null, null, "PrintlcPlugin", "printFeatureList", []); }, printQR:function(text,pix,unit,concentration){ exec(null, null, "PrintlcPlugin", "printQR", [text,pix,unit,concentration]); }, printBarcode:function(text,height,width,concentration){ exec(null, null, "PrintlcPlugin", "printBarcode", [text,height,width,concentration]); }, printCheckMark:function(){ exec(null, null, "PrintlcPlugin", "printCheckMark", []); }, printFeedPaper:function(feedPaper,length){ exec(null, null, "PrintlcPlugin", "printFeedPaper", [feedPaper,length]); }, printBackPaper:function(length){ exec(null, null, "PrintlcPlugin", "printBackPaper", [length]); }, printImage:function(content,successCallback,errorCallback){ exec(null, null, "PrintlcPlugin", "printImage", [content]); }, startPrint:function(){ exec(null, null, "PrintlcPlugin", "startPrint", []); }, closePrint:function(successCallback,errorCallback){ exec(successCallback, errorCallback, "PrintlcPlugin", "closePrint", []); }, }; });
4、完成前面的步驟,我們就可以打插件包了 首先創建插件:plugman create --name [插件名] --plugin_id [插件id] --plugin_version [插件版本]
調整下目錄結構,得到以下,在src下新建android目錄,把插件的java代碼和引用jar包放在這兒,上面寫的js文件放在www目錄下
然後修改plugin.xml
<?xml version='1.0' encoding='utf-8'?> <plugin id="cordova-plugin-printlc" version="1.0.0" xmlns="http://apache.org/cordova/ns/plugins/1.0" xmlns:android="http://schemas.android.com/apk/res/android"> <name>PrintlcPlugin</name> <js-module name="PrintlcPlugin" src="www/PrintlcPlugin.js"> <clobbers target="cordova.plugins.PrintlcPlugin" /> </js-module> <platform name="android"> <config-file parent="/*" target="res/xml/config.xml"> <feature name="PrintlcPlugin"><param name="android-package" value="org.apache.cordova.printlc.PrintlcPlugin"/></feature> </config-file> <config-file parent="/*" target="AndroidManifest.xml"></config-file> <source-file src="src/android/PrintlcPlugin.java" target-dir="src/org/apache/cordova/printlc"/> <source-file src="src/android/libs/mylibrary-release.aar" target-dir="libs"/> </platform> </plugin>
5、生成package.json這個文件包含我們插件的一些信息
cd到我們插件的根目錄執行plugman create packagejson,一直yes就行。生成的json文件如下
{ "name": "printlcPlugin", "version": "1.0.0", "description": "", "cordova":{ "id":"cordova-plugin-printlc", "paltforms":[ "android" ] }, "main":"index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "moxiaomo", "license": "ISC" }
6、完成上面的步驟後我的打印插件就完成了,測試一下
首先添加插件cordova plugin add cordova-plugin-printlc,添加成功android工程會出現你的js文件和插件java文件,
libs目錄下會自動導入引用的jar包,別忘了在build文件一添加引用jar的引用,另外res\xml\config.xml會添加插件
7、插件調用方式,在HTML中新建幾個按鈕,然後在assets文件下的js目錄新建自己的js,內容如下
function initPrint() { cordova.plugins.PrintlcPlugin.initPrint(function(result){ alert("初始化成功"+result); // 0成功、1失敗 },function(result){ alert("初始化失敗"); }); } function printTest() { cordova.plugins.PrintlcPlugin.printText("123456789",false,1,1,35); // 文本、字符粗細、對齊方式(1、2、3)、字體大小(1、2、3)、濃度(25-39) cordova.plugins.PrintlcPlugin.printQR("123456",4,4,35); // 文本、px(QR Code pixel size n>=1 , n<=24)、Unit(QR Code Unin size 1≤n ≤16)、濃度(25-39) cordova.plugins.PrintlcPlugin.printBarcode("123456"); // 文本、height、width(1-4)、濃度(25-39) cordova.plugins.PrintlcPlugin.printCheckMark();//檢測黑標 printFeedPaper(); cordova.plugins.PrintlcPlugin.startPrint(); // 開始打印 } function closePrint() { cordova.plugins.PrintlcPlugin.closePrint(function(result){ alert("關閉成功"+result);// 0成功、1失敗 },function(result){ alert("關閉失敗"); }); } document.getElementById("btn_init" ).addEventListener("click", initPrint); document.getElementById("btn_test" ).addEventListener("click", printTest); document.getElementById("btn_close" ).addEventListener("click", closePrint);
運行效果
注意不要直接複製我代碼,我所使用的的是專業的打印pda,以上過程僅供參考。