Android 4+で選択した日にすべてのイベントが発生しています。Android 4+(ALL_DAY問題)の特定の日のイベントを一覧表示します。
私が理解する限り、CalendarContract.Instancesは定期的なイベントとシングルタイムイベントの両方を処理するため、イベントを取得する最も簡単な方法です。
しかし、私はタイムスタンプを処理する方法にいくつかの問題があります。具体的には、ALL_DAYイベントを異なる方法で扱うようです。
私はイベントを取得している日であるstart
で開始しました。ミリ秒の "数学"は、翌日の午前12時から始まる不要なイベントを避けるためのものです。
public Cursor fetchCursor(Calendar start) {
Calendar end = (Calendar) start.clone();
end.add(Calendar.DATE, 1);
long startTime = start.getTimeInMillis() + 1;
long endTime = end.getTimeInMillis() - 1;
ContentResolver resolver = mContext.getContentResolver();
return CalendarContract.Instances.query(resolver, projection, startTime, endTime);
}
このコードは、多くのエッジケース、異なるタイムゾーン、複数日にまたがるイベント...終日のイベントを除くすべてのものとうまく動作するようです。私はALL_DAYフラグでイベントを返さ調べ
:Cursor c = fetchCursor(date);
Log.e("SIZE", String.valueOf(c.getCount()));
while (c.moveToNext()) {
long begin = c.getLong(2); // CalendarContract.Instances.BEGIN
long end = c.getLong(3); // CalendarContract.Instances.END
Date beginDate = new Date(begin);
Date endDate = new Date(end);
Log.e("EVENT", String.valueOf(begin) + " - " + String.valueOf(end));
Log.e("EVENT", beginDate.toString() + " - " + endDate.toString());
}
は私が持って:EVENT(10075): Thu Sep 13 02:00:00 CEST 2012 - Sat Sep 15 02:00:00 CEST 2012
。
query
は、私のTIMEZONEでエポックからミリ秒で範囲の開始と終了を期待しているようです(ただし、APIではUTCベースのタイムスタンプが必要です)。しかし、ALL_DAYとしてマークされたイベントは、UTCの時代からミリ秒を使用します(したがって、+2タイムゾーンのために2時間が追加になります)。
また、タイムゾーンオフセットを計算して追加しようとしました。それから、終日のイベントはうまくいったが、それ以外のものは...。
private long getTimezoneOffset(TimeZone zone, long date) {
long delta = zone.getOffset(date);
return delta;
}
private long getTimeInUTC(Calendar date) {
long time = date.getTimeInMillis();
time += getTimezoneOffset(date.getTimeZone(), time);
return time;
}
public Cursor fetchCursor(Calendar start) {
Calendar end = (Calendar) start.clone();
end.add(Calendar.DATE, 1);
long startTime = getTimeInUTC(start) + 1;
long endTime = getTimeInUTC(end) - 1;
ContentResolver resolver = mContext.getContentResolver();
return CalendarContract.Instances.query(resolver, projection, startTime, endTime);
}
、カーソルを反復処理ALL_DAYイベントを変更し、不要なイベントを削除することによってこの問題を解決するために非常に簡単な方法がありますが、私はより良い方法があるかどうかを知りたいです。それとも、これはAndroidのバグですか?しかし、それがバグであれば、なぜシステムカレンダーが正常に動作するのですか?この一貫性のない行動は私にとって奇妙なようです。
ありがとうございました。
を試すことができます?私は混乱している – MobileMon
ええ、グーグルのカレンダーのAPIはかなりバギーのようだ...このアピで非常に子供時代と愚かなバグがたくさんあります:( – qkx
それは2014年だし、バグが残っているようだ... ALL_DAYイベントは、このバグレポートを参照してください:https://code.google.com/p/android/issues/detail?id=14051 –