一、后端准备
1、创建一个MainVideoActivity.java类继承StandardFeature(这是demo中的,这里仅仅是换了包名和方法名)
/**
* 前端调用后端接口
* 5+ SDK 扩展插件示例
* 5+ 扩扎插件在使用时需要以下两个地方进行配置
* 1 WebApp的mainfest.json文件的permissions节点下添加JS标识
* 2 assets/data/properties.xml文件添加JS标识和原生类的对应关系
* 本插件对应的JS文件在 assets/apps/H5Plugin/js/test.js
* 本插件对应的使用的HTML assest/apps/H5plugin/index.html
*
* 更详细说明请参考文档http://ask.dcloud.net.cn/article/66
* **/
public class MainVideoActivity extends StandardFeature
{
public void onStart(Context pContext, Bundle pSavedInstanceState, String[] pRuntimeArgs) {
/**
* 如果需要在应用启动时进行初始化,可以继承这个方法,并在properties.xml文件的service节点添加扩展插件的注册即可触发onStart方法
* */
}
public void pluginTestFunction(IWebview pWebview, JSONArray array)
{
// 原生代码中获取JS层传递的参数,
// 参数的获取顺序与JS层传递的顺序一致
// 获取回调ID
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));
// 调用方法将原生代码的执行结果返回给js层并触发相应的JS层回调函数
// 第一个参数是当前函数的入参,直接传入, 第二个是根据入参获取的回调id,第三个是回调的数据,是一个json数组 第三个回调code值 如:OK、ERROR 第四个js层回调function是否要保存
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) {
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;
// 只能返回String类型到JS层。
return JSUtil.wrapJsVar(ReturnValue,true);
}
}
2、修改启动模块中assets/data/dcloud_properties.xml内容,在
二、前端准备
1、根目录创建common/video.js
! function(root, factory) {
if (typeof exports == 'object' && typeof module != 'undefined') {
module.exports = factory()
} else if (typeof define == 'function' && define.amd) {
define(factory)
} else {
document.addEventListener('plusready', function(){
// 修改此处为插件命名 注释---1
var moduleName = 'videojs';
root.plus[moduleName] = factory()
},false);
}
}(this, function() {
//在此处定义自己的方法 注释---2
var _BARCODE = 'videomodule';
var plugintest = {
// 这里定义了一个名叫CalcNameAddNumFunction的方法,传递三个参数,后面两个是回调函数
CalcNameAddNumFunction: function(num, successCallback, errorCallback) {
var success = typeof successCallback !== 'function' ? null : function(args) {
successCallback(args);
},
fail = typeof errorCallback !== 'function' ? null : function(code) {
errorCallback(code);
};
// 注释---3回调ID,后面原生代码中会用到,就好像你调用我,我有结果了,我该知道我把数据返回给谁把?这个id就是这个作用
var callbackID = plus.bridge.callbackId(success, fail);
// 注释---4第一个参数是插件类别名,原生代码中的dcloud_properties.xml文件中会用到第二个参数,是android原生代码中的方法名要一致
return plus.bridge.exec(_BARCODE, "pluginTestFunction", [callbackID, 'args1','args2','args3','args4']);
}
};
return plugintest;
});
2、在自己的页面添加以下内容,注意js位置别引错了
功能
{{title}}
点击调用android原生方法
三、打包后复制到安卓端需集成位置重新启动,触发该页面点击事件即可弹出自己传入的参数'args1','args2','args3','args4',完成
注意里面的参数videojs(自定义插件js名,共三处),videomodule(和第一步的name名称对应)参数,pluginTestFunction(安卓端方法名)
扩展:1、activity跳转
Intent intent = new Intent(getDPluginContext(), DialerActivity.class);
pWebview.getActivity().startActivityForResult(intent, 1);
2、前端启动后端activity
call1() {
//获取宿主上下文
var main = plus.android.runtimeMainActivity();
//通过反射获取Android的Intent对象
var Intent = plus.android.importClass("android.content.Intent");
//通过宿主上下文创建 intent
var intent = new Intent(main.getIntent());
//设置要开启的Activity包类路径 com.HBuilder.integrate.MainActivity换掉你自己的界面
intent.setClassName(main, "io.agora.openduo.activities.DialerActivity");
//开启新的任务栈 (跨进程)
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//开启新的界面
main.startActivity(intent);
}