不想看教程的可以直接走这里的后门去下载源码(源码已更新),源码小米手机亲测通过,有问题可以私信我:源码下载https://download.csdn.net/download/Spy003/87418013

不想下载,那就接着往下看教程,教程有点多,请耐心阅读。

项目有个新需求,就是app需要调用插入安卓系统日历日程提醒,过程中遇到了不少问题,先来看看如何实现向日历中插入日程提醒:

1、首先实现插入日程提醒,上关键代码

    private static String CALENDARS_NAME = "Time Bag";private static String CALENDARS_ACCOUNT_NAME = "Time Bag";private static String CALENDARS_ACCOUNT_TYPE = "com.example.timebag";/*** 这里创建账户的展示名称,系统日历为我们提供了创建账户的入口,那我们就不使用系统自带的账户,创建一个自己app的账户*/private static String CALENDARS_DISPLAY_NAME = "时间锦囊";/*** 检查是否已经添加了日历账户,如果没有添加先添加一个日历账户再查询* 获取账户成功返回账户id,否则返回-1*/@RequiresApi(api = Build.VERSION_CODES.N)private static int checkAndAddCalendarAccount(Context context) {int oldId = checkCalendarAccount(context);if (oldId >= 0) {return oldId;} else {long addId = addCalendarAccount(context);if (addId >= 0) {return checkCalendarAccount(context);} else {return -1;}}}/*** 检查是否存在现有账户,存在则返回账户id,否则返回-1*/@SuppressLint("Range")private static int checkCalendarAccount(Context context) {Cursor userCursor = context.getContentResolver().query(CalendarContract.Calendars.CONTENT_URI, null, null, null, null);try {if (userCursor == null) { //查询返回空值return -1;}int count = userCursor.getCount();if (count > 0) { //存在现有账户,取第一个账户的id返回for (int i = 0;i<=count-1;i++){if (i==0){userCursor.moveToFirst();} else {userCursor.moveToNext();}String type = userCursor.getString(userCursor.getColumnIndex(CalendarContract.Calendars.ACCOUNT_TYPE));if (type.equals(CALENDARS_ACCOUNT_TYPE)) {return userCursor.getInt(userCursor.getColumnIndex(CalendarContract.Calendars._ID));}}}return -1;} finally {if (userCursor != null) {userCursor.close();}}}/*** 添加日历账户,账户创建成功则返回账户id,否则返回-1*/private static long addCalendarAccount(Context context) {TimeZone timeZone = TimeZone.getDefault();ContentValues value = new ContentValues();value.put(CalendarContract.Calendars.NAME, CALENDARS_NAME);value.put(CalendarContract.Calendars.ACCOUNT_NAME, CALENDARS_ACCOUNT_NAME);value.put(CalendarContract.Calendars.ACCOUNT_TYPE, CALENDARS_ACCOUNT_TYPE);value.put(CalendarContract.Calendars.CALENDAR_DISPLAY_NAME, CALENDARS_DISPLAY_NAME);value.put(CalendarContract.Calendars.VISIBLE, 1);value.put(CalendarContract.Calendars.CALENDAR_COLOR, Color.BLUE);value.put(CalendarContract.Calendars.CALENDAR_ACCESS_LEVEL, CalendarContract.Calendars.CAL_ACCESS_OWNER);value.put(CalendarContract.Calendars.SYNC_EVENTS, 1);value.put(CalendarContract.Calendars.CALENDAR_TIME_ZONE, timeZone.getID());value.put(CalendarContract.Calendars.OWNER_ACCOUNT, CALENDARS_ACCOUNT_NAME);value.put(CalendarContract.Calendars.CAN_ORGANIZER_RESPOND, 0);Uri calendarUri = CalendarContract.Calendars.CONTENT_URI;calendarUri = calendarUri.buildUpon().appendQueryParameter(CalendarContract.CALLER_IS_SYNCADAPTER, "true").appendQueryParameter(CalendarContract.Calendars.ACCOUNT_NAME, CALENDARS_ACCOUNT_NAME).appendQueryParameter(CalendarContract.Calendars.ACCOUNT_TYPE, CALENDARS_ACCOUNT_TYPE).build();Uri result = context.getContentResolver().insert(calendarUri, value);long id = result == null ? -1 : ContentUris.parseId(result);return id;}/*** 这个是关键方法,调用插入日程提醒* @param context* @param title 提醒事件标题* @param description 事件描述* @param reminderTime 任务开始时间,这里参数名不太合适,后面会加提醒时间,* @param endTime 任务结束时间* @param previousMinutes 提前多少分钟提醒,后续使用*/@RequiresApi(api = Build.VERSION_CODES.N)@SuppressLint("Range")public static void addCalendarEvent(Context context, String title, String description, long reminderTime, long endTime, int previousDate) {if (context == null) {return;}int calId = checkAndAddCalendarAccount(context); //获取日历账户的idif (calId < 0) { //获取账户id失败直接返回,添加日历事件失败return;}//添加日历事件Calendar mCalendar = Calendar.getInstance();mCalendar.setTimeInMillis(reminderTime);//设置开始时间long start = mCalendar.getTime().getTime();mCalendar.setTimeInMillis(endTime);//设置终止时间long end = mCalendar.getTime().getTime();ContentValues event = new ContentValues();event.put("title", title);event.put("description", description);event.put("calendar_id", calId); //插入账户的idevent.put("eventStatus", 1);event.put(CalendarContract.Events.HAS_EXTENDED_PROPERTIES,true);event.put(CalendarContract.Events.DTSTART, start);event.put(CalendarContract.Events.DTEND, end);event.put(CalendarContract.Events.HAS_ALARM, 1);//设置有闹钟提醒,但是经测试,此方案无效event.put(CalendarContract.Events.EVENT_TIMEZONE, TimeZone.getDefault().getDisplayName());//这个是时区,必须有Uri newEvent = context.getContentResolver().insert(CalendarContract.Events.CONTENT_URI, event); //添加事件if (newEvent == null) { //添加日历事件失败直接返回return;}//事件提醒的设定ContentValues values = new ContentValues();values.put(CalendarContract.Reminders.EVENT_ID, ContentUris.parseId(newEvent));values.put(CalendarContract.Reminders.MINUTES, 0);// 提前previousDate天有提醒values.put(CalendarContract.Reminders.METHOD, CalendarContract.Reminders.METHOD_ALERT);Uri uri = context.getContentResolver().insert(CalendarContract.Reminders.CONTENT_URI, values);if (uri == null) { //添加事件提醒失败直接返回return;}}

到这里,我们调用 addCalendarEvent() 方法就可以实现创建了,这个方法有若干个参数,如果有需要还可以加,我们看到,其实创建日程提醒,就是执行了两次 insert 的数据库插入操作,插入的表分别是events和reminders。这里的调用是用了kotlin的写法,日期是毫秒数,开始时间加了10s,这样可以实现插入完成以后10s我们就能看到提醒。

addCalendarEvent(content,'测试插入日历标题','这是测试内容',(Date().time+10000),(Date().time+30000))

到这里我们就看到有日历通知了,而且是弹窗通知。但是这里有问题,就是我们的需求是实现闹钟提醒,我们看到在插入reminders表的时候,有一个字段叫hasAlarm,这个字段就是谷歌给留出来用于开启是否使用闹钟提醒的,但是这个字段明显没有用了,也许是年久失修吧,而且这里的资料少之又少,我摸索了两天,通过对安卓日历数据表的对比,才发现了关键,那就是日历提醒还设计另一个表,名字叫 ExtendedProperties ,这个表一共三个字段,这三个字段都很重要,都需要设置,event_id字段是用来绑定event事件的,这个id上面用到了,直接传进来就行。name字段也很重要,而且不能设置其他,否则也一样无法开启闹钟,value字段就直接决定是否开启闹钟了,直接看代码:

        //扩展属性,这个表有三个字段,更新以后的安卓系统对于三个字段的值都有要求,源码处有更新,有疑问也可以评论或者私聊,我全部无条件回复Uri extendedPropUri = CalendarContract.ExtendedProperties.CONTENT_URI;extendedPropUri = extendedPropUri.buildUpon().appendQueryParameter(CalendarContract.CALLER_IS_SYNCADAPTER,"true").appendQueryParameter(CalendarContract.Calendars.ACCOUNT_NAME, CALENDARS_ACCOUNT_NAME).appendQueryParameter(CalendarContract.Calendars.ACCOUNT_TYPE, CALENDARS_ACCOUNT_TYPE).build();ContentValues extendedProperties = new ContentValues();extendedProperties.put(CalendarContract.ExtendedProperties.EVENT_ID,ContentUris.parseId(newEvent));extendedProperties.put(CalendarContract.ExtendedProperties.VALUE,"{\"need_alarm\":true}");Uri uriExtended = context.getContentResolver().insert(extendedPropUri, extendedProperties);if (uriExtended == null) { //添加事件提醒失败直接返回return;}

然后到这里就实现了闹钟的添加,闹钟响起来了,我的心情也好起来了

不知道你会了没,如果嫌教程太麻烦,那就直接来下载源码吧,源码中还有一些周边方法,比如 遍历查看安卓数据库所有行列 条目内容的方法。源码小米手机亲测通过,有问题可以私信我:

源码下载https://download.csdn.net/download/Spy003/87418013

总结一下就是:设置日历弹窗提醒,只需要按照我上面说的,对events和reminders表进行插入就ok,如果需要开启闹钟的话,就需要插入第三个表ExtendedProperties。

提醒效果见下图:

源码下载https://download.csdn.net/download/Spy003/87418013

安卓调用日历提醒,并实现闹钟提醒功能,在miui上测试通过,日历提醒闹钟设置失败解决(附源码,源码已更新)相关推荐

  1. android 桌面提醒功能,安卓手机桌面上使用的工作提醒软件选择哪个?

    原标题:安卓手机桌面上使用的工作提醒软件选择哪个? 安卓手机可以说是目前手机市场的主力军,很多人的手机都是安卓系统,在辅助办公方面,手机上的工具也是比较多的.比如经常出差的人会将一些比较重要的备忘事项 ...

  2. android 打卡app,安卓手机上有打卡提醒app吗?

    原标题:安卓手机上有打卡提醒app吗? 对于很多职场人士而言,他们都是通过日常的打卡计算考勤,虽然这与他们的工资息息相关,但是即便如此,他们仍无法完全避免忘记打卡的状况,从而造成一些不必要的困扰.那么 ...

  3. Android记事本定时功能,安卓手机上怎么使用日历记事本?

    原标题:安卓手机上怎么使用日历记事本? 相信每天合理的日程安排对不少忙碌的上班族来说是比较重要的,顾名思义,日程的意思是对一天或一周.一个月等某一时间节点或时间段的计划与安排.有不少网友都知道想要设置 ...

  4. 桌面提醒 android,如何让手机桌面上显示便签提醒事项?

    原标题:如何让手机桌面上显示便签提醒事项? 如何让手机桌面上显示便签提醒事项? 手机桌面上显示便签提醒事项的方式太多了,不同系统的手机.不同品牌的手机.甚至不同型号的手机,在手机桌面上显示便签事项.备 ...

  5. 安卓调用系统录像功能:1、启动录像返回视频,2、启动录像将视频存储在指定路径下

    全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 安卓调用系统录像功能,两种方式获取拍摄的视频. 1.启动系统录像intent,并直接返回视频数据 2.启动系统录像intent,录像后存储在指定的路径 ...

  6. 安卓调用系统拍照功能:1、启动拍照返回图片,2、启动拍照,图片存储在指定路径下

    全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 安卓调用系统拍照功能,两种方式获取拍摄的照片. 1.启动系统拍照intent,并直接返回图片数据 2.启动系统拍照intent,拍照后存储在指定的路径 ...

  7. 安卓调用系统语音识别功能全解(谷歌语音服务):获取识别结果,使用语音识别进行搜索。

    全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 安卓调用系统语音识别功能全解(谷歌语音服务):获取识别结果,使用语音识别进行搜索. 首先要添加权限 <uses-permission andro ...

  8. 安卓调用系统相机进行拍照

    安卓调用系统相机进行拍照 调用系统相机进行拍照的话,步骤比较简单,分为两步 使用隐式Intent打开相机 在onActivityResult回调中对图片进行处理 (传回来的图片分为缩略图和原图,缩略图 ...

  9. 安卓调用系统相机拍照并返回,实现图片预览

    安卓调用相机拍照并返回预览及相关类型换(略缩图,画质糊)原图预览参考传送门 一.demo预览 二.xml代码和activity简单代码描述. 三.顺便写几个转换工具方法吧 今年主要在忙新项目,安卓也有 ...

最新文章

  1. Orchard之模版开发
  2. Qt Creator运行自动测试
  3. xfce4下面搜狗输入法默认按键设置
  4. python tvtk库_PyCharm创建虚拟环境 和 TVTK库的安装
  5. 微信和钉钉电脑客户端多开的解决方法(Windows 10)
  6. Linux uname 命令 打印系统信息
  7. JVM优化系列-JVM内存溢出的原因
  8. keil4调试时出现Error Flash Download failed - “Cortex-M4”问题
  9. C语言编写游戏的程序教程,用C语言写贪吃蛇游戏图文教程
  10. vue实时显示当前时间
  11. bootstrap-fileinput插件获取图片文件并展示,不进行上传
  12. 孩子必听的数学家故事——笛卡尔
  13. 人脑词典、亡者归来……来看库兹韦尔对于未来的四个疯狂预测
  14. Counting swaps
  15. LeetCode 216组合总和III 17电话号码的字母组合
  16. 数值修约程序(包括运算过程有效数字保留,Python3实现)
  17. 斗鱼扩展--拦截广告,让网页加载更快(四)
  18. 如何修改win7上的mac地址
  19. send message
  20. 验证千字文中有没有重复的字。

热门文章

  1. 720VR全景图片制作流程是什么?
  2. VMware虚拟机,环境搭建详解(傻瓜式教学)
  3. Python 辛普森积分法 simps计算常数的积分值,当上下限一致时的问题
  4. Vegas中文版下载方法:专业视频编辑软件分享
  5. download-git-repo 使用教程
  6. 设计产品超市智能计算机,基于物联网技术的智能超市的设计.doc
  7. Base64工具类(加密、解密)
  8. 实现一个简单的解释器(1)
  9. 《Linux那些事儿之我是USB》我是U盘(34)迷雾重重的批量传输(三)
  10. ps基础入门知识课程教程学习文字设计制作小白