这篇文章的目的

写这篇文章的目的,主要是为了记录在日历事件中遇到的2个比较少见,在网上比较难查找资料的问题。

应用背景:

在应用中通过ContentProvider操作系统日历,向系统日历中添加、更新、删除日程事件。

所以应用中的日程事件,是与系统日历中的事件同步的。

问题1:

为应用不同的登录账号添加日历账号,用此日历账号在应用中添加日程事件,然后应用切换账号,日程事件消失。

问题2:

删除日历事件后,系统日历中已经删除,但在应用中通过ContentProvider还能查询到(小米、魅族、联想一些国产手机没有这个问题,三星有)。

Calendar Provider的详细操作,参见官方文章:

http://developer.android.com/guide/topics/providers/calendar-provider.html

对应的中文译文:

http://www.cnblogs.com/popapa/p/android_calendar-provider.html#sync-adapter

问题1

问题描述:

为应用不同的登录账号添加日历账号,用此日历账号在应用中添加日程事件,然后应用切换账号,日程事件消失。

问题原因:

这个问题,应该是(猜想)和Android系统日历的账号管理有关。

在项目中,添加日历账号的代码如下所示

private long addCalendarAccount(Context context) {

boolean has_permission = Utils.hasPermission(context, "android.permission.WRITE_CALENDAR");

if (!has_permission) {

Utils.toast(context, R.string.calendar_disable_hint);

return -1;

}

TimeZone timeZone = TimeZone.getDefault();

ContentValues value = new ContentValues();

value.put(Calendars.NAME, CALENDARS_NAME);

value.put(Calendars.ACCOUNT_NAME, CALENDARS_ACCOUNT_NAME);

value.put(Calendars.ACCOUNT_TYPE, CalendarContract.ACCOUNT_TYPE_LOCAL);

value.put(Calendars.CALENDAR_DISPLAY_NAME, CALENDARS_DISPLAY_NAME);

value.put(Calendars.VISIBLE, 1);

value.put(Calendars.CALENDAR_COLOR, Color.BLUE);

value.put(Calendars.CALENDAR_ACCESS_LEVEL, Calendars.CAL_ACCESS_OWNER);

value.put(Calendars.SYNC_EVENTS, 1);

value.put(Calendars.CALENDAR_TIME_ZONE, timeZone.getID());

value.put(Calendars.OWNER_ACCOUNT, CALENDARS_ACCOUNT_NAME);

value.put(Calendars.CAN_ORGANIZER_RESPOND, 0);

Uri calendarUri = Uri.parse(uri);

calendarUri = calendarUri.buildUpon().appendQueryParameter(CALLER_IS_SYNCADAPTER, "true")

.appendQueryParameter(Calendars.ACCOUNT_NAME, CALENDARS_ACCOUNT_NAME)

.appendQueryParameter(Calendars.ACCOUNT_TYPE, CalendarContract.ACCOUNT_TYPE_LOCAL).build();

Uri result = context.getContentResolver().insert(calendarUri, value);

long id = result == null ? -1 : ContentUris.parseId(result);

return id;

}

有一句设置账号类型的代码:

value.put(Calendars.ACCOUNT_TYPE, CalendarContract.ACCOUNT_TYPE_LOCAL);

其中Calendars.ACCOUNT_TYPE的说明如下图:

说明中有一句英文:

A type of ACCOUNT_TYPE_LOCAL will keep this event form being deleted if there are no matching accounts on the device.

大意是:

当ACCOUNT_TYPE为ACCOUNT_TYPE_LOCAL时,可以防止在设备中没有找到账号时日程事件被删除。

解决方案:

因此,问题1的解决方案就是设置ACCOUNT_TYPE为ACCOUNT_TYPE_LOCAL:

value.put(Calendars.ACCOUNT_TYPE, CalendarContract.ACCOUNT_TYPE_LOCAL);

问题2

问题描述:

