• android日历调用首先第一步我们要添加权限
  <uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission android:name="android.permission.WRITE_CALENDAR" />
  • 接着我们书写js调用接口
var calendar = {
add: function (success, data) {
exec(success, null, "Calendar", "add", [data]);
},
open:function(success, data){
exec(success, null, "Calendar", "open", [data]);
} }; module.exports = calendar;
  • 这两个方法一个add是后台添加到日历数据库,一个打开日历,然后调用系统日历添加

由于android存在版本兼容我们要添加

if (Build.VERSION.SDK_INT >=8) {
calanderURL = "content://com.android.calendar/calendars";
calanderEventURL = "content://com.android.calendar/events";
calanderRemiderURL = "content://com.android.calendar/reminders"; } else {
calanderURL = "content://calendar/calendars";
calanderEventURL = "content://calendar/events";
calanderRemiderURL = "content://calendar/reminders";
}
  • android的日历存储有多个用户,但是系统默认一般会第一个
Cursor userCursor = cordova.getActivity().getContentResolver()
.query(Uri.parse(calanderURL), null, null, null, null);
if (userCursor.getCount() > 0) {
userCursor.moveToFirst();
calId = userCursor.getString(userCursor.getColumnIndex("_id"));
}
  • android后台添加日历参数,这个时候我们一般调用phonegap线程写法,不会影响ui
private void Add(final JSONObject sData, final CallbackContext context) {
cordova.getThreadPool().execute(new Runnable() {
public void run() {
try {
ContentValues event = new ContentValues();
Log.v(TAG, sData.getString("dtstart"));
event.put("calendar_id", calId);
event.put(Events.TITLE, sData.getString("title"));
event.put(Events.EVENT_LOCATION,
sData.getString("location"));
event.put(Events.DESCRIPTION,
sData.getString("description"));
event.put(Events.DTSTART, sData.getLong("dtstart"));
event.put(Events.DTEND, sData.getLong("dtend"));
event.put("eventTimezone", TimeZone.getDefault().getID());
Uri url = cordova.getActivity().getContentResolver()
.insert(Uri.parse(calanderEventURL), event);
long id = Long.parseLong(url.getLastPathSegment());
ContentValues values = new ContentValues();
values.put("event_id", id);
// 提前10分钟有提醒
values.put("minutes", 10);
values.put("method", 1);
cordova.getActivity().getContentResolver()
.insert(Uri.parse(calanderRemiderURL), values);
} catch (JSONException e) {
e.printStackTrace();
}
context.success(); // Thread-safe.
}
});
}
  • 如何调用android弹出系统添加页面了
private void Open() {
Uri uri = Uri.parse(calanderEventURL);
Intent intent = new Intent("android.intent.action.INSERT", uri);
lastId = GetLastId();
cordova.startActivityForResult((CordovaPlugin) this, intent, 1); }
  • 因为调用系统添加日历我们无法知道我们添加的状态,我们只能判断日历事件表最大id的是否变化
  • 接下来提供详细java代码
package com.triedtech.triedapp.plugins.calendar;

import java.util.TimeZone;

