http://ask.dcloud.net.cn/docs/#http://ask.dcloud.net.cn/article/66
开发文档的链接
首先官方文档这方面描述的不太清楚,走了不少弯路,下面的评论很重要!!!
此外提醒下官方Android-SDK下的HBuilder-Integrate项目里有一个小demo,com.example.H5PlusPlugn+assets/H5Plugin;可以跟着看看。
下面记录下几个主要的要点;
1.写原生的Android代码,首先这部分需要把HBuilder-Integrate项目中的库文件so文件等拷贝过来,需要用到里面的包;我是直接在这个项目做的扩展插件;打包的时候把src里不是的代码java删掉即可。此外这部分主要注意资源文件的获取,有两种方案。
第一种资源用以下方式获取
public static int getIdByName(Context context, String className, String name) {
String packageName = context.getPackageName();
Class r = null;
int id = 0;
try {
r = Class.forName(packageName + ".R");
Class[] classes = r.getClasses();
Class desireClass = null;
for (int i = 0; i < classes.length; ++i) {
if (classes[i].getName().split("\\$")[1].equals(className)) {
desireClass = classes[i];
break;
}
}
if (desireClass != null)
id = desireClass.getField(name).getInt(desireClass);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
return id;
}
第二种,按照平时的方法获取但是要在io.dcloud.RInformation.java里声明
2.打包成jar文件(export-java-jar文件;只需打包src下的即可)。
将原生的代码中用的png图片、xml布局文件导入项目;同时声明使用到的权限
1.mainfest.json与assets/data/properties.xml中的注册声明
"twotest"
value="com.example.H5PlusPlugin.TwoDemo" />
"twotest": {
"description": "Two test"
}
2.层层调用
html中的调用
plus.twotest.PluginTestFunctionArrayArgu( [["11000001","2016-11-1 10:10:10"],["11000002","2016-11-1 10:10:10"],["11000003","2016-11-1 10:10:10"],["11000004","2016-11-1 10:10:10"]],15, function( result ) {alert( result );},function(result){alert(result)});
js中实现该方法,注意twotest字段,跟前面注册声明的需一致
document.addEventListener( "plusready", function()
{
var _BARCODE = 'twotest',
B = window.plus.bridge;
var twotest =
{
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]);
}
};
window.plus.twotest = twotest;
}, true );
原生java文件,继承StandardFeature,实现PluginTestFunctionArrayArgu 方法
/**
*
*/
package com.example.H5PlusPlugin;
import org.json.JSONArray;
import org.json.JSONException;
import com.mining.app.zxing.mqr_codescan.MipcaActivityCapture;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import io.dcloud.common.DHInterface.IWebview;
import io.dcloud.common.DHInterface.StandardFeature;
import io.dcloud.common.util.JSUtil;
/**
* @author Administrator
*
*/
public class TwoDemo extends StandardFeature{
/**
* @Title: onStart
* @Description: TODO
* @param @param arg0
* @param @param arg1
* @param @param arg2
* @throws
*/
@Override
public void onStart(Context arg0, Bundle arg1, String[] arg2) {
// TODO Auto-generated method stub
super.onStart(arg0, arg1, arg2);
}
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);
}
}
最后把我写的demo放上来。是一个扫码功能的扩展