删除日历事件后,系统日历中已经删除,但在应用中通过ContentProvider还能查询到(小米、魅族、联想一些国产手机没有这个问题,三星有)。

这个问题,在网上找了很长时间,都没有找到相应的资料,在最后快要放弃的时候,在Stackoverflow上找到了解决办法。

http://stackoverflow.com/questions/22554130/calendar-deleted-event-exists-in-cursor

其实问题修改起来很简单,因为日程事件删除之后,系统并没有真的删除,只是对把标示删除的字段改了而已,也就是只做了逻辑删除,而没有做物理删除。

小米、魅族、联想一些国产手机没有这个问题的原因,可能是国产手机的系统定制化高,查询的时候,已经对这个问题进行了处理,而三星没有处理。

其实这个问题,如果会阅读源码的话,花些时间,放些耐心应该是可以从源码中分析出来的,所有阅读源码还是很有必要的。

解决方案:

清楚问题原因之后,解决方案其实很简单,就是查询的时候,再过滤一下,增加查询条件(deleted != 1)就OK了。

比如应用中查询的代码

private void fillData(Context context, String selection,

String[] selectionArgs, ListcalendarEvents) {

selection+=" and (deleted != 1)";

Cursor cursor = context.getContentResolver().query(Uri.parse(eventUri),null, selection, selectionArgs, null);

if (cursor.moveToFirst()) {

do {

CalendarEvent calendarEvent=new CalendarEvent();

String title = cursor.getString(cursor.getColumnIndex(Events.TITLE));

String description = cursor.getString(cursor.getColumnIndex(Events.DESCRIPTION));

String repeat = cursor.getString(cursor.getColumnIndex(Events.RRULE));

long eventId = cursor.getLong(cursor.getColumnIndex(Events._ID));

long beginTime = cursor.getLong(cursor.getColumnIndex(Events.DTSTART));

long endTime = cursor.getLong(cursor.getColumnIndex(Events.DTEND));

int remind = getRemindMunites(context, eventId);

calendarEvent.setEventId(eventId);

calendarEvent.setDescription(description);

calendarEvent.setTitle(title);

calendarEvent.setBeginTime(beginTime);

calendarEvent.setEndTime(endTime);

calendarEvent.setRemind(remind);

calendarEvent.setRepeat(repeat);

calendarEvent.setCalendarId(cursor.getLong(cursor.getColumnIndex(Events.CALENDAR_ID)));

calendarEvents.add(calendarEvent);

} while (cursor.moveToNext());

}

cursor.close();

}

结束

文章就写到这里,附上添加、修改、删除日程时间完整Demo,点击下载。

如果需要查询日程时间操作的详细资料,参见官方文章:

http://developer.android.com/guide/topics/providers/calendar-provider.html

对应的中文译文:

http://www.cnblogs.com/popapa/p/android_calendar-provider.html#sync-adapter

