You need to enable JavaScript to run this app. Android端谷歌日历添加的事件10秒后自动删除问题求助
优惠活动
大模型
产品
解决方案
定价
更多

Android端谷歌日历添加的事件10秒后自动删除问题求助

问题产生原因
  • 硬编码CALENDAR_ID为1不符合系统规范:安卓设备中Calendar ID为1的日历不一定是当前用户可写入的有效日历,常见情况是该ID对应谷歌账户的同步日历,直接在本地插入的事件没有云端对应数据,谷歌同步服务刷新数据时会将其判定为无效脏数据自动删除;也有可能该ID对应只读日历、已废弃的旧日历,本身不支持持久化写入事件。
  • 缺少必要的事件字段:系统日历提供器要求写入事件时携带部分标识字段,未配置的情况下事件会被同步逻辑判定为异常数据清理。
  • 同步逻辑冲突:如果目标日历是第三方账户同步日历(比如谷歌、Exchange日历),本地直接操作ContentProvider插入的事件不会同步到对应服务端,同步校验时就会被服务端回删。
解决方案
  1. 先查询设备上合法的可写日历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)或者用户主日历,避免选到只读同步日历
    }
}
  1. 插入事件时补充必要字段,避免被同步逻辑误删:
    在原有的ContentValues插入逻辑中新增以下参数:
// 标记事件为未同步,避免被同步服务直接清理
values.put(CalendarContract.Events.DIRTY, 1)
// 标记当前用户为事件组织者
values.put(CalendarContract.Events.IS_ORGANIZER, 1)
// 如果不需要同步到第三方账户日历,直接选择本地日历写入即可
  1. 若确实需要写入谷歌等第三方同步日历,不要直接操作本地ContentProvider,调用对应平台的云端API插入事件,插入成功后数据会自动同步到本地日历,不会被回删。

内容的提问来源于stack exchange,提问作者Rujul Gandhi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 11:57:02