前言

   现在phonegap虽然提供了很多中插件API,但难免会不够全,不够满足我们的需求!这时候我们就可以通过自己编写插件来完善这些功能。


   phonegap的插件主要分两部分:一部分是前台页面js调用插件的接口,还有一部分就是后台做的处理。


下面我以我写的一个删除文件功能为例,先来看前台js代码:

removefile : function(path,cb){
    //定义插件删除方法
    window.deletebook = function(path, callback) {
        //自定义插件的核心
        cordova.exec(callback, function(err) {
            callback('Nothing to echo.');
        }, "MyEcho", "deletebook", [path]);
    };
    //调用插件删除方法
    document.addEventListener("deviceready", onDeviceReady, false);
    function onDeviceReady() {
        window.deletebook(path, function(echoValue) {
            //console.log(echoValue + " success");
            if(echoValue == "true"){
                cb();
            }
        });
    }
}

插件的核心在于cordova.exec(successCB,failedCB,pluginName,action,data);

这个函数中五个参数分别为:

successCB 调用成功后的回调函数

failedCB 调用失败后的回调函数

pluginName 插件名

action 插件方法

data 调用插件向后台传递的参数,格式为数组


接下来我们来看一下后台的代码:

package org.apache.cordova;
import org.apache.cordova.api.CallbackContext;
import org.apache.cordova.api.CordovaPlugin;
import org.join.messenger.MessageCode;
import org.json.JSONArray;
import org.json.JSONException;
import android.os.Bundle;
import com.lemote.ebook.Ebook;
public class MyEcho extends CordovaPlugin {
    @Override
    public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
        System.out.println("================action:"+action);
        if(action.equals("deletebook")){
            System.out.println("deletebook!");
            String filepath = args.getString(0);
            String returninfo = "false";
            String whole_filepath = "/mnt/sdcard/"+filepath;
            System.out.println("whole_filepath:"+whole_filepath);
            if(MyFileUtil.removeFile(whole_filepath)){
                System.out.println("删除成功!");
                returninfo = "true";
            }
            this.echo(returninfo, callbackContext);
            return true;
        }
        return false;
    }
    //调用回调函数,返回成功
    private void echo(String message, CallbackContext callbackContext) {
        if (message != null && message.length() > 0) {
            callbackContext.success(message);
        } else {
            callbackContext.error("Expected one non-empty string argument.");
        }
    }
}

execute(String action, JSONArray args, CallbackContext callbackContext)中三个参数分别为:

   action 插件方法

   args 传递过来的参数,获取方法为args.getString(数组中的位置);

callbackContext 回调函数

回调成功的函数callbackContext.success(message)

回调失败的函数callbackContext.error(message)


除了前台js接口和后台方法,还有一个非常重要的就是串联前后台的东西:

res/xml/config.xml中加入如下代码:

<plugin name="MyEcho" value="org.apache.cordova.MyEcho" />

"MyEcho"为前台js调用的pluginName

"org.apache.cordova.MyEcho"为插件在后台的类文件


这样phonegap插件还做不到的就可以通过自己编写java代码来实现了!