Dcloud开发引用第三方sdk的app小程序扫盲---使用第三方sdk并且打包

经过前几次的文章,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]);
        },

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() {
			@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类中的对应关系。



你可能感兴趣的:(Dcloud开发引用第三方sdk的app小程序扫盲---使用第三方sdk并且打包)