前两天,产品提一个需求,说是弄一个系统日历的提醒,到时提醒用户做一些事情,大概这么一个需求。搞了一两天,查看API翻阅文档,算是完成需求了。

这篇文章一个纯粹的代码文章,就是告诉怎么用系统日历添加提醒,跟大家分享一下,以后可以直接拿过来用。

上代码:

CalendarHelper##

package com.example.asia.canlendartest;

import android.content.AsyncQueryHandler;

import android.content.ContentResolver;

import android.content.ContentValues;

import android.content.Context;

import android.content.pm.PackageManager;

import android.database.Cursor;

import android.net.Uri;

import android.widget.Toast;

import java.util.ArrayList;import java.util.TimeZone;

public class CalendarHelper {

private static final int QUERY = 1;

private static final int INSERT = 2;

private Context mContext;

private MyAsyncQueryHandler mAsyncQueryHandler;

private ArrayList aList = new ArrayList();

private int insertCount;//一次性添加日历事件的个数

private int insertCompleteCount;//当天添加的第几个日历事件

private OnCalendarQueryCompleteListener onCalendarQueryComplete;

private ArrayList titleArrayList = new ArrayList();

private static final String ERROR_PERMISSION = "请到【设置】检查,日历权限是否打开。";

public CalendarHelper(Context context){

this.mContext = context;

mAsyncQueryHandler = new MyAsyncQueryHandler(mContext.getContentResolver());

}

/**

* 查询添加的日历事件

* @param titles

*/

public void queryTitlesEvent(ArrayList titles){

if(!hasCalendarPermission()){

Toast.makeText(mContext, ERROR_PERMISSION, Toast.LENGTH_SHORT).show();

return;

}

int size = titles.size();

if(size == 0){

return;

}

Uri eventUri = Uri.parse("content://com.android.calendar/events");

/*if(Build.VERSION.SDK_INT>=14){

eventUri = Events.CONTENT_URI;

}else {

eventUri = Uri.parse("content://com.android.calendar/events");

}*/

String[] strs = new String[size];

//deleted=0表示该日历事件未删除,deleted=1表示该日历事件已删除

mAsyncQueryHandler.startQuery( QUERY, null, eventUri, new String[]{"title"}, "title IN ("+getStrAry(size)+")" + " and " + "deleted=0", titles.toArray(strs), null);

}

/**

* 当查询日历完成后调用,用来看看是否已经成功添加到系统中了

* @param token

* @param cookie

* @param cursor

*/

private void onCalendarQueryComplete(int token, Object cookie, Cursor cursor){

try{

while(cursor.moveToNext()){

aList.add(cursor.getString(cursor.getColumnIndex("title")));

}

}catch (Exception e){

e.printStackTrace();

}finally {

if(cursor != null){

cursor.close();

}

if(onCalendarQueryComplete != null ){

onCalendarQueryComplete.onQueryComplete(aList);

}

}

}

/**

* 添加日历事件

* @param calendarEvents

* @param onCalendarQueryCompleteListener

*/ public void insertEvent2Calendar(ArrayList calendarEvents, OnCalendarQueryCompleteListener onCalendarQueryCompleteListener){

if(!hasCalendarPermission()){

Toast.makeText(mContext, ERROR_PERMISSION, Toast.LENGTH_SHORT).show();

return;

}

this.onCalendarQueryComplete = onCalendarQueryCompleteListener;

insertCount = calendarEvents.size();

String eventUriString = "content://com.android.calendar/events";

for (int i = 0; i < insertCount; i++) {

ContentValues values = new ContentValues();

CalendarEvent c = calendarEvents.get(i);

titleArrayList.add(c.getTitleString());

values.put("calendar_id", 1);

values.put("title", c.getTitleString());

values.put("description", c.getDescription());

values.put("dtstart", c.getStartTimeInMillis());

values.put("dtend", c.getEndTimeInMillis());

values.put("eventTimezone", TimeZone.getDefault().getID());

values.put("hasAlarm", 1);

try {

mAsyncQueryHandler.startInsert(c.getMinutes(), c.isNeedReminder(), Uri.parse(eventUriString), values);

} catch (Exception e) {

e.printStackTrace();

}

}

}

private void onCalendarInsertComplete(int minutes, Object needRemind, Uri eventUri) {

insertCompleteCount ++;

if(eventUri == null){

if(insertCompleteCount == 1){

Toast.makeText(mContext, ERROR_PERMISSION, Toast.LENGTH_SHORT).show();

}

return;

}

if((Boolean)needRemind){

ContentValues values = new ContentValues();

String reminderUriString = "content://com.android.calendar/reminders";

long eventID = Long.parseLong(eventUri.getLastPathSegment());

values.put("event_id", eventID);

values.put("minutes", minutes);

values.put("method", 1);

try {

mAsyncQueryHandler.startInsert(0, false, Uri.parse(reminderUriString), values);

} catch (Exception e) {

e.printStackTrace();

}

}

if(insertCompleteCount == insertCount && onCalendarQueryComplete != null){

queryTitlesEvent(titleArrayList);

}

}

private class MyAsyncQueryHandler extends AsyncQueryHandler {

public MyAsyncQueryHandler(ContentResolver cr) {

super(cr);

}

@Override

protected void onQueryComplete(int token, Object cookie, Cursor cursor) {

onCalendarQueryComplete(token, cookie, cursor);

super.onQueryComplete(token, cookie, cursor);

}

@Override

protected void onInsertComplete(int token, Object cookie, Uri uri) {

onCalendarInsertComplete(token, cookie, uri);

super.onInsertComplete(token, cookie, uri);

}

}

public void setOnCalendarQueryComplete(OnCalendarQueryCompleteListener onCalendarQueryComplete){ this.onCalendarQueryComplete = onCalendarQueryComplete;

}

public interface OnCalendarQueryCompleteListener{

void onQueryComplete(ArrayList insertSuccess);

}

//String title, String description, long startTimeInMillis, long endTimeInMillis, Boolean needReminder, Integer minutes public class CalendarEvent {

private String titleString;//添加的日历事件名称

private String description;//日历事件名称的描述

private long startTimeInMillis;//日历开始时间毫秒值

private long endTimeInMillis;//日历结束时间毫秒值

private boolean needReminder;//是否需要闹铃提醒

private int minutes;//日历开始时间提前多久提醒

public CalendarEvent(String titleString, String description,

long startTimeInMillis, long endTimeInMillis,

boolean needReminder, int minutes) {

super();

this.titleString = titleString;

this.description = description;

this.startTimeInMillis = startTimeInMillis;

this.endTimeInMillis = endTimeInMillis;

this.needReminder = needReminder;

this.minutes = minutes;

}

public String getTitleString() {

return titleString;

}

public void setTitleString(String titleString) {

this.titleString = titleString;

}

public String getDescription() {

return description;

}

public void setDescription(String description) {

this.description = description;

}

public long getStartTimeInMillis() {

return startTimeInMillis;

}

public void setStartTimeInMillis(long startTimeInMillis) {

this.startTimeInMillis = startTimeInMillis;

}

public long getEndTimeInMillis() {

return endTimeInMillis;

}

public void setEndTimeInMillis(long endTimeInMillis) {

this.endTimeInMillis = endTimeInMillis;

}

public boolean isNeedReminder() {

return needReminder;

}

public void setNeedReminder(boolean needReminder) {

this.needReminder = needReminder;

}

public int getMinutes() {

return minutes;

}

public void setMinutes(int minutes) {

this.minutes = minutes;

}

}