import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject; import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build; import android.provider.CalendarContract.Events;
import android.util.Log; public class Calendar extends CordovaPlugin {
public static final Integer RESULT_CODE_CREATE = 0;
private static String calanderURL = "";
private static String calanderEventURL = "";
private static String calanderRemiderURL = "";
private String TAG = "calendar";
public int isInit = 0;
public int lastId = 0;
private String calId;
private CallbackContext callbackContext; public boolean execute(String action, JSONArray args,
CallbackContext callbackContext) throws JSONException {
this.callbackContext = callbackContext;
initConfig();
if (action.equals("add")) { JSONObject sData = args.getJSONObject(0);
this.Add(sData, callbackContext);
return true;
} else if (action.equals("open")) {
Open();
return true;
}
return false;
} private void initConfig() {
if (isInit == 0) {
if (Build.VERSION.SDK_INT >=8) {
calanderURL = "content://com.android.calendar/calendars";
calanderEventURL = "content://com.android.calendar/events";
calanderRemiderURL = "content://com.android.calendar/reminders"; } else {
calanderURL = "content://calendar/calendars";
calanderEventURL = "content://calendar/events";
calanderRemiderURL = "content://calendar/reminders";
}
Cursor userCursor = cordova.getActivity().getContentResolver()
.query(Uri.parse(calanderURL), null, null, null, null);
if (userCursor.getCount() > 0) {
userCursor.moveToFirst();
calId = userCursor.getString(userCursor.getColumnIndex("_id"));
}
isInit = 1;
}
} private void Add(final JSONObject sData, final CallbackContext context) {
cordova.getThreadPool().execute(new Runnable() {
public void run() {
try {
ContentValues event = new ContentValues();
Log.v(TAG, sData.getString("dtstart"));
event.put("calendar_id", calId);
event.put(Events.TITLE, sData.getString("title"));
event.put(Events.EVENT_LOCATION,
sData.getString("location"));
event.put(Events.DESCRIPTION,
sData.getString("description"));
event.put(Events.DTSTART, sData.getLong("dtstart"));
event.put(Events.DTEND, sData.getLong("dtend"));
event.put("eventTimezone", TimeZone.getDefault().getID());
Uri url = cordova.getActivity().getContentResolver()
.insert(Uri.parse(calanderEventURL), event);
long id = Long.parseLong(url.getLastPathSegment());
ContentValues values = new ContentValues();
values.put("event_id", id);
// 提前10分钟有提醒
values.put("minutes", 10);
values.put("method", 1);
cordova.getActivity().getContentResolver()
.insert(Uri.parse(calanderRemiderURL), values);
} catch (JSONException e) {
e.printStackTrace();
}
context.success(); // Thread-safe.
}
});
} private int GetLastId() {
Cursor userCursor = cordova
.getActivity()
.getContentResolver()
.query(Uri.parse(calanderEventURL), null,
Events.CALENDAR_ID + " =" + calId, null,
Events._ID + " desc limit 1");
if (userCursor.getCount() > 0) {
userCursor.moveToFirst();
String event_id = userCursor.getString(userCursor
.getColumnIndex(Events._ID));
userCursor.close();
return Integer.parseInt(event_id);
}
return 0;
} private void Open() {
Uri uri = Uri.parse(calanderEventURL);
Intent intent = new Intent("android.intent.action.INSERT", uri);
lastId = GetLastId();
cordova.startActivityForResult((CordovaPlugin) this, intent, 1); } private JSONObject LastRecord() throws JSONException{
Cursor userCursor = cordova
.getActivity()
.getContentResolver()
.query(Uri.parse(calanderEventURL), null,
Events.CALENDAR_ID + " =" + calId, null,
Events._ID + " desc limit 1");
userCursor.moveToFirst();
String event_id = userCursor.getString(userCursor
.getColumnIndex(Events._ID));
JSONObject record = new JSONObject();
Log.v(TAG, userCursor.getString(userCursor.getColumnIndex(Events.TITLE)));
record.put("dtstart", userCursor.getString(userCursor.getColumnIndex(Events.DTSTART)));
record.put("dtend", userCursor.getString(userCursor.getColumnIndex(Events.DTEND)));
record.put("id", userCursor.getString(userCursor.getColumnIndex(Events._ID)));
record.put("location", userCursor.getString(userCursor.getColumnIndex(Events.EVENT_LOCATION)));
record.put("title", userCursor.getString(userCursor.getColumnIndex(Events.TITLE)));
record.put("description", userCursor.getString(userCursor.getColumnIndex(Events.DESCRIPTION)));
userCursor.close(); return record;
} /**
* Called when the calendar view exits.
*
* @param requestCode
* The request code originally supplied to
* startActivityForResult(), allowing you to identify who this
* result came from.
* @param resultCode
* The integer result code returned by the child activity through
* its setResult().
* @param intent
* An Intent, which can return result data to the caller (various
* data can be attached to Intent "extras").
*/
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
Log.v(TAG,String.valueOf(lastId));
Log.v(TAG,String.valueOf(GetLastId()));
if (lastId != GetLastId()) {
try {
Log.v(TAG,"执行");
this.callbackContext.success(LastRecord());
} catch (JSONException e) {
e.printStackTrace();
}
}
} }

