原生安卓集成uniapp后前端uniapp调用原生安卓解读

一、后端准备

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内容,在标签最后添加上自己刚创建的包,name是别名,前端调用通过此名称找到要运行的类

二、前端准备

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位置别引错了





三、打包后复制到安卓端需集成位置重新启动,触发该页面点击事件即可弹出自己传入的参数'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);
			}

 

你可能感兴趣的:(uniapp)