private String getStrAry(int amount){

String string = "";

for (int i = 0; i < amount; i++) {

string = string + ( i== amount-1 ? "?" : "?,");

}

return string;

}

/**

* 判断是否提供了修改日历内容的权限

* @return

*/ private boolean hasCalendarPermission(){

return PackageManager.PERMISSION_GRANTED == mContext.getPackageManager().checkPermission("android.permission.READ_CALENDAR", mContext.getPackageName()); }}

MainActivity中使用demo

package com.example.asia.canlendartest;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;import android.view.View;

import android.widget.Toast;import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

}

public void insertEvent2Calendar(View view) {

CalendarHelper calendarHelper = new CalendarHelper(this);

//String title, String description, long startTimeInMillis, long endTimeInMillis, Boolean needReminder, Integer minutes

final String title1 = "我是日历标题1";

final String title2 = "我是日历标题2";

//创建日历事件1

CalendarHelper.CalendarEvent calendarEvent1 = calendarHelper.new CalendarEvent(

title1,

"我是日历标题1的详细描述",

Tools.date2Millis("2017-01-05-09-30-00", "yyyy-MM-dd-HH-mm-ss"),

Tools.date2Millis("2017-01-05-19-30-00", "yyyy-MM-dd-HH-mm-ss"),

true, 0);

//创建日历事件2

CalendarHelper.CalendarEvent calendarEvent2 = calendarHelper.new CalendarEvent(

title2,

"我是日历标题2的详细描述",

Tools.date2Millis("2017-01-05-20-23-00", "yyyy-MM-dd-HH-mm-ss"),

Tools.date2Millis("2017-01-05-21-10-00", "yyyy-MM-dd-HH-mm-ss"),

true, 0);

ArrayList arrayList = new ArrayList();

arrayList.add(calendarEvent1);

arrayList.add(calendarEvent2);

//将日历事件添加到系统日历中

calendarHelper.insertEvent2Calendar(arrayList, new CalendarHelper.OnCalendarQueryCompleteListener() {

@Override

public void onQueryComplete(ArrayList aList) {

if(aList.contains(title1) || aList.contains(title2)){

Toast.makeText(MainActivity.this, "添加日历成功", Toast.LENGTH_SHORT).show();

}else {

Toast.makeText(MainActivity.this, "添加日历失败", Toast.LENGTH_SHORT).show();

}

}

});

}

}

