私はちょうどAndroidに精通しており、今日のプロジェクト会議で、誰かがAndroidにはネイティブのカレンダーアプリがないので、ユーザーは好きなカレンダーアプリを使用するだけだと言いました。
これは本当ですか?もしそうなら、プログラムでユーザーのカレンダーにイベントを追加するにはどうすればよいですか?全員が共有する共通のAPIはありますか?
価値があるものとして、おそらくAndroid 2.xをターゲットにしているでしょう。
プログラムでユーザーのカレンダーにイベントを追加するにはどうすればよいですか?
どのカレンダー?
全員が共有する共通のAPIはありますか?
いいえ、Windowsカレンダーアプリ用の「すべて共通のAPI」があります。一般的なデータ形式(iCalendarなど)とインターネットプロトコル(CalDAVなど)がありますが、共通のAPIはありません。カレンダーアプリの中には、APIを提供しないものもあります。
統合したい特定のカレンダーアプリケーションがある場合は、開発者に連絡して、APIを提供しているかどうかを判断してください。そのため、たとえば、Mayrが引用しているAndroidオープンソースプロジェクトのCalendarアプリケーションは、文書化されサポートされているAPIを提供していません。 Googleは 明示的に開発者にテクニックを使わないように指示した Mayraが引用したチュートリアルで概説しています。
別のオプションは、問題のインターネットカレンダーにイベントを追加することです。たとえば、Androidオープンソースプロジェクトからカレンダーアプリケーションにイベントを追加する最良の方法は、適切なGData APIを介してユーザーのGoogleカレンダーにイベントを追加することです。
UPDATE
Android 4.0(APIレベル14)はCalendarContract
ContentProvider
を追加しました。
あなたのコードでこれを試してください:
Calendar cal = Calendar.getInstance();
Intent intent = new Intent(Intent.ACTION_EDIT);
intent.setType("vnd.Android.cursor.item/event");
intent.putExtra("beginTime", cal.getTimeInMillis());
intent.putExtra("allDay", true);
intent.putExtra("rrule", "FREQ=YEARLY");
intent.putExtra("endTime", cal.getTimeInMillis()+60*60*1000);
intent.putExtra("title", "A Test Event from Android app");
startActivity(intent);
このAPIをコードで使用します。イベント、リマインダー付きイベント、会議付きイベントを有効にできます。このAPIは、プラットフォーム2.1以上で動作します。 .Android.calendar/eventsはcontent:// calendar/eventsを使用します
public static long pushAppointmentsToCalender(Activity curActivity, String title, String addInfo, String place, int status, long startDate, boolean needReminder, boolean needMailService) {
/***************** Event: note(without alert) *******************/
String eventUriString = "content://com.Android.calendar/events";
ContentValues eventValues = new ContentValues();
eventValues.put("calendar_id", 1); // id, We need to choose from
// our mobile for primary
// its 1
eventValues.put("title", title);
eventValues.put("description", addInfo);
eventValues.put("eventLocation", place);
long endDate = startDate + 1000 * 60 * 60; // For next 1hr
eventValues.put("dtstart", startDate);
eventValues.put("dtend", endDate);
// values.put("allDay", 1); //If it is bithday alarm or such
// kind (which should remind me for whole day) 0 for false, 1
// for true
eventValues.put("eventStatus", status); // This information is
// sufficient for most
// entries tentative (0),
// confirmed (1) or canceled
// (2):
eventValues.put("eventTimezone", "UTC/GMT +2:00");
/*Comment below visibility and transparency column to avoid Java.lang.IllegalArgumentException column visibility is invalid error */
/*eventValues.put("visibility", 3); // visibility to default (0),
// confidential (1), private
// (2), or public (3):
eventValues.put("transparency", 0); // You can control whether
// an event consumes time
// opaque (0) or transparent
// (1).
*/
eventValues.put("hasAlarm", 1); // 0 for false, 1 for true
Uri eventUri = curActivity.getApplicationContext().getContentResolver().insert(Uri.parse(eventUriString), eventValues);
long eventID = Long.parseLong(eventUri.getLastPathSegment());
if (needReminder) {
/***************** Event: Reminder(with alert) Adding reminder to event *******************/
String reminderUriString = "content://com.Android.calendar/reminders";
ContentValues reminderValues = new ContentValues();
reminderValues.put("event_id", eventID);
reminderValues.put("minutes", 5); // Default value of the
// system. Minutes is a
// integer
reminderValues.put("method", 1); // Alert Methods: Default(0),
// Alert(1), Email(2),
// SMS(3)
Uri reminderUri = curActivity.getApplicationContext().getContentResolver().insert(Uri.parse(reminderUriString), reminderValues);
}
/***************** Event: Meeting(without alert) Adding Attendies to the meeting *******************/
if (needMailService) {
String attendeuesesUriString = "content://com.Android.calendar/attendees";
/********
* To add multiple attendees need to insert ContentValues multiple
* times
***********/
ContentValues attendeesValues = new ContentValues();
attendeesValues.put("event_id", eventID);
attendeesValues.put("attendeeName", "xxxxx"); // Attendees name
attendeesValues.put("attendeeEmail", "[email protected]");// Attendee
// E
// mail
// id
attendeesValues.put("attendeeRelationship", 0); // Relationship_Attendee(1),
// Relationship_None(0),
// Organizer(2),
// Performer(3),
// Speaker(4)
attendeesValues.put("attendeeType", 0); // None(0), Optional(1),
// Required(2), Resource(3)
attendeesValues.put("attendeeStatus", 0); // NOne(0), Accepted(1),
// Decline(2),
// Invited(3),
// Tentative(4)
Uri attendeuesesUri = curActivity.getApplicationContext().getContentResolver().insert(Uri.parse(attendeuesesUriString), attendeesValues);
}
return eventID;
}
以下のコードを使用し、ICSのデフォルトのデバイスカレンダーにイベントを追加することで問題を解決します
if (Build.VERSION.SDK_INT >= 14) {
Intent intent = new Intent(Intent.ACTION_INSERT)
.setData(Events.CONTENT_URI)
.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis())
.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis())
.putExtra(Events.TITLE, "Yoga")
.putExtra(Events.DESCRIPTION, "Group class")
.putExtra(Events.EVENT_LOCATION, "The gym")
.putExtra(Events.AVAILABILITY, Events.AVAILABILITY_BUSY)
.putExtra(Intent.EXTRA_EMAIL, "[email protected],[email protected]");
startActivity(intent);
}
else {
Calendar cal = Calendar.getInstance();
Intent intent = new Intent(Intent.ACTION_EDIT);
intent.setType("vnd.Android.cursor.item/event");
intent.putExtra("beginTime", cal.getTimeInMillis());
intent.putExtra("allDay", true);
intent.putExtra("rrule", "FREQ=YEARLY");
intent.putExtra("endTime", cal.getTimeInMillis()+60*60*1000);
intent.putExtra("title", "A Test Event from Android app");
startActivity(intent);
}
それが役立つことを願っています.....
Androidバージョン4.0以降 公式のAPIとインテントが利用可能 利用可能な カレンダープロバイダー と対話する。
誰かがC#のXamarinでこれを必要とする場合に備えて:
Intent intent = new Intent(Intent.ActionInsert);
intent.SetData(Android.Provider.CalendarContract.Events.ContentUri);
intent.PutExtra(Android.Provider.CalendarContract.ExtraEventBeginTime, Utils.Tools.CurrentTimeMillis(game.Date));
intent.PutExtra(Android.Provider.CalendarContract.EventsColumns.AllDay, false);
intent.PutExtra(Android.Provider.CalendarContract.EventsColumns.EventLocation, "Location");
intent.PutExtra(Android.Provider.CalendarContract.EventsColumns.Description, "Description");
intent.PutExtra(Android.Provider.CalendarContract.ExtraEventEndTime, Utils.Tools.CurrentTimeMillis(game.Date.AddHours(2)));
intent.PutExtra(Android.Provider.CalendarContract.EventsColumns.Title, "Title");
StartActivity(intent);
ヘルパー関数:
private static readonly DateTime Jan1st1970 = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
public static long CurrentTimeMillis(DateTime date)
{
return (long)(date.ToUniversalTime() - Jan1st1970).TotalMilliseconds;
}
これを試して 、
Calendar beginTime = Calendar.getInstance();
beginTime.set(yearInt, monthInt - 1, dayInt, 7, 30);
ContentValues l_event = new ContentValues();
l_event.put("calendar_id", CalIds[0]);
l_event.put("title", "event");
l_event.put("description", "This is test event");
l_event.put("eventLocation", "School");
l_event.put("dtstart", beginTime.getTimeInMillis());
l_event.put("dtend", beginTime.getTimeInMillis());
l_event.put("allDay", 0);
l_event.put("rrule", "FREQ=YEARLY");
// status: 0~ tentative; 1~ confirmed; 2~ canceled
// l_event.put("eventStatus", 1);
l_event.put("eventTimezone", "India");
Uri l_eventUri;
if (Build.VERSION.SDK_INT >= 8) {
l_eventUri = Uri.parse("content://com.Android.calendar/events");
} else {
l_eventUri = Uri.parse("content://calendar/events");
}
Uri l_uri = MainActivity.this.getContentResolver()
.insert(l_eventUri, l_event);
Googleカレンダーは「ネイティブ」のカレンダーアプリです。私の知る限り、すべての電話機にはバージョンがインストールされており、デフォルトのSDKにはバージョンが用意されています。
あなたはこれをチェックアウトするかもしれません tutorial それを扱うために。
日付と時刻を指定した日付文字列がある場合。
例:String givenDateString = pojoModel.getDate()/* Format dd-MMM-yyyy hh:mm:ss */
次のコードを使用して、日付と時刻を含むイベントをカレンダーに追加します
Calendar cal = Calendar.getInstance();
cal.setTime(new SimpleDateFormat("dd-MMM-yyyy hh:mm:ss").parse(givenDateString));
Intent intent = new Intent(Intent.ACTION_EDIT);
intent.setType("vnd.Android.cursor.item/event");
intent.putExtra("beginTime", cal.getTimeInMillis());
intent.putExtra("allDay", false);
intent.putExtra("rrule", "FREQ=YEARLY");
intent.putExtra("endTime",cal.getTimeInMillis() + 60 * 60 * 1000);
intent.putExtra("title", " Test Title");
startActivity(intent);
フラグを追加する必要があります:
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
または、次のエラーが発生します。
Activityコンテキストの外部からのstartActivity()
にはFLAG_ACTIVITY_NEW_TASK
が必要です