蜜桃的男人 發表於 2019-8-8 11:31:00

如何在android studio中cordova的混合开发

<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">基于Android Studio 中Cordova的开发
cordova简介
Cordova的前身是PhoneGap 官网: (http:</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">cordova.io)</span>
<span style="color: rgba(0, 0, 0, 1)">Cordova应是运行在客户端本地应用容器的web应用。因此,运行在Cordova容器中的Html5应用的结构和传统的基于web服务器的有所不同。传统的web应用中服务器端做了大部分工作,比如按照用户请求传回生成的内容。而Cordova这种容器中的应用本身包括了所需要的静态页面,用户请求一般由js代码响应并与服务器交互,这样与服务器交互的内容会比较少。并且由于html5本身的特性(如本地存储)或容器的API,容器的应用可以脱离服务器运行。
cordova安装
先安装JDK
下载地址:(http:</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">www.oracle.com/technetwork/java/javase/downloads/index.html)</span>
<span style="color: rgba(0, 0, 0, 1)">
安装SDK
下载地址:(http:</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">developer.android.com/sdk/index.html)</span>
<span style="color: rgba(0, 0, 0, 1)">
CLI(command</span>-line <span style="color: rgba(0, 0, 255, 1)">interface</span><span style="color: rgba(0, 0, 0, 1)">,命令行界面)的安装
CLI是用JavaScript写的,并且是用Node.js作为运行时执行引擎。所以需要先安装Node.js(http:</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">nodejs.org/download/),在安装过程中,CLI要获取一些GitHub的代码,所以要安装Git(</span><span style="color: rgba(0, 128, 0, 1); text-decoration: underline">https://git-scm.com/downloads</span><span style="color: rgba(0, 128, 0, 1)">);</span>
<span style="color: rgba(0, 0, 0, 1)">
当Node.js和Git都安装好后,在Git中命令行中输入:

npm install </span>-<span style="color: rgba(0, 0, 0, 1)">g cordova
</span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
完成cordova的安装。

完成了cordova安装的基本配置,可以去了解一下CLI的常用命令,网上有很多(https:</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">blog.csdn.net/guoscy/article/details/79202794)。通过命令创建一个android工程,添加android平台,添加WhitelistPlugin白名单插件,至此生成的android工程中就有了我们可移植到android studio中的一些核心文件。注意用Cordova CLI工具新建一个项目(不要使用 cordova build 命令进行编译,不然导入android studio中失败)</span>
<span style="color: rgba(0, 0, 0, 1)">
可以根据自己的需要添加cordova提供的丰富系统插件(用命令行添加很容易),也可以自己去写自定义插件。

cordova集成到android studio
将这个 工程集成到android studio中最关键的是CordovaLib 、www、(platform_www、cordova )、res下的中的配置文件config.xml;

CordovaLib以Moudle的形式导入工程,并依赖于主工程;

www放在工程目录assets文件夹下;

platform_www、cordova是主要用于CordovaCLI命令行类的,主要用于build后的作用;(导不到导入AS都可以)

我们自定义插件主要在www、和工程src下进行编写;

大致的结构图
<img src="https://img2018.cnblogs.com/blog/251429/201908/251429-20190808113013235-1703056466.png"></span></pre>
<p>&nbsp;</p>
<pre><span style="color: rgba(0, 0, 0, 1)">



现在我们就可以在工程下建一个文件夹,专门管理我们自定义的插件,进行开发。
cordova下自定义插件
以定义一个Toast的插件为例
在src下创建ToastPlugin.java的文件执行android原生的调用

    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 显示土司插件
   * @author yuhailong
   *
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> ToastPlugin extends CordovaPlugin {
   @Override
    </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> boolean execute(String action, JSONArray args,
                           CallbackContext callbackContext) throws JSONException {
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">前端回调的方法名</span>
      <span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">showToast</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">.equals(action)) {
             </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> executeShowToast(args, callbackContext);
      } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
            callbackContext.error(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">发生异常,请检查API使用是否正确</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
      }
   }

    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 显示toast的原生方法
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> executeShowToast() {
      </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
             CordovaArgs cordovaArgs </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> CordovaArgs(args);
             String text </span>= cordovaArgs.getJSONObject(<span style="color: rgba(128, 0, 128, 1)">0</span>).getString(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">text</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
             android.widget.Toast.makeText(cordova.getActivity(), text,Toast.LENGTH_LONG).show();
             callbackContext.success();
             </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
      } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
            e.printStackTrace();
            callbackContext.error(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">显示toast异常</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
      }
    }
}
</span>


<span style="color: rgba(0, 0, 0, 1)">
在config.xml中配置插件路径

</span>&lt;feature name=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ToastPlugin</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;
      &lt;<span style="color: rgba(0, 0, 0, 1)">param
            name</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">android-package</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
            value</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">com.example.test.plugins.ToastPlugin</span><span style="color: rgba(128, 0, 0, 1)">"</span> /&gt;
    &lt;/feature&gt;
<span style="color: rgba(0, 0, 0, 1)">
在asserts</span>/www/plugins/<span style="color: rgba(0, 0, 0, 1)">目录下插件自己的插件js文件
如:asserts</span>/www/platform/android/plugins/cordova-plugin-toast/<span style="color: rgba(0, 0, 0, 1)">toast.js
cordova.define( </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">com.example.test.plugins.ToastPlugin</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> , function(require, exports, module) {

      </span><span style="color: rgba(0, 0, 255, 1)">var</span> exec = require(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">cordova/exec</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);

      </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
         * Provides access to notifications on the device.
         </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
      module.exports </span>=<span style="color: rgba(0, 0, 0, 1)"> {
                </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
               * Causes the device to beep.
               * On Android, the default notification ringtone is played "count" times.
               *
               * @param {Integer} type       The Toast type.
                </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
      showToast:function(successCallback,errorCallback,content){
         exec(successCallback, errorCallback, </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ToastPlugin</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">showToast</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, );
      },
      };
    });
</span><span style="color: rgba(0, 0, 0, 1)">
添加土司插件js配置信息,配置调用的方法名
在assets</span>/www/platform/android/<span style="color: rgba(0, 0, 0, 1)">cordova_plugins.js文件中添加如下信息:
,{      
      </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">file</span><span style="color: rgba(128, 0, 0, 1)">"</span> : <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">plugins/cordova-plugin-toast/toast.js</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
      </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">id</span><span style="color: rgba(128, 0, 0, 1)">"</span> : <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">com.example.test.plugins.ToastPlugin</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,      
      </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">clobbers</span><span style="color: rgba(128, 0, 0, 1)">"</span> : [<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">navigator.webtoast</span><span style="color: rgba(128, 0, 0, 1)">"</span>]<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">定义调用的方法</span>
<span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 0, 0, 1)">
前端插件中方法代码调用(本地的调试)
在index.html文件中

</span>&lt;html&gt;
&lt;head&gt;
    &lt;!--<span style="color: rgba(0, 0, 0, 1)">
    Customize </span><span style="color: rgba(0, 0, 255, 1)">this</span> policy to fit your own app<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">s needs. For more guidance, see:</span>
      https:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">github.com/apache/cordova-plugin-whitelist/blob/master/README.md#content-security-policy</span>
<span style="color: rgba(0, 0, 0, 1)">    Some notes:
      </span>* gap: <span style="color: rgba(0, 0, 255, 1)">is</span> required only on iOS (when <span style="color: rgba(0, 0, 255, 1)">using</span> UIWebView) and <span style="color: rgba(0, 0, 255, 1)">is</span> needed <span style="color: rgba(0, 0, 255, 1)">for</span> JS-&gt;<span style="color: rgba(0, 0, 0, 1)">native communication
      </span>* https:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">ssl.gstatic.com is required only on Android and is needed for TalkBack to function properly</span>
      * Disables use of inline scripts <span style="color: rgba(0, 0, 255, 1)">in</span> order to mitigate risk of XSS vulnerabilities. To change <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">:
            </span>* Enable inline JS: add <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">unsafe-inline</span><span style="color: rgba(128, 0, 0, 1)">'</span> to <span style="color: rgba(0, 0, 255, 1)">default</span>-<span style="color: rgba(0, 0, 0, 1)">src
    </span>--&gt;
    &lt;meta http-equiv=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Content-Security-Policy</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
          content</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-*</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;
    &lt;meta http-equiv=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Content-type</span><span style="color: rgba(128, 0, 0, 1)">"</span> content=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">text/html; charset=utf-8</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;
    &lt;meta name=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">format-detection</span><span style="color: rgba(128, 0, 0, 1)">"</span> content=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">telephone=no</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;
    &lt;meta name=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">msapplication-tap-highlight</span><span style="color: rgba(128, 0, 0, 1)">"</span> content=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">no</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;
    &lt;meta name=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">viewport</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
          content</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;
    &lt;link rel=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">stylesheet</span><span style="color: rgba(128, 0, 0, 1)">"</span> type=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">text/css</span><span style="color: rgba(128, 0, 0, 1)">"</span> href=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">css/index.css</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;
    &lt;title&gt;Hello World&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div <span style="color: rgba(0, 0, 255, 1)">class</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">app</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;
    &lt;h1&gt;Apache Cordova&lt;/h1&gt;

    &lt;div id=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">deviceready</span><span style="color: rgba(128, 0, 0, 1)">"</span> <span style="color: rgba(0, 0, 255, 1)">class</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">blink</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;
      &lt;p <span style="color: rgba(0, 0, 255, 1)">class</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">event listening</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;Connecting to Device&lt;/p&gt;
      &lt;p <span style="color: rgba(0, 0, 255, 1)">class</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">event received</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;Device <span style="color: rgba(0, 0, 255, 1)">is</span> Ready&lt;/p&gt;
      &lt;button id=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">myBtnOne</span><span style="color: rgba(128, 0, 0, 1)">"</span> &gt;Toast&lt;/button&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;script type= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">text/javascript</span><span style="color: rgba(128, 0, 0, 1)">"</span> src=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">cordova.js</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;&lt;/script&gt;
&lt;script type= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">text/javascript</span><span style="color: rgba(128, 0, 0, 1)">"</span> src=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">js/index.js</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;&lt;/script&gt;
&lt;script type= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">text/javascript</span><span style="color: rgba(128, 0, 0, 1)">"</span> src=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">js/custom.js</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;
<span style="color: rgba(0, 0, 0, 1)">
类似在index.js文件夹下创建一个custom.js的文件,将js代码写在里面,Toast这里要注意的是弹框只能 通过id的查找了进行编辑;
custom.js的文件如下:
function showToast(){
    navigator.webtoast.showToast(function(result){
            alert(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">success:</span><span style="color: rgba(128, 0, 0, 1)">"</span>+<span style="color: rgba(0, 0, 0, 1)">result);

          },function(err){
            alert(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">error:</span><span style="color: rgba(128, 0, 0, 1)">"</span>+<span style="color: rgba(0, 0, 0, 1)">err);
          },{
            text:</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">你好,我是 Toast~</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
          });
}
document.getElementById(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">myBtnOne</span><span style="color: rgba(128, 0, 0, 1)">"</span> ).addEventListener(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">click</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, showToast);
</span><span style="color: rgba(0, 0, 0, 1)">
结束
整个cordova在android studio中的导入和自定义插件的开发流程,大致如上。具体的详情可以参照cordova的官方给的文档和网上的一下资料。

个人理解cordova相比于RN还是要容易上手些,cordova的核心还是一个H5,类似原生是个浏览器的壳;RN是通过js映射原生的组件。所以感觉交互上RN是要比cordova要好的,对于初学者要学的更多。当然两者都有其优势,要想深入其核心都是要下一点功夫的。
</span>---------------------<span style="color: rgba(0, 0, 0, 1)">
版权声明:本文为CSDN博主「那一年的梧桐雨」的原创文章,遵循CC </span><span style="color: rgba(128, 0, 128, 1)">4.0</span> by-<span style="color: rgba(0, 0, 0, 1)">sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https:</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">blog.csdn.net/liugang921118/article/details/82345435</span></pre>
</div>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/Jeely/p/11320155.html
頁: [1]
查看完整版本: 如何在android studio中cordova的混合开发