ionic2自定义cordova插件开发以及使用(Android)


Posted in Javascript onJune 19, 2017

如何写一个cordova 用于ionic2项目中呢,在搜索了一番之后,千篇一律,我都怀疑那些文章是不是全部都是复制来复制去的,而且都不是很详细。我自己也捣鼓了一下午,踩了很多坑。所以特此写这下这篇,记录一下。

假设需求是 写一个日志插件,可以将日志写在手机的sdcard中。

1.安装plugman

npm install -g plugman

2.creat一个插件框架

plugman creat --name 插件名字 --plugin_id 插件id --plugin_version 插件版本号

例如:

plugman create --name cordovaHeaLog --plugin_id cordova-plugin-hea-log --plugin_version 1.0

回车然后将生成这样一个结构的项目

ionic2自定义cordova插件开发以及使用(Android)

3.添加安卓平台支持

plugman platform add --platform_name android

我们可以看到src 下多了一个android文件夹 以及下面多了一个java文件。

ionic2自定义cordova插件开发以及使用(Android)

4.实现日志功能

在src/android 我添加了一个logUtil.java文件。

里面的内容如下:

package cordova.plugin.hea.log;

import android.os.Environment;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;


public class logUtil{
 private static int SDCARD_LOG_FILE_SAVE_DAYS = 180; // sd卡中日志文件的最多保存天数
 private static String LOG_PATH_SDCARD_DIR = Environment.getExternalStorageDirectory().toString()+"/VP2/log/"; // 日志文件在sdcard中的路径

 // 日志的输出格式
 private static SimpleDateFormat LogSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 private static SimpleDateFormat logDay = new SimpleDateFormat("dd");
 private static SimpleDateFormat logTime = new SimpleDateFormat("yyyy-MM");

 /**
  * 打开日志文件并写入日志
  *
  * @return
  * **/
 public static void writeLogtoFile(String mylogtype, String tag, String text) {
  delFile();
  Date nowtime = new Date();
  String needWriteMessage = LogSdf.format(nowtime) + " " + tag + "\n" + text+"\n";
  String logFileName;
  String logFolder=logTime.format(new Date());

  if(mylogtype=="error"){
   logFileName="error("+logDay.format(new Date())+").log";
  }else if(mylogtype=="crash"){
   logFileName="crash("+logDay.format(new Date())+").log";
  }else {
   logFileName="info("+logDay.format(new Date())+").log";
  }

  File file = new File(LOG_PATH_SDCARD_DIR+logFolder);
  if (!file.exists()) {
   file.mkdirs();
  }

  File f = new File(LOG_PATH_SDCARD_DIR+logFolder,logFileName);
  try {
   FileWriter filerWriter = new FileWriter(f, true);
   BufferedWriter bufWriter = new BufferedWriter(filerWriter);
   bufWriter.write(needWriteMessage);
   bufWriter.newLine();
   bufWriter.close();
   filerWriter.close();
  } catch (IOException e) {
   e.printStackTrace();
  }
 }

 /**
  * 删除制定的日志文件
  * */
 private static void delFile(){
  String needDelFiel = logTime.format(getDateBefore());
  File file = new File(LOG_PATH_SDCARD_DIR, needDelFiel );
  if (file.exists()) {
   file.delete();
  }
 }

 private static Date getDateBefore() {
  Date nowtime = new Date();
  Calendar now = Calendar.getInstance();
  now.setTime(nowtime);
  now.set(Calendar.DATE, now.get(Calendar.DATE) - SDCARD_LOG_FILE_SAVE_DAYS);
  return now.getTime();
 }
}

修改src/android/cordovaHeaLog.java文件

package cordova.plugin.hea.log;

import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.CallbackContext;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import cordova.plugin.hea.log.logUtil;
/**
 * This class echoes a string called from JavaScript.
 */