phonegap之android原生日历调用的更多相关文章

  1. uni-app&H5&Android混合开发三 || uni-app调用Android原生方法的三种方式

    前言: 关于H5的调用Android原生方法的方式有很多,在该片文章中我主要简单介绍三种与Android原生方法交互的方式. 一.H5+方法调用android原生方法 H5+ Android开发规范官 ...

  2. PhoneGap或者Cordova框架下实现Html5中JS调用Android原生代码

    PhoneGap或者Cordova框架下实现Html5中JS调用Android原生代码 看看新闻网>看引擎>开源产品 0人收藏此文章, 发表于8小时前(2013-09-06 00:39) ...

  3. Android移动APP开发笔记——Cordova(PhoneGap)通过CordovaPlugin插件调用 Activity 实例

    引言 Cordova(PhoneGap)采用的是HTML5+JavaScript混合模式来开发移动手机APP,因此当页面需要获取手机内部某些信息时(例如:联系人信息,坐标定位,短信等),程序就需要调用 ...

  4. Flutter学习(9)——Flutter插件实现(Flutter调用Android原生

    原文地址: Flutter学习(9)--Flutter插件实现(Flutter调用Android原生) | Stars-One的杂货小窝 最近需要给一个Flutter项目加个apk完整性检测,需要去拿 ...

  5. React Native Android原生模块开发实战|教程|心得|怎样创建React Native Android原生模块

    尊重版权,未经授权不得转载 本文出自:贾鹏辉的技术博客(http://blog.csdn.net/fengyuzhengfan/article/details/54691503) 告诉大家一个好消息. ...

  6. Android原生游戏开发:使用JustWeEngine开发微信打飞机

    使用JustWeEngine开发微信打飞机: 作者博客: 博客园 引擎地址:JustWeEngine 示例代码:EngineDemo JustWeEngine? JustWeEngine是托管在Git ...

  7. 基于命令行编译打包phonegap for android应用 分类: Android Phonegap 2015-05-10 10:33 73人阅读 评论(0) 收藏

    也许你习惯了使用Eclipse编译和打包Android应用.不过,对于使用html5+js开发的phonegap应用,本文建议你抛弃Eclipse,改为使用命令行模式,绝对的快速和方便. 一直以来,E ...

  8. 使用 Eclipse PhoneGap 构建 Android 应用程序入门

    Eclipse 是一种支持多种技术的开源集成开发环境 (IDE),但本文重点介绍 Java 支持,这也是 Android 应用程序的“母语”.Android 是 Google 发布的开源移动操作系统. ...

  9. [Android Pro] android 4.4 Android原生权限管理:AppOps

    reference : http://m.blog.csdn.net/blog/langzxz/45308199 reference : http://blog.csdn.net/hyhyl1990/ ...

随机推荐

  1. hoj 2634 How to earn more

    有m个项目和n个员工,做项目i可以获得Ai元,但是必须雇用若干指定的员工.雇用员工j需要Bj元,一旦雇用便可以参与多个项目.问最大收益. 1<=M,N<=100. 最小割. 源点向每个项目 ...

  2. 12.3 Arithmetic-software-

    一.流程图: 二.软件功能: 分为混合模式和单则模式,混合模式生成指定题数的任意四则混合运算,数字是1-10之间随机:单则模式是生成指定题数的加减乘除中指定的某一则运算,数字是1-10之间随机. 用户 ...

  3. mysql5.7导入csv文件

    环境: Windows10企业版X64 mysql5.7免安装版(从5.6版本开始,官方不再提供64位的msi版本) 运行mysqld.exe启动mysql进程. 用root登录mysql: mysq ...

  4. grafana日志分析界面及导出的json文件

    日志分析面板导出的json文件,效果图如下: 下载地址:http://files.cnblogs.com/files/xiaoming279/%E9%9D%A2%E6%9D%BF.zip 主机面板 主 ...

  5. 如何将EXCEL表导入ORACLE数据库中?【转】

    来源:https://zhidao.baidu.com/question/383828330.html?qbl=relate_question_2&word=excel%20%B1%ED%CA ...

  6. 如何删除xcode项目中不再使用的图片资源

    1. 利用工具    下载地址  http://jeffhodnett.github.io/Unused/   运行效果如下 2. 通过终端 执行 shell 命令 a. 第一步建立.sh 文件  如 ...

  7. 问题解决:psql: could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

    错误提示: psql: could not connect to server: No such file or directory Is the server running locally and ...

  8. golang笔记——array

    1.定义一个 array 数组长度也是类型的一部分,比如长度为3的int数组与长度为5的int数组,并不是同一类型. package main import ( "strconv" ...

  9. JSP脚本中的9个内置对象

    JSP脚本中包含9个内置对象,这9个内置对象都是Servlet API接口的实例,只是JSP规范对它们进行了默认初始化.也就是说它们已经是对象,可以直接使用. 我们随意打开一个由JSP页面生成的Ser ...

  10. APP常用字体

    font-family:Microsoft YaHei,Helvitica,Verdana,Tohoma,Arial,san-serif;