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);
}


© 2024 KMIソフトウェア