• cordova插件开发


    目标:写一个可以让别人通过命令安装的android平台的cordova插件
    步骤:
    1、准备一个cordova项目导入到eclipse中(为了方便安装插件可以把cordova项目中的platform做为eclipse的工作空间,如果不懂可以看这里如何将cordova项目的platform作为eclipse的工作空间

    一、创建空白的cordova项目

     

    1、到你想创建项目的目录下,打开黑窗口

     

    cordova create hello com.example.hello HelloWorld

    hello:项目目录名

    com.exmple.hello:项目包名

    HelloWorld:应用的名字

    2、cd到刚才创建的目录hello下,添加android平台

    cd hello

    cordova platform add android

     

     

    2、准备一个干净的插件
    plugman create --name SaveDataPlugin --plugin_id cordova-myplugin-savedata --plugin_version 1.0.0 
    SaveDataPlugin:插件名
    cordova-myplugin-savedata<span style="color: rgb(51, 51, 51); line-height: 22.8571px; font-family: Helvetica, 'Hiragino Sans GB', 微软雅黑, 'Microsoft YaHei UI', SimSun, SimHei, arial, sans-serif;">:插件id</span>
    新插件的目录结构
    PluginB
        |--src 
            |--
        |--www
            |--pluginb.js
        |--plugin.xml
    plugin.xml代码
    <?xml version='1.0' encoding='utf-8'?>
    <plugin id="cordova-myplugin-savedata" version="1.0.0" xmlns="http://apache.org/cordova/ns/plugins/1.0" xmlns:android="http://schemas.android.com/apk/res/android">
        <!--插件名-->
    	<name>SaveDataPlugin</name>
    	<!--这里的js-module的name属性无所谓,起什么名字都可以,为了区别插件名,起一个其他名字。src属性是插件js文件所在的路径,-->
        <js-module name="MyPlugin_SaveData" src="www/SaveDataPlugin.js">
    	<!--clobbers标签的target属性则对应您在js调用该插件所用到的名称,比如target名字为cordova.plugins.ExtraInfo,则后面肯定是cordova.plugins.SaveDataPlugin.js定义的方法名字
    	 来进行调用-->
            <clobbers target="cordova.plugins.SaveDataPlugin" />
        </js-module>
    </plugin>



    3、在本地修改插件plugin.xml,以及添加java文件
    修改插件plugin.xml
    <?xml version='1.0' encoding='utf-8'?>
    <plugin id="cordova-myplugin-savedata" version="1.0.0" xmlns="http://apache.org/cordova/ns/plugins/1.0" xmlns:android="http://schemas.android.com/apk/res/android">
        <!--插件名-->
        <name>SaveDataPlugin</name>
        <!--这里的js-module的name属性无所谓,起什么名字都可以,为了区别插件名起一个其他名字,这个会决定cordova.define("cordova-myplugin-savedata.MyPlugin_SaveData"。src属性是插件js文件所在的路径,-->
        <js-module name="MyPlugin_SaveData" src="www/SaveDataPlugin.js">
            <!--clobbers标签的target属性则对应您在js调用该插件所用到的名称,比如target名字为cordova.plugins.SaveDataPlugin,则后面肯定是cordova.plugins.SaveDataPlugin.js定义的方法名字
             来进行调用-->
            <clobbers target="cordova.plugins.SaveDataPlugin" />
        </js-module>
    
        <platform name="android">
            <!--这里是插件的配置信息,最后会添加到 res/xml/config.xml 文件中-->
            <config-file target="res/xml/config.xml" parent="/*">
                <!--注意这里的name要和插件js文件中调用exec方法中所调用的插件名字一致,不然肯定会出问题-->
                <feature name="SaveDataPlugin">
                    <!--value:com.plugins.savedataplugin SaveDataPlugin 插件java文件名,插件的包名和插件的id不是一回事,虽然后有时候默认用插件id做包名-->
                    <param name="android-package" value="com.plugins.savedataplugin.SaveDataPlugin" />
                    <param name="onload" value="true" />
                </feature>
            </config-file>
            <!--将插件src/android目录下的PluginB复制到项目的src/com/plugins/savedataplugin目录下-->
            <source-file src="src/android/SaveDataPlugin.java" target-dir="src/com/plugins/savedataplugin" />
        </platform>
    </plugin>
    添加插件的java文件
    新建一个PluginB.java的文件放在插件的src目录下就可以,具体的代码可以在导入eclipse后再写。
    4、将插件通过命令安装到项目中并执行prepare
     
    plugman install --platform android --project platformsandroid --plugin ../PluginsDIY/SaveDataPlugin、
    对于项目来说的改变
    改变1:项目中添加了插件的java文件
     
    改变2:项目的platform_www目录下添加了插件的js文件
     
    改变3:项目的platform_www目录下的cordova_plugin.js发生了改变
     
    改变4:项目res目录下的xml目录下的config.xml文件发生了改变
    执行cordova prepare android命令对于项目来说的改变
    只改变了一个地方,就是将assets目录下的www清空,重新将里面的文件从别的地方复制了一遍,两个地方:
    1、cordova项目本地目录中的www文件下的所有文件
    2、项目目录platform_www下的所有文件
    这样就把刚才安装插件引起的plugins目录和corodova_plugin.js的变化都更新了
    做完上面的操作,你的插件在项目中就可以看到了,只不过还没有任何用能,因为java代码和js代码 还没写
    ------------------------------------------------------------------------------------------------------------------------------------------
    5、根据功能修改插件的java代码和js代码
    java代码:
    [java] view plain copy
    public class PluginB extends CordovaPlugin {  
        private Context context;  
      
        public void initialize(CordovaInterface cordova, CordovaWebView webView) {  
            super.initialize(cordova, webView);  
            //获取context  
            context = this.cordova.getActivity().getApplicationContext();  
        }  
      
        @Override  
        public boolean execute(String action, final CordovaArgs args,  
                CallbackContext callbackContext) throws JSONException {  
            //  
            if ("save".equals(action)) {  
                cordova.getThreadPool().execute(new Runnable() {  
                    public void run() {  
                        String key = args.optString(0);  
                        String value = args.optString(1);  
                        saveData(key, value);  
                    }  
                });  
            } else if ("get".equals(action)) {  
                String key = args.optString(0);  
                String values = this.getString(context, key, "");  
                callbackContext.success(values);  
            }  
            return true;  
        }  
      
        private void saveData(String key, String value) {  
            this.putString(context, key, value);  
        }  
      
        public static final String FILE_NAME = "share_data";  
        public static SharedPreferences sp;  
      
        /** 
         * 每次使用工具类的时候,首先判断是不是已经有sp对象了,如果有了就不用再次创建了。 
         *  
         * @param context 
         * @return 
         */  
        private static SharedPreferences getPreferences(Context context) {  
            if (sp == null) {  
                sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);  
            }  
            return sp;  
        }  
      
        /** 
         * 保存key value值 
         *  
         * @param context 
         * @param key 
         * @param value 
         */  
        public static void putString(Context context, String key, String value) {  
            SharedPreferences sp = getPreferences(context);  
            sp.edit().putString(key, value).commit();  
        }  
      
        /** 
         * 根据key值获取value 
         *  
         * @param context 
         * @param key 
         * @param defValue 
         * @return 
         */  
        public static String getString(Context context, String key, String defValue) {  
            String value = getPreferences(context).getString(key, defValue);  
            return value;  
        }  
    }  
    js代码:
    cordova.define("cordova-myplugin-savedata.MyPlugin_SaveData", function(require, exports, module) {
    var exec = require('cordova/exec');
     
    function SaveData(){};
     
    SaveData.prototype.save = function(key,value,success, error){
        exec(success, error, "SaveDataPlugin", "save", [key,value]);
    };
     
    SaveData.prototype.get = function(key,success, error){
        exec(success, error, "SaveDataPlugin", "get", [key]);
    };
     
    var woyuanyi = new SaveData();
    module.exports = woyuanyi; 
     
    });
     
    6、测试没问题后,将java文件复制到插件的src/android目录下,将j下面的代码复制到插件的www目录下的js文件中
    var exec = require('cordova/exec');
     
    function SaveData(){};
     
    SaveData.prototype.save = function(key,value,success, error){
        exec(success, error, "SaveDataPlugin", "save", [key,value]);
    };
     
    SaveData.prototype.get = function(key,success, error){
        exec(success, error, "SaveDataPlugin", "get", [key]);
    };
     
    var woyuanyi = new SaveData();
    module.exports = woyuanyi; 
     
    这样插件就写完了,如果想测试可以在index.html
    <pre name="code" class="html"><html>
    <head>
    </head>
    <!--cordova.js必须引入-->
    <script type="text/javascript" src="cordova.js"></script>
    <script>
        function save(){
            var key=document.getElementById("key").value;
            var value=document.getElementById("value").value;
            alert(key);
            alert(value);
            cordova.plugins.SaveDataPlugin.save(key,value,
                    function(result){
                        console.log(result);
                    },
                    function(error){
                        console.log(error);
                    }
            );
        };
    
        function get(){
            var key=document.getElementById("yourKey").value;
            cordova.plugins.SaveDataPlugin.get(key,
                    function(result){
                        alert(result);
                    },
                    function(error){
                        console.log(error);
                    }
            );
        }
    </script>
    
    <body>
    key: <input id="key" type="text" /></br>
    value:<input id="value" type="text" /></br>
    <input type="button" onClick="save()" value="保存数据"/></br>
    key:<input id="yourKey" type="text" /></br>
    <input type="button" onClick="get()" value="获取数据"/></br>
    </body>
    </html>

    
    
    7、上面的步骤完成,这个插件就可以通过命令安装到项目中了
    如果先自己测试下,可以先通过命令将这个插件从项目中删除掉。
    到cordova项目的跟目录
    plugman uninstall --platform android --project platformsandroid --plugin cordova-myplugin-savedata
    然后执行prepare命令
    cordova prepare android
    然后再通过命令安装插件
    plugman install --platform android --project platformsandroid --plugin ../PluginsDIY/pluginb
    (插件的位置在当前目录上一级目录下的PluginsDIY目录下)
    cordova  prepare android 
    回到eclipse中,刷新下项目就能看到插件已经安装
    注意:指定了prepare后www目录下的文件都会被删除掉重新复制一遍,所以如果你在index.html里面写了测试代码,用命令重新安装后代码就没有了。

     
     
     
    目标:写一个可以让别人通过命令安装的android平台的cordova插件
    步骤:
    1、准备一个cordova项目导入到eclipse中(为了方便安装插件可以把cordova项目中的platform做为eclipse的工作空间,如果不懂可以看这里  点击打开链接

    一、创建空白的cordova项目

    1、到你想创建项目的目录下,打开黑窗口

     

    cordova create hellocom.example.helloHelloWorld

    hello:项目目录名

    com.exmple.hello:项目包名

    HelloWorld:应用的名字

    2、cd到刚才创建的目录hello下,添加android平台

    cd hello

    cordova platform add android

     

    2、准备一个干净的插件
    plugman create --name pluginb --plugin_id cordova-myplugin-pluginb --plugin_version 1.0.0
    PluginB:插件名
    cordova-myplugin-pluginb:插件id
    新插件的目录结构
    PluginB
        |--src 
            |--
        |--www
            |--pluginb.js
        |--plugin.xml
    plugin.xml代码
    <?xml version='1.0' encoding='utf-8'?>
    <plugin id="cordova-myplugin-savedata" version="1.0.0" xmlns="http://apache.org/cordova/ns/plugins/1.0" xmlns:android="http://schemas.android.com/apk/res/android">
        <!--插件名-->
    	<name>SaveDataPlugin</name>
    	<!--这里的js-module的name属性无所谓,起什么名字都可以,为了区别插件名,起一个其他名字。src属性是插件js文件所在的路径,-->
        <js-module name="MyPlugin_SaveData" src="www/SaveDataPlugin.js">
    	<!--clobbers标签的target属性则对应您在js调用该插件所用到的名称,比如target名字为cordova.plugins.ExtraInfo,则后面肯定是cordova.plugins.SaveDataPlugin.js定义的方法名字
    	 来进行调用-->
            <clobbers target="cordova.plugins.SaveDataPlugin" />
        </js-module>
    </plugin>
    3、在本地修改插件plugin.xml,以及添加java文件
    修改插件plugin.xml
    <?xml version='1.0' encoding='utf-8'?>
    <plugin id="cordova-myplugin-savedata" version="1.0.0" xmlns="http://apache.org/cordova/ns/plugins/1.0" xmlns:android="http://schemas.android.com/apk/res/android">
        <!--插件名-->
    <name>SaveDataPlugin</name>
    <!--这里的js-module的name属性无所谓,起什么名字都可以,为了区别插件名起一个其他名字,这个会决定cordova.define("cordova-myplugin-savedata.MyPlugin_SaveData"。src属性是插件js文件所在的路径,-->
        <js-module name="MyPlugin_SaveData" src="www/SaveDataPlugin.js">
    <!--clobbers标签的target属性则对应您在js调用该插件所用到的名称,比如target名字为cordova.plugins.SaveDataPlugin,则后面肯定是cordova.plugins.SaveDataPlugin.js定义的方法名字
     来进行调用-->
            <clobbers target="cordova.plugins.SaveDataPlugin" />
        </js-module>
     
    <platform name="android">
    <!--这里是插件的配置信息,最后会添加到 res/xml/config.xml 文件中--> 
            <config-file target="res/xml/config.xml" parent="/*"> 
    <!--注意这里的name要和插件js文件中调用exec方法中所调用的插件名字一致,不然肯定会出问题-->
                <feature name="SaveDataPlugin"> 
    <!--value:com.plugins.savedataplugin SaveDataPlugin 插件java文件名,插件的包名和插件的id不是一回事,虽然后有时候默认用插件id做包名-->  
                    <param name="android-package" value="com.plugins.savedataplugin.SaveDataPlugin" />  
                    <param name="onload" value="true" />  
                </feature>  
            </config-file>
    <!--将插件src/android目录下的PluginB复制到项目的src/com/plugins/savedataplugin目录下--> 
    <source-file src="src/android/SaveDataPlugin.java" target-dir="src/com/plugins/savedataplugin" />  
        </platform>  
    </plugin>
     
    添加插件的java文件
    新建一个PluginB.java的文件放在插件的src目录下就可以,具体的代码可以在导入eclipse后再写。
    4、将插件通过命令安装到项目中并执行prepare
    plugman install --platform android --project platformsandroid --plugin ../PluginsDIY/SaveDataPlugin、
    对于项目来说的改变
    改变1:项目中添加了插件的java文件
     
    改变2:项目的platform_www目录下添加了插件的js文件
     
    改变3:项目的platform_www目录下的cordova_plugin.js发生了改变
     
    改变4:项目res目录下的xml目录下的config.xml文件发生了改变
    cordova prepare android
    对于项目来说的改变
    只改变了一个地方,就是将assets目录下的www清空,重新将里面的文件从别的地方复制了一遍,两个地方:
    1、cordova项目本地目录中的www文件下的所有文件
    2、项目目录platform_www下的所有文件
    这样就把刚才安装插件引起的plugins目录和corodova_plugin.js的变化都更新了
    做完上面的操作,你的插件在项目中就可以看到了,只不过还没有任何用能,因为java代码和js代码 还没写
    ----------------------------------------------------------------------------------------------------------------------------------------------------
    5、根据功能修改插件的java代码和js代码
    java代码:
    [java] view plain copy
     
    1. public class PluginB extends CordovaPlugin {  
    2.     private Context context;  
    3.   
    4.     public void initialize(CordovaInterface cordova, CordovaWebView webView) {  
    5.         super.initialize(cordova, webView);  
    6.         //获取context  
    7.         context = this.cordova.getActivity().getApplicationContext();  
    8.     }  
    9.   
    10.     @Override  
    11.     public boolean execute(String action, final CordovaArgs args,  
    12.             CallbackContext callbackContext) throws JSONException {  
    13.         //  
    14.         if ("save".equals(action)) {  
    15.             cordova.getThreadPool().execute(new Runnable() {  
    16.                 public void run() {  
    17.                     String key = args.optString(0);  
    18.                     String value = args.optString(1);  
    19.                     saveData(key, value);  
    20.                 }  
    21.             });  
    22.         } else if ("get".equals(action)) {  
    23.             String key = args.optString(0);  
    24.             String values = this.getString(context, key, "");  
    25.             callbackContext.success(values);  
    26.         }  
    27.         return true;  
    28.     }  
    29.   
    30.     private void saveData(String key, String value) {  
    31.         this.putString(context, key, value);  
    32.     }  
    33.   
    34.     public static final String FILE_NAME = "share_data";  
    35.     public static SharedPreferences sp;  
    36.   
    37.     /** 
    38.      * 每次使用工具类的时候,首先判断是不是已经有sp对象了,如果有了就不用再次创建了。 
    39.      *  
    40.      * @param context 
    41.      * @return 
    42.      */  
    43.     private static SharedPreferences getPreferences(Context context) {  
    44.         if (sp == null) {  
    45.             sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);  
    46.         }  
    47.         return sp;  
    48.     }  
    49.   
    50.     /** 
    51.      * 保存key value值 
    52.      *  
    53.      * @param context 
    54.      * @param key 
    55.      * @param value 
    56.      */  
    57.     public static void putString(Context context, String key, String value) {  
    58.         SharedPreferences sp = getPreferences(context);  
    59.         sp.edit().putString(key, value).commit();  
    60.     }  
    61.   
    62.     /** 
    63.      * 根据key值获取value 
    64.      *  
    65.      * @param context 
    66.      * @param key 
    67.      * @param defValue 
    68.      * @return 
    69.      */  
    70.     public static String getString(Context context, String key, String defValue) {  
    71.         String value = getPreferences(context).getString(key, defValue);  
    72.         return value;  
    73.     }  
    74. }  


    js代码:
    //
    cordova.define("cordova-myplugin-savedata.MyPlugin_SaveData", function(require, exports, module) {
    var exec = require('cordova/exec');
     
    function SaveData(){};
     
    SaveData.prototype.save = function(key,value,success, error){
        exec(success, error, "SaveDataPlugin", "save", [key,value]);
    };
     
    SaveData.prototype.get = function(key,success, error){
        exec(success, error, "SaveDataPlugin", "get", [key]);
    };
     
    var woyuanyi = new SaveData();
    module.exports = woyuanyi; 
     
    });
    6、测试没问题后,将java文件复制到插件的src/android目录下,将js文件复制到插件的www目录下
    var exec = require('cordova/exec');
     
    function SaveData(){};
     
    SaveData.prototype.save = function(key,value,success, error){
        exec(success, error, "SaveDataPlugin", "save", [key,value]);
    };
     
    SaveData.prototype.get = function(key,success, error){
        exec(success, error, "SaveDataPlugin", "get", [key]);
    };
     
    var woyuanyi = new SaveData();
    module.exports = woyuanyi; 

    1、到你想创建项目的目录下,打开黑窗口

     

    cordova create hello com.example.hello HelloWorld

    hello:项目目录名

    com.exmple.hello:项目包名

    HelloWorld:应用的名字

    2、cd到刚才创建的目录hello下,添加android平台

    cd hello

    cordova platform add android

    这样插件就写完了,如果想测试可以在index.html写测试代码
    <html>
        <head>
        </head>
        <!--cordova.js必须引入-->
        <script type="text/javascript" src="cordova.js"></script>
        <script>
        function save(){
        var key=document.getElementById("key").value;
        var value=document.getElementById("value").value;
        alert(key);
        alert(value);
            cordova.plugins.SaveDataPlugin.save(key,value,
                function(result){
                    console.log(result);
                },
                function(error){
                    console.log(error);
                }
            );        
        };
     
    function get(){
        var key=document.getElementById("yourKey").value;    
            cordova.plugins.SaveDataPlugin.get(key,
                function(result){
                    alert(result);
                },
                function(error){
                    console.log(error);
                }
            );
    }
        </script>
     
        <body>
           key: <input id="key" type="text" /></br>
           value:<input id="value" type="text" /></br>
           <input type="button" onClick="save()" value="保存数据"/></br>       
           key:<input id="yourKey" type="text" /></br>
           <input type="button" onClick="get()" value="获取数据"/></br>
        </body>
    </html>
     
    7、上面的步骤完成,这个插件就可以通过命令安装到项目中了
    可以尝试一下
    首先通过命令先把刚才写的插件删除掉
    plugman uninstall --platform android --project platformsandroid --plugin cordova-myplugin-pluginb
    cordova prepare android
    然后再通过命令安装插件
    plugman install --platform android --project platformsandroid --plugin ../PluginsDIY/pluginb(插件的位置在当前目录上一级目录下的PluginsDIY目录下)
    cordova  prepare android 
  • 相关阅读:
    用ASP.Net2005和Oracle9i做模糊查询时报ORA01722错误解决方法
    ☠360与腾讯QQ的战争☠之我见
    【转】GIS原理学习
    【转】JavaScript写的Cookie类
    怀疑自己的笔记本电脑可能受到了网络攻击被人监视或操控
    “密码人”越来越多将会出现“密码危机”
    【转】确保 ASP.NET 应用程序和 Web Services 的安全
    超图软件(SuperMap)学习资料:桌面软件(Deskpro)
    用Sql Server 2000的数据库备份来还原Sql Server 2005中的数据库
    一个有用的Windows服务小程序——用来完成Server端的Socket通信
  • 原文地址:https://www.cnblogs.com/itlyh/p/6047236.html
Copyright © 2020-2023  润新知