他の誰かがまだこれに苦労しているなら、私はついにそれを解決しました!
レコードを削除または修正していないことがわかります。実際に行うことは、例外と呼ばれる新しいイベントを挿入することです。この情報をどこかで見つけるのに数か月かかり、それを見つけたとしても、それを機能させるために例外に何を入れる必要があるかを正確に理解するのにさらに数か月かかりました.
まず、1 回の発生をキャンセルするイベントの実際のインスタンスをクエリします。CalendarContract.Instances.TITLE、CalendarContract.Instances.BEGIN、および CalendarContract.Instances.EVENT_ID の値を取得するには、CalendarContract.Instances テーブルにクエリを実行する必要があります。私のコードでこれを行う方法は、この回答のコンテキストに実際には適合しないため、うまくいけば、自分でそれを行う方法を考え出すことができます. これらの値を次のように保存します。
final String title = eventCursor.getString(0);
final long beginl=eventCursor.getLong(1);
final int id = eventCursor.getInt(2);
次に、次のように新しいイベントを設定する必要があります。
final Context context = getApplicationContext();
final ContentResolver contentResolver = context.getContentResolver();
final Uri.Builder builder = Uri.parse(
"content://com.android.calendar/events").buildUpon();
final Cursor eventCursor = contentResolver.query(builder.build(),
new String[]
{Events.CALENDAR_TIME_ZONE,Events.ALL_DAY,Events.CALENDAR_ID,Events._SYNC_ID, Events.OWNER_ACCOUNT },
"_id=" + id, null, null);
while (eventCursor.moveToNext()) {
final String timezone=eventCursor.getString(0);
final String allday=eventCursor.getString(1);
final long calID=eventCursor.getLong(2);
final String mSyncId=eventCursor.getString(3);
final String account=eventCursor.getString(4);
ContentValues values = new ContentValues();
values.put(Events.TITLE, title);
values.put(Events.EVENT_TIMEZONE, timezone);
values.put(Events.ORIGINAL_SYNC_ID, mSyncId);//not 100% sure about this,may also need a date?
values.put(Events.HAS_ALARM, "0");
values.put(Events.HAS_ATTENDEE_DATA,"0");
values.put(Events.ALL_DAY, allday);
values.put(Events.DTSTART, beginl+3600000);
values.put(Events.ORIGINAL_INSTANCE_TIME, beginl+3600000);
values.put(Events.STATUS, Events.STATUS_CANCELED);
Uri uri = Uri.withAppendedPath(Events.CONTENT_EXCEPTION_URI,
String.valueOf(id));
uri = asSyncAdapter(uri, account, CTS_TEST_TYPE);
Uri resultUri = context.getContentResolver().insert(uri, values);
try {
int eventID = Integer.parseInt(resultUri.getLastPathSegment());
int debug=eventID;
} catch (Exception e) {
int debug=0;
}
}
static Uri asSyncAdapter(Uri uri, String account, String accountType) {
return uri.buildUpon()
.appendQueryParameter
(android.provider.CalendarContract.CALLER_IS_SYNCADAPTER,"true")
.appendQueryParameter(Calendars.ACCOUNT_NAME, account)
.appendQueryParameter(Calendars.ACCOUNT_TYPE, accountType).build();
}
これが機能することを願っています。関連しないコードの部分を切り取ろうとしました。beginl 値 (ミリ秒単位で 1 時間) に 3600000 を追加する必要があることに気付くでしょう。これは、現在 BST にいて、クロックが変わるとこのコードが機能しないためだと思いますが、そのときは心配します!
最後に、Content Provider Helper というアプリを使用して、これを見つけました。これを使用して、コンテンツ プロバイダー テーブルにクエリを実行できます。コードを使用して例外を設定してから、携帯電話のカレンダー アプリを使用してインスタンスを削除し、2 つのレコードを比較します。