最近在写APP读写系统日历,遇到不少坑,总结一下。
1.个别手机无法读写系统日历。
2.添加了日历账户,过不久会自动消失。
3.一个事件如何添加多个提醒。
下面一一解答:
1.个别手机无法读写系统日历:其他手机都可以读写系统日历,但红米NOTE无法读写,首先确认了读写日历的权限已经添加完成(高版本获取权限的方法自行百度)。本人也下载了很多其他日历相关的应用,在红米NOTE上都可以读写到系统日历,由此确认肯定是我代码问题。但是搜遍网上的资料,读写操作都是那几个步骤,我写的也没什么不一样的,怎么就执行不了呢?反复对比自己的应用和别人的应用有什么不同,发现别人都会先询问是否允许访问系统日历,需要显示天气信息的时候会询问定位权限。我的却只询问了是否允许访问位置。允许访问位置之后就直接进入了主页,而我的主页也是同时用到了定位和日历读写,却只询问了一种权限的授权。到设置的应用授权页面查看授权信息,果然我的应用没有开日历的读写权限!至此真相大白,手动开启之后读写日历正常。但怎么解决授权问题呢。放到两步操作中分开获取就好了!由于我们的没有操作,都是自动获取,所以本人把定位权限放到了启动页获取。
2.添加了日历账户,过不久会自动消失:
查看源码:
/**
* A special account type for calendars not associated with any account.
* Normally calendars that do not match an account on the device will be
* removed. Setting the account_type on a calendar to this will prevent it
* from being wiped if it does not match an existing account.
*
* @see SyncColumns#ACCOUNT_TYPE
*/
public static final String ACCOUNT_TYPE_LOCAL = "LOCAL";
注意注释部分,不懂的找百度翻译,
/**
*用于与任何帐户都不关联的日历的特殊帐户类型。
*通常情况下,与设备上的帐户不匹配的日历将
*远离的。将日历上的account_type设置为此将阻止它
*如果与现有帐户不匹配,则不会被删除。
*/
所以设置账户时账户类型设置为本地即可CalendarContract.ACCOUNT_TYPE_LOCAL
value.put(CalendarContract.Calendars.ACCOUNT_TYPE, CalendarContract.ACCOUNT_TYPE_LOCAL);// 账户类型
3.一个事件如何添加多个提醒:循环添加事件提醒:
网上的资料都是千篇一律的,给一个事件添加一个提醒,如下
ContentResolver cr = getContentResolver();
ContentValues values = new ContentValues();
values.put(Reminders.MINUTES, 15);
values.put(Reminders.EVENT_ID, eventID);
values.put(Reminders.METHOD, Reminders.METHOD_ALERT);
Uri uri = cr.insert(Reminders.CONTENT_URI, values);
但是我这个人比较笨,不会举一反三,一直在找如何添加多个提醒呢??
注意到源码中说,下表列出了Reminders表的可写字段。当插入一个新的提醒时,必须包含所有这些字段。
一个提醒对应一个事件,一个事件对应多个提醒,以eventId相关联。那多插入几次不就完了吗,所以一个循环搞定,将minutes的值动态设置成自己需要提醒的时间就可以了。