public class cordovaHeaLog extends CordovaPlugin {
 @Override
 public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
  if (action.equals("log")) {
   this.log(args.getString(0),args.getString(1),args.getString(2), callbackContext);
   return true;
  }
  return false;
 }

 private void log(String mylogtype, String tag,String text,CallbackContext callbackContext) {
  if (mylogtype != null && mylogtype.length() > 0&&text!=null&&text.length()>0&&tag!=null&&tag.length()>0) {
   logUtil.writeLogtoFile(mylogtype, tag, text);
   callbackContext.success(mylogtype+" "+tag+" "+text);
  } else {
   callbackContext.error("参数不可为空");
  }
 }
}

接下来修改 www/cordovaHeaLog.js.js

var exec = require('cordova/exec');
exports.log = function(arg0,arg1,arg2,success, error) {
exec(success, error, "Logjava", "log", [arg0,arg1,arg2]);
};

重点来了,项目下的 plugin.xml文件,我在这里踩了好久的坑,才跳出来。

我们将改成这样

<?xml version='1.0' encoding='utf-8'?>
<plugin id="cordova-plugin-hea-log" version="1" 
 xmlns="http://apache.org/cordova/ns/plugins/1.0" 
 xmlns:android="http://schemas.android.com/apk/res/android">
 <name>cordovaHeaLog</name>
 <js-module name="cordovaHeaLog" src="www/cordovaHeaLog.js">
  <clobbers target="cordovaHeaLog" />
 </js-module>
 <platform name="android">
  <config-file parent="/*" target="res/xml/config.xml">
   <feature name="Logjava">
    <param name="android-package" value="cordova.plugin.hea.log.cordovaHeaLog" />
   </feature>
  </config-file>
  <config-file parent="/*" target="AndroidManifest.xml"></config-file>
  <source-file src="src/android/cordovaHeaLog.java" target-dir="src/cordova/plugin/hea/log/cordovaHeaLog" />

  <source-file src="src/android/logUtil.java" target-dir="src/cordova/plugin/hea/log/logUtil" />
 </platform>
</plugin>

5.添加自定义插件

一般情况下是这样添加插件的

cordova plugin add cordova-plugin-hea-log

如果是添加本地的插件是这样添加的 比如我自定义插件是这样添加的

我的这个插件在这个路径下E:\cordovaHeaLog那我就这样添加

cordova plugin add E:\cordovaHeaLog

解释:为什么是addcordova-plugin-hea-log 呢 请往上翻 因为plugin.xml里的id 是cordova-plugin-hea-log

结果:

ionic2自定义cordova插件开发以及使用(Android)

6.添加安卓平台,设置权限,使用插件,运行查看结果

添加安卓平台

cordova platform add android

然后在项目的这个路径下 HeaIonic/android/AndroidManifest.xml 这个文件

添加权限 因为要写入日志在sdcard

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

如何使用插件呢

在HeaIonic/platforms/android/assets/www 这个路径下的这个文件cordova_plugins.js 打开

我们可以看到这个

ionic2自定义cordova插件开发以及使用(Android)

我们在页面上这样使用

圈起来的是添加的代码

ionic2自定义cordova插件开发以及使用(Android)

然后 ionic serve ,接着cordova build android

用android studio 打包项目 运行,关于如何 打包项目请看这里→ionic2 使用 cordova 打包成安卓apk

结果:调用插件日志写入成功

ionic2自定义cordova插件开发以及使用(Android) ionic2自定义cordova插件开发以及使用(Android)

总结:

1.感觉自己在plugin.xml 配置出现最多问题,所以请先了解plugin.xml 如何进行配置。

2.还有比如logUtil.java 文件,可以写好测试功能没问题后再复制进插件里面。

3.关于调试,添加插件后出现问题,可以在android studio 中的Logcat 窗口查看是哪里出现了问题并进行调试,它会输出是什么问题啊,然后自行解决。一开始我也是一脸懵逼,不知道在哪里进行插件的调试写好后,也不是一次性就过完美的总要调试看看哪里会有出错的嘛,毕竟还是小菜鸟一只。

