经过前几次的文章,app基本成型。运行在手机里应该就能正常使用了。
那么如何引用第三方sdk呢? 难道在hbuilder里面弄个文件夹放jar包么?
显然不是。dcloud本省有集成了部分sdk 但是大部分并没有。与apicloud相比,内置sdk的组件太少了。我的同事用apicloud直接引用apicloud官方提供的模板很快就能把功能实现。dcloud里你要是使用官方没集成的sdk就只能“手动打包”。
什么叫“手动打包”?
意思是,你在Android的IDE工具里面创建一个空的项目,并将hbuilder里面的项目添加到IDE中的项目中。同时你还要手动写“扩展js接口”。
在你手动打包时建议你先仔细阅读下官方的文档5+SDK插件开发
第一步:在IDE中建立一个空的项目,我用的是eclipse 如果你是Android studio 你也可以去百度找教程。
第二步:导入hbuilder项目进IDE 教程可以参考这个文档Android离线打包
你要在assets 文件夹下新建app文件夹 再建一个以hbuilder里面manifest.json中appid为名称的文件夹。然后将hbuilder里面的css,js和fonts,还有html页面一并扔进去
具体的操作看这片文档会说的比较好hbuilder打包 别忘了这篇文档中该改的地方都改掉
第三步:根据你自己项目的需求 添加权限,第三方jar包。将不需要的权限和资源删除,如果你不知道是否需要,那就别删了
第四步:新建一个js文件 用作第三方插件的与Android交互的桥梁。官方文档的那个一大长串js 可以直接复制
document.addEventListener( "plusready", function()
{
// 声明的JS“扩展插件别名”var _BARCODE = 'plugintest',B = window.plus.bridge;var plugintest =
{
// 声明异步返回方法PluginTestFunction : function (Argus1, Argus2, Argus3, Argus4, successCallback, errorCallback ) {var success = typeof successCallback !== 'function' ? null : function(args) {successCallback(args);},fail = typeof errorCallback !== 'function' ? null : function(code) {errorCallback(code);};callbackID = B.callbackId(success, fail);
// 通知Native层plugintest扩展插件运行”PluginTestFunction”方法return B.exec(_BARCODE, "PluginTestFunction", [callbackID, Argus1, Argus2, Argus3, Argus4]);},PluginTestFunctionArrayArgu : function (Argus, successCallback, errorCallback ) {var success = typeof successCallback !== 'function' ? null : function(args) {successCallback(args);},fail = typeof errorCallback !== 'function' ? null : function(code) {errorCallback(code);};callbackID = B.callbackId(success, fail);return B.exec(_BARCODE, "PluginTestFunctionArrayArgu", [callbackID, Argus]);}, // 声明同步返回方法PluginTestFunctionSync : function (Argus1, Argus2, Argus3, Argus4) { // 通知Native层plugintest扩展插件运行“PluginTestFunctionSync”方法并同步返回结果 return B.execSync(_BARCODE, "PluginTestFunctionSync", [Argus1, Argus2, Argus3, Argus4]);},PluginTestFunctionSyncArrayArgu : function (Argus) { return B.execSync(_BARCODE, "PluginTestFunctionSyncArrayArgu", [Argus]);}};window.plus.plugintest = plugintest;
}, true );第五步:Android项目中新建一个类
这个类你可以按照官方文档里使用旧接口或者新接口,随你。我是用的新接口
package com.example.H5PlusPlugin;
import io.dcloud.common.DHInterface.IWebview;
import io.dcloud.common.DHInterface.StandardFeature;
import io.dcloud.common.util.JSUtil;import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;public class PGPlugintest extends StandardFeature
{ public void PluginTestFunction(IWebview pWebview, JSONArray array){String CallBackID = array.optString(0);JSONArray newArray = new JSONArray();newArray.put(array.optString(1));newArray.put(array.optString(2));newArray.put(array.optString(3));newArray.put(array.optString(4));JSUtil.execCallback(pWebview, CallBackID, newArray, JSUtil.OK, false);}public void PluginTestFunctionArrayArgu(IWebview pWebview, JSONArray array){String ReturnString = null;String CallBackID = array.optString(0);JSONArray newArray = null;try {newArray = new JSONArray( array.optString(1)); String inValue1 = newArray.getString(0);String inValue2 = newArray.getString(1);String inValue3 = newArray.getString(2);String inValue4 = newArray.getString(3);ReturnString = inValue1 + "-" + inValue2 + "-" + inValue3 + "-" + inValue4;} catch (JSONException e) {// TODO Auto-generated catch blocke.printStackTrace();}JSUtil.execCallback(pWebview, CallBackID, ReturnString, JSUtil.OK, false);}public String PluginTestFunctionSyncArrayArgu(IWebview pWebview, JSONArray array){JSONArray newArray = null;JSONObject retJSONObj = null;try {newArray = array.optJSONArray(0);String inValue1 = newArray.getString(0);String inValue2 = newArray.getString(1);String inValue3 = newArray.getString(2);String inValue4 = newArray.getString(3);retJSONObj = new JSONObject();retJSONObj.putOpt("RetArgu1", inValue1);retJSONObj.putOpt("RetArgu2", inValue2);retJSONObj.putOpt("RetArgu3", inValue3);retJSONObj.putOpt("RetArgu4", inValue4);} catch (JSONException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} return JSUtil.wrapJsVar(retJSONObj);}public String PluginTestFunctionSync(IWebview pWebview, JSONArray array){String inValue1 = array.optString(0);String inValue2 = array.optString(1);String inValue3 = array.optString(2);String inValue4 = array.optString(3);String ReturnValue = inValue1 + "-" + inValue2 + "-" + inValue3 + "-" + inValue4;return JSUtil.wrapJsVar(ReturnValue,true);}}注意这个java类和js里面的方法名称是相同的,意思就是当你在html里面请求方法A,那么A必须在js类中有声明,java类中有实现。java类中写具体的业务操作。return返回值可以根据你的业务进行修改,无论是string或是jsonarray返回类型。附上我DIY的代码
js:
EasyLinkDeviceConnectWifi:function (Argus1, Argus2, Argus3 ) {// 通知Native层plugintest扩展插件运行“NewEasyLinkDeviceConnectWifi”方法并同步返回结果 return B.execSync(_BARCODE, "EasyLinkDeviceConnectWifi", [Argus1, Argus2, Argus3]);},
java:这里面调用的easylink的jar包中的方法。你需要根据你的需求进行更改。
public String EasyLinkDeviceConnectWifi(IWebview pWebview, JSONArray array) {Date curDate = new Date(System.currentTimeMillis());EasyLinkParams params = new EasyLinkParams();params.ssid = array.optString(0);params.password = array.optString(1);params.isSendIP = false;params.runSecond = 2000;params.sleeptime = 20;params.extraData = null; EasyLink easy = new EasyLink(pWebview.getActivity());easy.startEasyLink(params, new EasyLinkCallBack() {@Overridepublic void onSuccess(int arg0, String arg1) {Log.d("tag", "arg0:" + arg0 + ",arg1:" + arg1 + "配网成功");ReturnValue="设备连接wifi成功,开始搜索设备";}@Overridepublic void onFailure(int arg0, String arg1) {Log.d("tag", "arg0:" + arg0 + ",arg1:" + arg1 + "配网失败");ReturnValue="配网失败,请重新操作";}});Date endDate = new Date(System.currentTimeMillis());Log.d("gap",Long.toString(endDate.getTime() - curDate.getTime()));return JSUtil.wrapJsVar(ReturnValue,true);}第六步:当你写完所有的业务后,就可以进行调试了。Android调试我就不说了。剩下的就是到处apk了。
总结:dcloud总体来说是个好东西,但是文档并不友好,开发者需要耐心钻研。引入项目的时候注意该加的加,该改的改,该删的删,一定要仔细。打包的时候要注意js扩展文件和java类中的对应关系。














