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 相关文章推荐
AJAX使用了UpdatePanel后无法使用alert弹出脚本
Apr 02 Javascript
潜说js对象和数组
May 25 Javascript
读jQuery之十四 (触发事件核心方法)
Aug 23 Javascript
JS字符串累加Array不一定比字符串累加快(根据电脑配置)
May 14 Javascript
jQuery控制TR显示隐藏的几种方法
Jun 18 Javascript
JavaScript中连接操作Oracle数据库实例
Apr 02 Javascript
jquery form表单获取内容以及绑定数据
Feb 24 Javascript
javascript弹出带文字信息的提示框效果
Jul 19 Javascript
jQuery窗口拖动功能的实现代码
Feb 04 Javascript
微信小程序 图片绝对定位(背景图片)
Apr 05 Javascript
jQuery.form.js的使用详解
Jun 14 jQuery
javascript面向对象程序设计实践常用知识点总结
Jul 29 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
浅析php中如何在有限的内存中读取大文件
2013/07/02 PHP
PHP中浮点数计算比较及取整不准确的解决方法
2015/01/09 PHP
CodeIgniter多语言实现方法详解
2016/01/20 PHP
动态调用css文件——jquery的应用
2007/02/20 Javascript
网页实时显示服务器时间和javscript自运行时钟
2014/06/09 Javascript
浅谈jQuery异步对象(XMLHttpRequest)
2014/11/17 Javascript
关于编写性能高效的javascript事件的技术
2014/11/28 Javascript
JS随机打乱数组的方法小结
2016/06/22 Javascript
JavaScrip关于创建常量的知识点
2017/12/07 Javascript
vue .js绑定checkbox并获取、改变选中状态的实例
2018/08/24 Javascript
javascript使用链接跨域下载图片
2019/11/01 Javascript
Vue中使用Lodop插件实现打印功能的简单方法
2019/12/19 Javascript
Angular如何由模板生成DOM树的方法
2019/12/23 Javascript
深入webpack打包原理及loader和plugin的实现
2020/05/06 Javascript
[02:22]《新闻直播间》2017年08月14日
2017/08/15 DOTA
[46:14]完美世界DOTA2联赛PWL S3 Magma vs INK ICE 第一场 12.11
2020/12/16 DOTA
Python代理抓取并验证使用多线程实现
2013/05/03 Python
python实现删除文件与目录的方法
2014/11/10 Python
让python在hadoop上跑起来
2016/01/27 Python
总结Python图形用户界面和游戏开发知识点
2019/05/22 Python
pytorch中的卷积和池化计算方式详解
2020/01/03 Python
pytorch下使用LSTM神经网络写诗实例
2020/01/14 Python
Python在终端通过pip安装好包以后在Pycharm中依然无法使用的问题(三种解决方案)
2020/03/10 Python
Tensorflow之MNIST CNN实现并保存、加载模型
2020/06/17 Python
css3 transform过渡抖动问题解决
2020/10/23 HTML / CSS
EJB3.1都有哪些改进
2012/11/17 面试题
客户代表实习人员自我鉴定
2013/09/27 职场文书
医务工作者先进事迹材料
2014/01/26 职场文书
放飞梦想演讲稿
2014/05/05 职场文书
企业安全生产目标责任书
2014/07/23 职场文书
企业员工爱岗敬业演讲稿
2014/08/26 职场文书
党校毕业个人总结
2015/02/28 职场文书
2015年青年教师工作总结
2015/05/25 职场文书
送给小学生的暑假礼物!小学生必背99首古诗
2019/07/02 职场文书
如何利用Matlab制作一款真正的拼图小游戏
2021/05/11 Python
jdbc中自带MySQL 连接池实践示例
2022/07/23 MySQL