Android 4.0 (ICS)では,Googleカレンダーに予定を登録する正式な方法が提供されました.これを使ったコード例です
Android4.0でGoogleカレンダーに登録する
Android 4.0 (ICS)で提供された,Googleカレンダーに予定を登録する正式な方法は,
こちらの公式ドキュメントを見ればそのものずばりがわかります.
ただ,自分はタイムゾーンで若干はまったので,参考までに実装例を載せてみます.
山旅ロガーで実際に使っているコードです.Galaxy Nexusで動作確認済みです.
API level 13以下の例は,おまけです.(´∀`)
import
android.content.ContentResolver;
import
android.content.ContentValues;
import
android.content.Context;
import
android.content.Intent;
import
android.provider.CalendarContract;
import
android.provider.CalendarContract.Events;
import
android.text.format.Time;
// API level 14 (4.0)以上.ICS向け
public
void
registGCalendarV14(Context context, String title, long
startMsec, long
endMsec) {
Intent intent = new
Intent(Intent.ACTION_INSERT)
.setData(CalendarContract.Events.CONTENT_URI)
// UTCではなくローカルタイムを設定する
// タイムゾーンは,インテントで起動するカレンダー登録画面で吸収しているように見える
.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, startMsec)
.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endMsec)
.putExtra(CalendarContract.Events.TITLE, title);
context.startActivity(intent);
}
// API level 14 (4.0)以上.ICS向け コンテントプロバイダー方式
public
void
registGCalendarV14Silent(Context context, String title, long
startMsec, long
endMsec) {
ContentValues cv = new
ContentValues();
cv.put(Events.CALENDAR_ID, 1);
cv.put(Events.TITLE, title);
cv.put(Events.EVENT_TIMEZONE,TimeZone.getDefault().getDisplayName(Locale.ENGLISH));
cv.put(Events.DTSTART, convToEnglishTime(startMsec));
cv.put(Events.DTEND, convToEnglishTime(endMsec));
ContentResolver cr = context.getContentResolver();
cr.insert(Events.CONTENT_URI, cv);
}
// API level 13 (3.2)以下
public
void
registGCalendarV13(Context context, String title, long
startMsec, long
endMsec) {
ContentValues cv = new
ContentValues();
cv.put("calendar_id"
, 1);
cv.put("title"
, title);
cv.put("eventTimezone"
,TimeZone.getDefault().getDisplayName(Locale.ENGLISH));
cv.put("dtstart"
, convToEnglishTime(startMsec));
cv.put("dtend"
, convToEnglishTime(endMsec));
ContentResolver cr = context.getContentResolver();
cr.insert(Uri.parse(Integer.parseInt(Build.VERSION.SDK) >= 8?
"content://com.android.calendar/events"
;
"content://calendar/events"
), cv);
}
/**
* DateをENGLISHロケールに変換する
* @param dateMsec
* @return
*/
private
static
long
convToEnglishTime(long
dateMsec) {
Time androTime;
androTime = new
Time();
androTime.switchTimezone(TimeZone.getDefault().getDisplayName(Locale.ENGLISH));
androTime.set(dateMsec);
return
androTime.normalize(true
);
}