カレンダーイベントをプログラムで(直接)Android 4+に追加します。エミュレータでテストすることは可能ですか?Android電話。サンプルコードをいただければ幸いです。Android開発者のカレンダープロバイダーを読みましたが、混乱しています。ユーザーのデフォルトカレンダーにイベントを追加するにはどうすればよいですか?同期されます。
編集:Intentを追加するイベントを起動しません。代わりに、コードから完全に追加し、別のアクティビティを起動しないようにします。イベントがデバイスのデフォルトユーザーのメインカレンダーに追加されることをエミュレーターでテストできる必要があります。ユーザーのデフォルトのカレンダーを表示するようにエミュレータを設定するにはどうすればよいですか?
ここ は、私が最終的に作成したものの実例です:
ContentResolver cr = ctx.getContentResolver();
ContentValues values = new ContentValues();
values.put(CalendarContract.Events.DTSTART, dtstart);
values.put(CalendarContract.Events.TITLE, title);
values.put(CalendarContract.Events.DESCRIPTION, comment);
TimeZone timeZone = TimeZone.getDefault();
values.put(CalendarContract.Events.EVENT_TIMEZONE, timeZone.getID());
// Default calendar
values.put(CalendarContract.Events.CALENDAR_ID, 1);
values.put(CalendarContract.Events.RRULE, "FREQ=DAILY;UNTIL="
+ dtUntill);
// Set Period for 1 Hour
values.put(CalendarContract.Events.DURATION, "+P1H");
values.put(CalendarContract.Events.HAS_ALARM, 1);
// Insert event to calendar
Uri uri = cr.insert(CalendarContract.Events.CONTENT_URI, values);
ここで、dtuntil
は
SimpleDateFormat yyyyMMdd = new SimpleDateFormat("yyyyMMdd");
Calendar dt = Calendar.getInstance();
// Where untilDate is a date instance of your choice, for example 30/01/2012
dt.setTime(untilDate);
// If you want the event until 30/01/2012, you must add one day from our day because UNTIL in RRule sets events before the last day
dt.add(Calendar.DATE, 1);
String dtUntill = yyyyMMdd.format(dt.getTime());
参照: Recurrence Rule
お探しのセクションは インテントを使用してイベントを挿入する です。このセクションでは、追加するイベントのインテントを作成する方法について説明します。その後、エミュレータのデフォルトのカレンダープログラムが応答して追加します。正しい情報を受け取ったことを実際に確認したい場合は、カレンダープログラムが開始されるように、ダミープロファイルを設定する必要があります。
Android Dev Site :からのコード
Calendar beginTime = Calendar.getInstance();
beginTime.set(2012, 0, 19, 7, 30);
Calendar endTime = Calendar.getInstance();
endTime.set(2012, 0, 19, 8, 30);
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);
このコードを使用して、プログラムでデバイスカレンダーにイベントを追加できます。私はマシュマロでテストしましたが、私にとってはうまくいきます。
private void addToDeviceCalendar(String startDate,String endDate, String title,String description, String location) {
String stDate = startDate;
String enDate = endDate;
GregorianCalendar calDate = new GregorianCalendar();
//GregorianCalendar calEndDate = new GregorianCalendar();
SimpleDateFormat originalFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
SimpleDateFormat targetFormat = new SimpleDateFormat("yyyy,MM,dd,HH,mm");
Date date,edate;
try {
date = originalFormat.parse(startDate);
stDate=targetFormat.format(date);
} catch (ParseException ex) {}
long startMillis = 0;
long endMillis = 0;
String dates[] = stDate.split(",");
SD_YeaR = dates[0];
SD_MontH = dates[1];
SD_DaY = dates[2];
SD_HouR = dates[3];
SD_MinutE = dates[4];
/*Log.e("YeaR ", SD_YeaR);
Log.e("MontH ",SD_MontH );
Log.e("DaY ", SD_DaY);
Log.e(" HouR", SD_HouR);
Log.e("MinutE ", SD_MinutE);*/
calDate.set(Integer.parseInt(SD_YeaR), Integer.parseInt(SD_MontH)-1, Integer.parseInt(SD_DaY), Integer.parseInt(SD_HouR), Integer.parseInt(SD_MinutE));
startMillis = calDate.getTimeInMillis();
/*
try {
edate = originalFormat.parse(endDate);
enDate=targetFormat.format(edate);
} catch (ParseException ex) {}
String end_dates[] = endDate.split(",");
String ED_YeaR = end_dates[0];
String ED_MontH = end_dates[1];
String ED_DaY = end_dates[2];
String ED_HouR = end_dates[3];
String ED_MinutE = end_dates[4];
calEndDate.set(Integer.parseInt(ED_YeaR), Integer.parseInt(ED_MontH)-1, Integer.parseInt(ED_DaY), Integer.parseInt(ED_HouR), Integer.parseInt(ED_MinutE));
endMillis = calEndDate.getTimeInMillis();*/
try {
ContentResolver cr = getActivity().getContentResolver();
ContentValues values = new ContentValues();
values.put(CalendarContract.Events.DTSTART, startMillis);
values.put(CalendarContract.Events.DTEND, calDate.getTimeInMillis() + 60 * 60 * 1000);
values.put(CalendarContract.Events.TITLE, title);
values.put(CalendarContract.Events.DESCRIPTION, description);
values.put(CalendarContract.Events.EVENT_LOCATION,location);
values.put(CalendarContract.Events.HAS_ALARM,1);
values.put(CalendarContract.Events.CALENDAR_ID, 1);
values.put(CalendarContract.Events.EVENT_TIMEZONE, Calendar.getInstance()
.getTimeZone().getID());
System.out.println(Calendar.getInstance().getTimeZone().getID());
if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_CALENDAR) != PackageManager.PERMISSION_GRANTED) {
return;
}
Uri uri = cr.insert(CalendarContract.Events.CONTENT_URI, values);
long eventId = Long.parseLong(uri.getLastPathSegment());
Log.d("Ketan_Event_Id", String.valueOf(eventId));
} catch (Exception e) {
e.printStackTrace();
}
}
マニフェストに許可を追加するのを忘れないでください
<uses-permission Android:name="Android.permission.READ_CALENDAR"/>
<uses-permission Android:name="Android.permission.WRITE_CALENDAR"/>
からのコード:-> Android Dev Site
long calID = 3; // Make sure to which calender you want to add event
long startMillis = 0;
long endMillis = 0;
Calendar beginTime = Calendar.getInstance();
beginTime.set(2012, 9, 14, 7, 30);
startMillis = beginTime.getTimeInMillis();
Calendar endTime = Calendar.getInstance();
endTime.set(2012, 9, 14, 8, 45);
endMillis = endTime.getTimeInMillis();
ContentResolver cr = getContentResolver();
ContentValues values = new ContentValues();
values.put(Events.DTSTART, startMillis);
values.put(Events.DTEND, endMillis);
values.put(Events.TITLE, "Hackathon");
values.put(Events.DESCRIPTION, "do some code");
values.put(Events.CALENDAR_ID, calID);
values.put(Events.EVENT_TIMEZONE, TimeZone.getDefault().getID());
Uri uri = cr.insert(Events.CONTENT_URI, values);
// get the event ID that is the last element in the Uri
long eventID = Long.parseLong(uri.getLastPathSegment());
上記のすべての回答に同意しますが、インポートはカレンダーIDです。サムスンの携帯電話はカレンダー(Sプランナー)に1を使用しているため、1を使用することはできません。したがって、カレンダーIDはイベントが必要なメールのIDです。特定のイベントのコードに従うことでカレンダーIDを取得できます
int calenderId=-1;
String calenderEmaillAddress="[email protected]";
String[] projection = new String[]{
CalendarContract.Calendars._ID,
CalendarContract.Calendars.ACCOUNT_NAME};
ContentResolver cr = activity.getContentResolver();
Cursor cursor = cr.query(Uri.parse("content://com.Android.calendar/calendars"), projection,
CalendarContract.Calendars.ACCOUNT_NAME + "=? and (" +
CalendarContract.Calendars.NAME + "=? or " +
CalendarContract.Calendars.CALENDAR_DISPLAY_NAME + "=?)",
new String[]{calenderEmaillAddress, calenderEmaillAddress,
calenderEmaillAddress}, null);
if (cursor.moveToFirst()) {
if (cursor.getString(1).equals(calenderEmaillAddress))
calenderId=cursor.getInt(0); //youre calender id to be insered in above 2 answer
}
イベントを追加する必要があるカレンダーをユーザーに尋ねる方法を次に示します。私の要件はこれであり、一箇所で解決策が見つからなかったためです。私はこの解決策をまとめて考え出しましたが、それが誰かを助けることを願っています:)
final ContentResolver cr = this.getContentResolver();
Cursor cursor ;
if (Integer.parseInt(Build.VERSION.SDK) >= 8 )
cursor = cr.query(Uri.parse("content://com.Android.calendar/calendars"), new String[]{ "_id", "calendar_displayName" }, null, null, null);
else
cursor = cr.query(Uri.parse("content://calendar/calendars"), new String[]{ "_id", "displayname" }, null, null, null);
if (cursor != null && cursor.moveToFirst() ) {
final String[] calNames = new String[cursor.getCount()];
final int[] calIds = new int[cursor.getCount()];
for (int i = 0; i < calNames.length; i++) {
calIds[i] = cursor.getInt(0);
calNames[i] = cursor.getString(1);
cursor.moveToNext();
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
final long startDate = sdf.parse(slotData.getSlot_date() + " " + slotData.getSlot_from()).getTime();
final long endDate = sdf.parse(slotData.getSlot_date() + " " + slotData.getSlot_to()).getTime();
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Select any one");
builder.setSingleChoiceItems(calNames, -1, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ContentValues cv = new ContentValues();
cv.put("calendar_id", calIds[which]);
cv.put("title", title);
cv.put("dtstart", startDate);
cv.put("hasAlarm", 1);
cv.put("dtend", endDate);
cv.put("eventTimezone", TimeZone.getDefault().getID());
Uri newEvent ;
if (Integer.parseInt(Build.VERSION.SDK) >= 8 )
newEvent = cr.insert(Uri.parse("content://com.Android.calendar/events"), cv);
else
newEvent = cr.insert(Uri.parse("content://calendar/events"), cv);
if (newEvent != null) {
long id = Long.parseLong( newEvent.getLastPathSegment() );
ContentValues values = new ContentValues();
values.put( "event_id", id );
values.put( "method", 1 );
values.put( "minutes", 15 ); // 15 minutes
if (Integer.parseInt(Build.VERSION.SDK) >= 8 )
cr.insert( Uri.parse( "content://com.Android.calendar/reminders" ), values );
else
cr.insert( Uri.parse( "content://calendar/reminders" ), values );
}
dialog.cancel();
}
});
builder.create().show();
}
if (cursor != null) {
cursor.close();
}