2012-10-05 13 views
20

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のバグですか?しかし、それがバグであれば、なぜシステムカレンダーが正常に動作するのですか?この一貫性のない行動は私にとって奇妙なようです。

ありがとうございました。

+0

を試すことができます?私は混乱している – MobileMon

+0

ええ、グーグルのカレンダーのAPIはかなりバギーのようだ...このアピで非常に子供時代と愚かなバグがたくさんあります:( – qkx

+1

それは2014年だし、バグが残っているようだ... ALL_DAYイベントは、このバグレポートを参照してください:https://code.google.com/p/android/issues/detail?id=14051 –

答えて

0

カレンダーAPIもいくつかのデバイスに依存しています。あなたのコードはAndroid 4.4.4では完璧に動作していますが、他の多くのデバイスでは動作しませんが、次のコードは完全に動作しています。

あなたはあなたがこれを手動で行う方法の例を投稿することができ、この

public Cursor fetchCursor(Calendar start) { 
     Calendar end = (Calendar) start.clone(); 
     end.add(Calendar.DATE, 1); 


     ContentResolver resolver = this.getContentResolver(); 
     return CalendarContract.Instances.query(resolver, new String[] { "calendar_id", "title", "description", 
       "dtstart", "dtend", "eventLocation" }, start.getTimeInMillis(), 
       end.getTimeInMillis()); 
    } 
関連する問題