产品经理要求添加日历事件,并给此事件增加日历闹钟提醒功能,MIUI系统闹钟提醒无法自动设置,而oppo/vivo中日历中也没有闹钟提醒的功能。
解决思路
1)查找数据库表结构是否存在提醒字段
Android日历相关数据库位于/data/data/com.android.providers.calendar/databases,日历事件存储数据库为Calendar.db中的Events表,提醒数据存储为Reminders表中。我们可以通过如下代码查看表结构
sqlite3 calendar.db
.tables
在Events表中找到一个叫做hasAlarm的字段,值为0或1。把功能添加后发现,有提醒功能,但是不满足产品需求,因为它在MIUI上只会在屏幕底部弹出对话框,并没有触发闹钟提醒。
2)查看设置成功和未设置成功的数据库区别
小米日历中存在日程提醒设置的功能,到点就可以闹钟提醒。打算看看我的数据和它的数据有什么区别。对比两者发现,除了Calendar.Events表中的mutators存在差异,别的字段都类似,小米日历修改的mutators多了日历的包名。
怀疑小米日历对修改包名进行了限制,尝试手动伪装日历包名进行修改,即插入提醒时把日历包名添加到mutators字段中,结果还是没有成功,怀疑该功能配置项配置在其他表结构中或者文件中。
3)查看Calendar.db的其他表找线索
查找Calendar剩余表发现ExtendedPorperties表中存在差异,value字段存在关于闹钟提示的相关标识。小米日历添加闹钟提醒的事件的value字段为{"need_alarm":true},经修改最终成功实现此功能。
结论
Calendar.db的Event表中存在hasAlarm字段标识闹钟提醒,但是可能存在什么问题导致无法使用,因此华为和OPPO没有实现相关功能。
但是小米通过其他方式进行实现,MIUI控制闹钟提示不是按照传统的EVENT表中的HAS_ALARM字段,而是ExtendedPorperties中的value字段,通过{"need_alarm":true}标识。
因此添加日历提醒功能要同时对Event、Reminders、ExtendedPorperties三者进行操作