Tools

public class Tools {

/**

* 日期转毫秒

* @param dateStr

* @param dateFormat

* @return

*/

public static long date2Millis(String dateStr, String dateFormat){

SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);

try{

long millis = sdf.parse(dateStr).getTime();

return millis;

}catch (Exception e){

e.printStackTrace();

return 0;

}

}

}

反正在我们现在的项目中没有什么问题,不过貌似对某些机型有兼容性问题,大概是测试给我的一个索尼的手机。没办法,舍小家为大家了。那个索尼的兼容性的bug修不好,就搁置了。。其他的手机暂时没发现什么问题。

device-2017-01-05-202332.png

device-2017-01-05-202341.png

android 添加系统日历事件,添加系统日历事件相关推荐

  1. android 添加日程失败,Android向系统日历中添加日程事件

    总结 在项目开发中,我们有预约提醒.定时提醒需求时,可以使用系统日历来辅助提醒: 通过向系统日历中写入事件.设置提醒方式(闹钟),实现到时间自动提醒的功能: 好处:由于提醒功能是交付给系统日历来做,不 ...

  2. Android添加系统日历提醒,并从项目日历查看添加的事件<日历 111>(带效果图)

    前言 今天写一个从代码中添加系统日历提醒的功能,(分两篇,一个添加到系统日历,一个从手机上能直接查看) 一.话不多说,先看效果 这个是项目中的日历以及日历事件展示 这个是系统日历以及事件展示 可以看的 ...

  3. Android向系统日历中添加日程事件

    总结 在项目开发中,我们有预约提醒.定时提醒需求时,可以使用系统日历来辅助提醒: 通过向系统日历中写入事件.设置提醒方式(闹钟),实现到时间自动提醒的功能: 好处:由于提醒功能是交付给系统日历来做,不 ...

  4. Android 在系统日历中添加日程

    在项目开发过程中,有时会有预约提醒.定时提醒等需求,这时我们可以使用系统日历来辅助提醒.通过向系统日历中写入事件.设置提醒方式(闹钟),实现到达某个特定的时间自动提醒的功能.这样做的好处是由于提醒功能 ...

  5. android系统闹铃添加方法,Android 设置系统闹铃和日历

    一.创建定时器 设置权限 案例 https://developer.android.com/reference/android/provider/AlarmClock.html#EXTRA_MESSA ...

  6. android 日历事件添加日程

    android 日历事件添加日程 最近公司项目测出bug-----问题是 小米和华为手机 如果锁屏或者杀死APP 闹钟服务不会有反应...就是 恩 死了-这就很尴尬了-问了下好几个群的群友..都说 小 ...

  7. xp系统怎样添加桌面计算机名,教你win10系统电脑桌面怎么添加日历

    很多用户都会选择在电脑的桌面上建立一个日历小挂件来提醒自己,其实在电脑桌面添加日历,可防止用户耽误工作进程的安排,不知win10系统电脑桌面怎么添加日历的用户,请来看看下面的介绍吧. 日历对很多用户来 ...

  8. win10计算机里的工具在哪里设置,win10系统桌面上添加自带日历小工具的设置办法...

    win10系统使用久了,好多网友反馈说关于对win10系统桌面上添加自带日历小工具设置的方法,在使用win10系统的过程中经常不知道如何去对win10系统桌面上添加自带日历小工具进行设置,有什么好的办 ...

  9. 如何发布日历提醒推送消息服务器,iOS开发 -- 通过app向手机自带的日历中添加事件提醒...

    在如今实际开发中,我们会有一种需求---通过自己的app往系统自带的日历中添加提醒事件. 一: 首先上最后效果图: WechatIMG7.jpeg 下图是关于添加事件的详情 WechatIMG8.jp ...

