经过前几次的文章,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 block
e.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 block
e1.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]);
},
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() {
@Override
public void onSuccess(int arg0, String arg1) {
Log.d("tag", "arg0:" + arg0 + ",arg1:" + arg1 + "配网成功");
ReturnValue="设备连接wifi成功,开始搜索设备";
}
@Override
public 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类中的对应关系。