android 仿三星周日历,Android Calendar Provider(日历事件)相关推荐

  1. 日历 android 周历,Android Studio 基础 之 获取系统Calendar 日历日程 (涉及指定日期时间判断是星期几的方法使用)的方法整理...

    Android Studio 基础 之 获取系统Calendar 日历日程 (涉及指定日期时间判断是星期几的方法使用)的方法整理 目录 Android Studio 基础 之 获取系统Calendar ...

  2. android 自定义周日历,CalendarView

    CalenderView Android上一个非常优雅.高度自定义.性能高效的日历控件,完美支持周视图,支持标记.自定义颜色.农历等,任意控制月视图显示.任意日期拦截条件.自定义周起始等.Canvas ...

  3. android 日历仿IOS,基于Android week view仿小米和iphone日历效果

    前言 最近由于项目需求,要做一个仿小米日历的功能,下面显示一天的日程,header以周为单位进行滑动,github上找了很久也没有找到合适的,但找到一相近的开源项目Android-week-view, ...

  4. android谷歌补丁日期,在谷歌日历Android中添加开始日期和结束日期之间所有日期的事件...

    在谷歌日历 Android中添加开始日期和结束日期之间所有日期的事件.我希望每3个月剩余一次,直到结束日期. 这是我的功能 public void addEvent1(Context ctx, Str ...

  5. datetimepicker一个不错的日历android特效

    datetimepicker一个不错的日历效,选中和选择日历效果都很不错, 实用的时候直接可以把datetimepicker-library这个引入到项目,调用的地方在实现 TimePickerDia ...

  6. android gridview日历,Android使用GridView实现日历的方法

    在开发中可能会遇到某些情况下需要用到日历的功能,并且还要在日历上加标签什么的,最重要的就是android自带的日历由于各个系统版本不同导致日历的样式也不同,这样就会导致使用起来比较麻烦..而且在日历中 ...

  7. android+高仿+日历,Android开源的精美日历控件,热插拔设计的万能自定义UI

    UI框架应该逻辑与界面实现分离,该日历控件使用了热插拔的设计 ,简单几步即可实现你需要的UI效果,热插拔的思想是你提供你的实现,我提供我的插座接口,与自定义Behavior是一样的思想. 听说第一页无 ...

  8. android 人生日历,android版人生日历日子怎么用 安卓版人生日历日子使用教程

    人生日历android版新发3.3.05.10版本,新增日子功能,那么android版人生日历日子怎么用呢?今天小编就为大家分享安卓版人生日历日子使用教程,一起来看看吧! 人生日历的日子,设计成四叶草 ...

  9. android 人生日历,人生日历Android版 功能初体验

    千呼万唤始出来,人生日历终于发布手机Android版本了.下面跟随小编一起体验一下它的各个功能吧. 在手机屏幕上打开人生日历,进入程序之后,就会出现如下界面.进入界面简单美观,淡蓝色底色调,延续了人生 ...

最新文章

  1. How to run CAB file
  2. 【正一专栏】欧冠决赛点评——只服齐达内,送别布冯
  3. cadence原理图软件(orcad)层级原理图与位号
  4. L2-005 集合相似度-PAT团体程序设计天梯赛GPLT
  5. JAVA实现WC.exe功能
  6. Exception in thread main org.apache.thrift.transport.TTransportException: Could not create ServerS
  7. 中国女性补体面膜市场趋势报告、技术动态创新及市场预测
  8. Python(23)_while循环
  9. 使用 .NET HttpClient 下载 PDF 文件的DEMO
  10. Excel字符串拼接
  11. 微信域名防封接口开发
  12. 麻省理工学院(MIT)发明漏洞自动修复系统
  13. LVGL8.2学习笔记
  14. 照片后期-lightroom常用调色常见参数解
  15. 学生托管班_托管班一般多少钱一个月
  16. SQLServer数据库开发
  17. abp+dapper+mysql_abp集成abp.Dapper
  18. 电力系统频率 matlab,低频减载的MATLAB仿真模型
  19. Square, Inc.宣布拟收购Tidal多数股权
  20. prometheus数据结构和压缩原理讲解

热门文章

  1. 火星财经“POW'ER 2019全球开发者大会”在京成功举办,中国版“Consensus大会”呼之欲出
  2. 为什么选择微服务架构? 微服务架构的10个核心优势 总结
  3. 基于PHP的中华诗歌网的设计与实现
  4. exsi虚拟化一站式
  5. 中国第一封 AR 大学通知书;PHP 7.2.0 alpha3 发布
  6. e2fsck -y 故障_普通话纠音 | 晕车:yūn chē还是yùn chē?
  7. Android学习笔记(18)————利用tts开发一个android发音字典
  8. UITextField 双击让复制粘贴英文键改为中文键
  9. NCBI(pubmed)里医学主题词(MeSH)完整词库获取
  10. 软件工程期末考试----综合分析设计题