参考于:Android插件开发指南 →Android Plugin Development Guide

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript实现复制功能各浏览器支持情况实测
Jul 18 Javascript
深入理解JavaScript系列(18):面向对象编程之ECMAScript实现
Mar 05 Javascript
js 实现数值的千分位及保存小数方法(推荐)
Aug 01 Javascript
AngularJS教程 ng-style 指令简单示例
Aug 03 Javascript
BootStrap Table后台分页时前台删除最后一页所有数据refresh刷新后无数据问题
Dec 28 Javascript
jquery mobile移动端幻灯片滑动切换效果
Apr 15 Javascript
bootstrap组件之按钮式下拉菜单小结
Jan 19 Javascript
详解开源的JavaScript插件化框架MinimaJS
Oct 26 Javascript
Vuex中实现数据状态查询与更改
Nov 08 Javascript
jQuery实现的图片点击放大缩小功能案例
Jan 02 jQuery
微信小程序使用 vant Dialog组件的正确方式
Feb 21 Javascript
js实现滑动进度条效果
Aug 21 Javascript
详解vue2.0 transition 多个元素嵌套使用过渡
Jun 19 #Javascript
vue中如何实现变量和字符串拼接
Jun 19 #Javascript
js实现随机数字字母验证码
Jun 19 #Javascript
解决vue-cli中stylus无法使用的问题方法
Jun 19 #Javascript
AngularJS  ng-repeat遍历输出的用法
Jun 19 #Javascript
ZeroClipboard.js使用一个flash复制多个文本框
Jun 19 #Javascript
AngularJS的ng-click传参的方法
Jun 19 #Javascript
You might like
PHP7中I/O模型内核剖析详解
2019/04/14 PHP
使用按钮控制以何种方式打开新窗口的属性介绍
2012/12/17 Javascript
jQuery实现的原图对比窗帘效果
2014/06/15 Javascript
Labelauty?jQuery单选框/复选框美化插件分享
2015/09/26 Javascript
基于jQuery1.9版本如何判断浏览器版本类型
2016/01/12 Javascript
简单理解JavaScript中的封装与继承特性
2016/03/19 Javascript
简单实现JS计算器功能
2016/12/21 Javascript
详解数组Array.sort()排序的方法
2020/05/09 Javascript
JavaScript组件开发之输入框加候选框
2017/03/10 Javascript
jquery中封装函数传递当前元素的方法示例
2017/05/05 jQuery
cordova入门基础教程及使用中遇到的一些问题总结
2017/11/14 Javascript
vue router 跳转后回到顶部的实例
2018/08/31 Javascript
在vue中使用setInterval的方法示例
2019/04/16 Javascript
详解vue修改elementUI的分页组件视图没更新问题
2020/11/13 Javascript
Python的Flask框架中@app.route的用法教程
2015/03/31 Python
详解Python的Django框架中Manager方法的使用
2015/07/21 Python
Python发送邮件的实例代码讲解
2019/10/16 Python
Django配置文件代码说明
2019/12/04 Python
Python 实现顺序高斯消元法示例
2019/12/09 Python
解决python ThreadPoolExecutor 线程池中的异常捕获问题
2020/04/08 Python
基于python纯函数实现井字棋游戏
2020/05/27 Python
基于Python快速处理PDF表格数据
2020/06/03 Python
pytorch 计算Parameter和FLOP的操作
2021/03/04 Python
解决html5中video标签无法播放mp4问题的办法
2017/05/07 HTML / CSS
Marriott中国:万豪国际酒店查询预订
2016/09/02 全球购物
Hanky Panky官方网站:内衣和睡衣
2019/07/25 全球购物
十佳美德少年事迹材料
2014/02/05 职场文书
手工社团活动方案
2014/02/17 职场文书
天坛导游词
2015/02/02 职场文书
2016大学生求职自荐信范文
2016/01/28 职场文书
再读《皇帝的新衣》的读后感悟!
2019/08/07 职场文书
python opencv常用图形绘制方法(线段、矩形、圆形、椭圆、文本)
2021/04/12 Python
Pytest之测试命名规则的使用
2021/04/16 Python
Mysql忘记密码解决方法
2022/02/12 MySQL
船舶调度指挥系统——助力智慧海事
2022/02/18 无线电
JS前端canvas交互实现拖拽旋转及缩放示例
2022/08/05 Javascript