最新文章

  1. 无法激活“Pylance“扩展, 因为它依赖于未加载的 Python 扩展。解决办法
  2. Unity3D 多平台 预编译 宏定义
  3. Python-描述符
  4. Spring Boot Admin 集成诊断利器 Arthas 实践
  5. Python面向对象(二)
  6. 数据结构之树:树的介绍——9
  7. beijing olympics - a travesty
  8. python 1+2+3+4+5+6+7+8+9累加求和_求1!+2!+3!+4!+5!+6!+7!+8!+9!+10!+...+N! N阶阶乘求和算法 JAVA C Python...
  9. MySQL架构设计相关的方式方法和软件介绍
  10. artcam 9.0英文版本下载_Jenkins版本升级(修复漏洞)
  11. Hadoop入门到精通(不断更新中。。。。)
  12. jquery中的trigger()和preventDefault()方法
  13. 如何从Linux里面下载软件
  14. 计算机上无开根号功能 怎么计算机,中级会计师无纸化考试计算器怎么开根号?...
  15. kdj的matlab代码,8个字符的Kdj股票技术指标公式源代码(插图)
  16. 联想拯救者 Lenovo Legion 通电自启 插电自启 通电开机 插电开机 Wake on AC
  17. 新书推荐 |《3D用户界面设计与评估》
  18. 常用工具:IDEA、vs code、Navicat、Postman、HBuilderX、微信开发者工具
  19. 黄一老师:财商思维、信用融资能对你有什么帮助?
  20. 没想到Spring Boot + Vue 竟如此简单!

热门文章

  1. 在J1939中多帧数据如何发送,它是通过TP.CM_BAM和TP_DT报文发送
  2. java 索引数组_Java的数组索引问题
  3. SpringBoot从入门到精通教程(八):集成ElasticSearch
  4. 你离顶尖游戏大厂只差这份招面试攻略啦
  5. shell一键生成密钥脚本
  6. C语言 第十二章 文件
  7. SCJP刷题学习笔记(Part four)
  8. TypeScript(ts)笔记总结01
  9. VUE 百度离线地图的下载与使用
  10. Jxta 命令 shell