Android端谷歌日历添加的事件10秒后自动删除问题求助
问题产生原因
- 硬编码CALENDAR_ID为1不符合系统规范:安卓设备中Calendar ID为1的日历不一定是当前用户可写入的有效日历,常见情况是该ID对应谷歌账户的同步日历,直接在本地插入的事件没有云端对应数据,谷歌同步服务刷新数据时会将其判定为无效脏数据自动删除;也有可能该ID对应只读日历、已废弃的旧日历,本身不支持持久化写入事件。
- 缺少必要的事件字段:系统日历提供器要求写入事件时携带部分标识字段,未配置的情况下事件会被同步逻辑判定为异常数据清理。
- 同步逻辑冲突:如果目标日历是第三方账户同步日历(比如谷歌、Exchange日历),本地直接操作ContentProvider插入的事件不会同步到对应服务端,同步校验时就会被服务端回删。
解决方案
- 先查询设备上合法的可写日历ID,禁止硬编码CALENDAR_ID:
查询代码示例:
val projection = arrayOf( CalendarContract.Calendars._ID, CalendarContract.Calendars.NAME, CalendarContract.Calendars.ACCOUNT_TYPE, CalendarContract.Calendars.CALENDAR_ACCESS_LEVEL ) // 筛选可编辑的日历 val selection = "${CalendarContract.Calendars.CALENDAR_ACCESS_LEVEL} >= ?" val selectionArgs = arrayOf(CalendarContract.Calendars.CAL_ACCESS_CONTRIBUTOR.toString()) val cursor = contentResolver.query( CalendarContract.Calendars.CONTENT_URI, projection, selection, selectionArgs, null ) cursor?.use { while (it.moveToNext()) { val calId = it.getLong(it.getColumnIndexOrThrow(CalendarContract.Calendars._ID)) val accountType = it.getString(it.getColumnIndexOrThrow(CalendarContract.Calendars.ACCOUNT_TYPE)) // 优先选择账户类型为本地日历(com.android.localcalendar)或者用户主日历,避免选到只读同步日历 } }
- 插入事件时补充必要字段,避免被同步逻辑误删:
在原有的ContentValues插入逻辑中新增以下参数:
// 标记事件为未同步,避免被同步服务直接清理 values.put(CalendarContract.Events.DIRTY, 1) // 标记当前用户为事件组织者 values.put(CalendarContract.Events.IS_ORGANIZER, 1) // 如果不需要同步到第三方账户日历,直接选择本地日历写入即可
- 若确实需要写入谷歌等第三方同步日历,不要直接操作本地ContentProvider,调用对应平台的云端API插入事件,插入成功后数据会自动同步到本地日历,不会被回删。
内容的提问来源于stack exchange,提问作者Rujul Gandhi
相关产品推荐
相关产品推荐

