提示:如有疑问可以加QQ: 2564034335 , 或者 QQ 群: 891416757
该文章或问题已被删除

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)
});

 

点赞 2      收藏 0

0 个评论

正在加载...

这里空空如也,快来补一刀!

加载更多

回答问题或评论文章请先 或者 注册