前陣子公司接了一個android打印機的項目,使用cordova打包出來的app調用開發商提供的硬件。java
可是開發商只提供了android相關的接口,公司也沒有Android程序員。android
只能讓我這個之前作過cordova項目的半吊子從新研究cordova項目插件開發。程序員
一、cordova的android插件本質上使用的仍是android,只是提供的是js的調用方法。apache
因此拿到原生android的Activity以後,只需新建java繼承CordovaPlugin並稍做修改便可。npm
原Activity:app
public class MainActivity extends AppCompatActivity { private static final String LOG_TAG = MainActivity.class.getSimpleName(); private UsbPrinter mUsbPrinter; private class MyThread extends Thread { @Override public void run() { mUsbPrinter = new UsbPrinter(getApplicationContext()); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mUsbPrinter = new UsbPrinter(getApplicationContext()); findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final UsbDevice dev = getCorrectDevice(); if (dev != null && mUsbPrinter.open(dev)) { final long stat1 = mUsbPrinter.getStatus(); final long stat2 = mUsbPrinter.getStatus2(); mUsbPrinter.close(); ((TextView) findViewById(R.id.textView)).setText(String.format("%04XH, %04XH", stat1, stat2)); } } }); findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final UsbDevice dev = getCorrectDevice(); if (dev != null && mUsbPrinter.open(dev)) { mUsbPrinter.init(); mUsbPrinter.doFunction(Const.TX_FONT_ULINE, Const.TX_ON, 0); mUsbPrinter.outputStringLn("This is Font A with underline."); mUsbPrinter.doFunction(Const.TX_SEL_FONT, Const.TX_FONT_B, 0); mUsbPrinter.doFunction(Const.TX_FONT_ULINE, Const.TX_OFF, 0); mUsbPrinter.doFunction(Const.TX_FONT_BOLD, Const.TX_ON, 0); mUsbPrinter.outputStringLn("This is Font B with bold."); mUsbPrinter.resetFont(); mUsbPrinter.doFunction(Const.TX_ALIGN, Const.TX_ALIGN_CENTER, 0); mUsbPrinter.outputStringLn("center"); mUsbPrinter.doFunction(Const.TX_ALIGN, Const.TX_ALIGN_RIGHT, 0); mUsbPrinter.outputStringLn("right"); mUsbPrinter.doFunction(Const.TX_ALIGN, Const.TX_ALIGN_LEFT, 0); mUsbPrinter.doFunction(Const.TX_FONT_ROTATE, Const.TX_ON, 0); mUsbPrinter.outputStringLn("left & rotating"); mUsbPrinter.resetFont(); mUsbPrinter.doFunction(Const.TX_CHINESE_MODE, Const.TX_ON, 0); mUsbPrinter.outputStringLn("中文"); mUsbPrinter.doFunction(Const.TX_FONT_SIZE, Const.TX_SIZE_3X, Const.TX_SIZE_2X); mUsbPrinter.doFunction(Const.TX_UNIT_TYPE, Const.TX_UNIT_MM, 0); mUsbPrinter.doFunction(Const.TX_HOR_POS, 20, 0); mUsbPrinter.outputStringLn("放大Abc"); mUsbPrinter.resetFont(); mUsbPrinter.doFunction(Const.TX_FEED, 30, 0); mUsbPrinter.outputStringLn("feed 30mm"); mUsbPrinter.doFunction(Const.TX_BARCODE_HEIGHT, 15, 0); mUsbPrinter.printBarcode(Const.TX_BAR_UPCA, "12345678901"); //mUsbPrinter.printImage("/storage/sdcard0/a1.png"); mUsbPrinter.printImage(getExternalFilesDir(null).getPath()+"/../../../../a1.png"); mUsbPrinter.doFunction(Const.TX_UNIT_TYPE, Const.TX_UNIT_PIXEL, 0); mUsbPrinter.doFunction(Const.TX_FEED, 140, 0); mUsbPrinter.doFunction(Const.TX_CUT, Const.TX_CUT_FULL, 0); mUsbPrinter.close(); } } }); } private UsbDevice getCorrectDevice() { final UsbManager usbMgr = (UsbManager)getSystemService(Context.USB_SERVICE); final Map<String, UsbDevice> devMap = usbMgr.getDeviceList(); for(String name : devMap.keySet()) { Log.v(LOG_TAG, "check device: " + name); if (UsbPrinter.checkPrinter(devMap.get(name))) return devMap.get(name); } return null; } }
修改後的MUsbPrinter.java:ide
public class MUsbPrinter extends CordovaPlugin { private UsbPrinter mUsbPrinter; private CallbackContext callbackContext; private JSONObject params; /* private class MyThread extends Thread { @Override public void run() { mUsbPrinter = new UsbPrinter(getApplicationContext()); } }*/ @Override public boolean execute(String action, final JSONArray args, final CallbackContext callbackContext) throws JSONException { this.callbackContext = callbackContext; this.params = args.getJSONObject(0); //獲取打印機狀態事件 if (action.equals("getState")) { final UsbDevice dev = getCorrectDevice(); if (dev != null && mUsbPrinter.open(dev)) { final long stat1 = mUsbPrinter.getStatus(); final long stat2 = mUsbPrinter.getStatus2(); mUsbPrinter.close(); callbackContext.success(String.format("%04XH, %04XH", stat1, stat2)); } } //打印小票事件 if (action.equals("printTicket")) { // TODO 打印前須要檢查打印機狀態 final UsbDevice dev = getCorrectDevice(); if (dev != null && mUsbPrinter.open(dev)) { mUsbPrinter.init(); //擡頭圖片 mUsbPrinter.printImage(cordova.getActivity().getExternalFilesDir(null).getPath()+"../res/vopakTicket.png"); /** * 業務內容 */ mUsbPrinter.doFunction(Const.TX_UNIT_TYPE, Const.TX_UNIT_PIXEL, 0); mUsbPrinter.doFunction(Const.TX_FEED, 140, 0); mUsbPrinter.doFunction(Const.TX_CUT, Const.TX_CUT_FULL, 0); mUsbPrinter.close(); } } return true; } private UsbDevice getCorrectDevice() { final UsbManager usbMgr = (UsbManager)cordova.getActivity().getSystemService(Context.USB_SERVICE); final Map<String, UsbDevice> devMap = usbMgr.getDeviceList(); for(String name : devMap.keySet()) { if (UsbPrinter.checkPrinter(devMap.get(name))) return devMap.get(name); } return null; } }
二、使用plugman工具修改項目。工具
安裝gradle
npm install -g plugman
新建插件目錄ui
plugman create --name musbprinter --plugin_id cordova-plugin-musbprinter --plugin_version 1.0.0
--name:插件名稱 --plugin_id:插件名稱(plugin.xml中定義的id) --plugin_version:插件版本
生成的文件結構:
三、在src下新建android文件夾,將上面修改好的java文件放入。
若是有原生aar文件,則也將它放入到android目錄下。
printlib.gradle:
repositories{ jcenter() flatDir { dirs 'src/main/libs' } } dependencies { compile(name:'printlib', ext:'aar') } android { packagingOptions { exclude 'META-INF/NOTICE' exclude 'META-INF/LICENSE' } }
www下的musbprinter.js文件爲cordova混合開發中提供給js的調用方法文件,內容以下:
var exec = require('cordova/exec'); /** * 獲取打印機狀態 * @param arg0 * @param success * @param error */ exports.getState = function (arg0, success, error) { if (!arg0) { arg0 = {}; } exec(success, error, 'MUsbPrinter', 'getState', [arg0]); }; /** * 打印小票 * @param arg0 * @param success * @param error */ exports.printTicket = function (arg0, success, error) { if (!arg0) { arg0 = {}; } exec(success, error, 'MUsbPrinter', 'printTicket', [arg0]); };
最後配置plugin.xml文件<?xml version='1.0' encoding='utf-8'?>
<plugin id="cordova-plugin-musbprinter" version="1.0.0" xmlns="http://apache.org/cordova/ns/plugins/1.0" xmlns:android="http://schemas.android.com/apk/res/android"> <name>musbprinter</name> <description> 安卓嵌入式打印機 </description> <!-- js調用 --> <js-module name="MUsbPrinter" src="www/musbprinter.js"> <clobbers target="MUsbPrinter" /> </js-module> <!-- android --> <platform name="android"> <!-- arr引用 --> <resource-file src="src/android/printlib.aar" target="libs/printlib.aar" /> <framework src="src/android/printlib.gradle" custom="true" type="gradleReference" /> <!-- 業務類指定 --> <config-file target="res/xml/config.xml" parent="/*"> <feature name="MUsbPrinter"> <param name="android-package" value="com.ourway.musbprinter.MUsbPrinter"/> </feature> </config-file> <!-- 須要的android權限 --> <config-file target="AndroidManifest.xml" parent="/manifest"> <uses-feature android:name="android.hardware.usb.host" android:required="false" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> </config-file> <config-file parent="/*" target="AndroidManifest.xml"> </config-file> <source-file src="src/android/MUsbPrinter.java" target-dir="src/android" /> </platform> </plugin>
至此,android插件轉cordova插件開發完成。
四、將cordova插件添加到cordova項目中並打包
cordova plugin add C:\Users\David\cordova-plugin-musbprinter
添加android平臺
cordova platform add android
編譯
cordova build android
過程當中未報錯即爲正常。