Android 插件开发, 如何扩展第三方SDK
Android 插件开发, 是在离线打包应用的基础上扩展的, 当Dcolud官方提供的在线打包功能,不能满足我们功能需求时,此时我们只能通过离线打包应用,来达到扩展功能的目的。
学会插件开发,是进行扩展第三方SDK功能,很重要的一个环节。
插件开发的前提: 1.首先要 学会离线打包APP 2. 懂些原生APP 开发知识
HTML5+ 插件 ,原理是: html页面 调用 或传值 给原生APP 页面, 然后原生APP页面 返回 数据 给 html 页面,达到某些功能实现的效果。
要实现插件调用原生APP 功能,目前有两种方式: 1. Native.js , 2. 开发者创建的扩展插件类应当继承自“StandardFeature”类实现第三方插件扩展.
第一种方式:Native.js
Native.js for Android封装一条通过JS语法直接调用Native Java接口通道,通过plus.android可调用几乎所有的系统API。
例如:
1. 你要打开一个 ,自己创建的安卓原生页面,假如是:dome.java , js 可以这样写
var main = plus.android.runtimeMainActivity();
var Intent = plus.android.importClass("android.content.Intent");
var intent = new Intent(main.getIntent());
intent.setClassName(main,"com.text.text.dome");
main.startActivity(intent);
2. 如果你要JS 传值给原生APP 页面 ,打开一个页面并传值给它,通过 intent.putExtra 方法传值。
var main = plus.android.runtimeMainActivity();
var Intent = plus.android.importClass("android.content.Intent");
var intent = new Intent(main.getIntent());
intent.setClassName(main,"com.text.text.dome");
intent.putExtra("data","你好");
main.startActivity(intent);
安卓原生页面,接收值
Intent intent = this.getIntent();
String data= intent.getCharSequenceExtra("data").toString();
3. 打开一个页面,传值给原生页面,并且原生页面返回数据给 html 页面 ,采用 onActivityResult 的方法, js 可以这样写
var main = plus.android.runtimeMainActivity();
var Intent = plus.android.importClass("android.content.Intent");
var intent = new Intent(main.getIntent());
intent.setClassName(main,"com.text.text.dome");
intent.putExtra("data","你好");
main.onActivityResult = function(requestCode, resultCode, data)
{
if(requestCode!="1001")
{ return; }
plus.android.importClass(data);
var bundle=data.getExtras();
plus.android.importClass(bundle);
var name=bundle.getString("name");
var sex=bundle.getString("sex");
}
main.startActivityForResult(intent,1001);
原生APP 页面 onActivityResult 返回的方法这样写
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
Intent intent=new Intent();
if(requestCode ==REQUEST_CODE_RECORD_VIDEO)
{
if(resultCode == Activity.RESULT_OK && data!= null)
{
intent.putExtra("name","张三");
intent.putExtra("sex","19");
}
}
setResult(RESULT_OK,intent);
}
第二种方式: 开发者创建的扩展插件类应当继承自“StandardFeature”类实现第三方插件扩展
第一步:创建一个原生类,继续 StandardFeature 方法 , 引入插件类
import io.dcloud.common.DHInterface.IWebview;
import io.dcloud.common.DHInterface.StandardFeature;
import io.dcloud.common.util.JSUtil;
原生类
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;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
public class PGPlugintest extends StandardFeature
{
public void onStart(Context pContext, Bundle pSavedInstanceState, String[] pRuntimeArgs) {
/**
* 如果需要在应用启动时进行初始化,可以继承这个方法,并在properties.xml文件的service节点添加扩展插件的注册即可触发onStart方法
* */
}
public void PluginTestFunction(IWebview pWebview, JSONArray array)
{
// 原生代码中获取JS层传递的参数,
// 参数的获取顺序与JS层传递的顺序一致
String CallBackID = array.optString(0);
JSONArray newArray = new JSONArray();
newArray.put(array.optString(1));
// 调用方法将原生代码的执行结果返回给js层并触发相应的JS层回调函数
JSUtil.execCallback(pWebview, CallBackID, newArray, JSUtil.OK, false);
}
}
第二步: properties.xml 配置该插件的使用权限,例如
<feature name="PGPlugintest" value="com.text.txt.PGPlugintest"/>
manifest.json文件中还需要添加扩展插件的应用使用权限
"permissions": {
"PGPlugintest": {
"description": "插件说明"
}
}
第三步:js 调用
document.addEventListener( "plusready", function()
{
var _BARCODE = 'PGPlugintest',
B = window.plus.bridge;
var PGPlugintest=
{
PluginTestFunction : function (Argus1,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, "PluginTestFunction", [callbackID, Argus1]);
}
};
window.plus.PGPlugintest=PGPlugintest;
}, true );
js, 调用该方法,可以传值给原生类,原生类并且返回数据
plus.PGPlugintest.PluginTestFunction("Html5",
function( result )
{
alert(result[0]);
}
,
function(result)
{
alert(result)
});
加载更多