web-dev-qa-db-ja.com

カレンダーにイベントを自動的に追加するにはどうすればよいですか?

カレンダーにイベントを自動的に追加するにはどうすればよいですか?このソースコードを使用すると、入力されたエントリでカレンダーが開きますが、保存するには保存ボタンをクリックする必要があります。

public class CalendarApplicationActivity extends Activity
{  

public static final String[] EVENT_PROJECTION = new String[] 
{  
        Calendars._ID, // 0  
        Calendars.ACCOUNT_NAME, // 1  
        Calendars.CALENDAR_DISPLAY_NAME // 2  
};  


private static final int PROJECTION_DISPLAY_NAME_INDEX = 2;  

@Override 
public void onCreate(Bundle savedInstanceState)
{  
    super.onCreate(savedInstanceState);  
    setContentView(R.layout.activity_calendar_application);  
}  

public void onClick(View view) 
{  

    Intent intent = new Intent(Intent.ACTION_INSERT);  
    intent.setType("vnd.Android.cursor.item/event");  
    intent.putExtra(Events.TITLE, "Learn Android");  
    intent.putExtra(Events.EVENT_LOCATION, "Home suit home");  
    intent.putExtra(Events.DESCRIPTION, "Download Examples");  

    GregorianCalendar calDate = new GregorianCalendar(2012, 10, 02);  
    intent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME,  
            calDate.getTimeInMillis());  
    intent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME,  
            calDate.getTimeInMillis());  

    intent.putExtra(CalendarContract.EXTRA_EVENT_ALL_DAY, true);  


    intent.putExtra(Events.ACCESS_LEVEL, Events.ACCESS_PRIVATE);  
    intent.putExtra(Events.AVAILABILITY, Events.AVAILABILITY_BUSY);  

    startActivity(intent);  

}  


}
12
ebruszl

市場に出回っている私のアプリの1つで使用されているこのコードを投稿します。ユーザーカレンダーにイベントを自動的に追加します。ユーザーアクションを必要とするインテントは使用しません。

public void addEvent(CalendarEvent evt) {
    //Log.d(Params.LOG_APP, "Insert event ["+evt+"]");

    try {
        Uri evtUri = ctx.getContentResolver().insert(getCalendarUri("events"), CalendarEvent.toContentValues(evt));
        Log.d(Params.LOG_APP, "" + evtUri);
    }
    catch(Throwable t) {
        //Log.e(Params.LOG_APP, "", t);
    }
}

public void setContext(Context context) {
    this.ctx = context;
    this.baseUri = getCalendarUriBase();
}

private Uri getCalendarUri(String path) {
    return Uri.parse(baseUri + "/" + path);
}

private String getCalendarUriBase() {
    String calendarUriBase = null;
    Uri calendars = Uri.parse("content://calendar/calendars");
    Cursor managedCursor = null;
    try {
        managedCursor = ctx.getContentResolver().query(calendars, null, null, null, null);
    } catch (Exception e) {
       // e.printStackTrace();
    }

    if (managedCursor != null) {
        calendarUriBase = "content://calendar/";
    } else {
        calendars = Uri.parse("content://com.Android.calendar/calendars");
        try {
            managedCursor = ctx.getContentResolver().query(calendars, null, null, null, null);
        } catch (Exception e) {
           // e.printStackTrace();
        }

        if (managedCursor != null) {
            calendarUriBase = "content://com.Android.calendar/";
        }

    }

    Log.d(Params.LOG_APP, "URI ["+calendarUriBase+"]");
    return calendarUriBase;
}

そしてICS以降

public void addEvent(CalendarEvent evt) {

    ContentResolver cr = context.getContentResolver();
    Uri uri = cr.insert(Events.CONTENT_URI, CalendarEvent.toICSContentValues(evt));
    System.out.println("Event URI ["+uri+"]");

}

CalendarEventは次のようなものです

public static ContentValues toContentValues(CalendarEvent evt) {
    ContentValues cv = new ContentValues();
    cv.put("calendar_id", evt.getIdCalendar());
    cv.put("title", evt.getTitle());
    cv.put("description", evt.getDescr());
    cv.put("eventLocation", evt.getLocation());
    cv.put("dtstart", evt.getStartTime());
    cv.put("dtend", evt.getEndTime());
    cv.put("eventStatus", 1);
    cv.put("visibility", 0);
    cv.put("transparency", 0);

    return cv;

}

public static ContentValues toICSContentValues(CalendarEvent evt) {

    ContentValues cv = new ContentValues();
    cv.put(Events.CALENDAR_ID, evt.getIdCalendar());
    cv.put(Events.TITLE, evt.getTitle());
    cv.put(Events.DESCRIPTION, evt.getDescr());
    cv.put(Events.EVENT_LOCATION, evt.getLocation());
    cv.put(Events.DTSTART, evt.getStartTime());
    cv.put(Events.DTEND, evt.getEndTime());

    Calendar cal = Calendar.getInstance();
    TimeZone tz = cal.getTimeZone();

    cv.put(Events.EVENT_TIMEZONE, tz.getDisplayName());
    /*
    cv.put(Events.STATUS, 1);
    cv.put(Events.VISIBLE, 0);
    cv.put("transparency", 0);

    return cv;
    */

    return cv;
}
10
FrancescoAzzola

次のコードを使用して、自分で作成したカレンダーにイベントを追加しました

public void SyncEvent(long id, int meeting_id, String EventName,
   String Stime, String Etime, String Description) {

 Calendar cal = Calendar.getInstance();
 cal.setTimeZone(TimeZone.getTimeZone("GMT-1"));
 Date dt = null;
 Date dt1 = null;
 try {
  dt = new SimpleDateFormat("yyyy-MM-dd HH:mm").parse(Stime);
  dt1 = new SimpleDateFormat("yyyy-MM-dd HH:mm").parse(Etime);

  Calendar beginTime = Calendar.getInstance();
  cal.setTime(dt);

  // beginTime.set(2013, 7, 25, 7, 30);
  beginTime.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH),
  cal.get(Calendar.DATE), cal.get(Calendar.HOUR_OF_DAY),
  cal.get(Calendar.MINUTE));

  Calendar endTime = Calendar.getInstance();
  cal.setTime(dt1);

  // endTime.set(2013, 7, 25, 14, 30);
  // endTime.set(year, month, day, hourOfDay, minute);
  endTime.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH),
  cal.get(Calendar.DATE), cal.get(Calendar.HOUR_OF_DAY),
  cal.get(Calendar.MINUTE));

  ContentResolver cr = this.mContext.getContentResolver();
  ContentValues values = new ContentValues();

  values.put(Events.DTSTART, beginTime.getTimeInMillis());
  values.put(Events.DTEND, endTime.getTimeInMillis());
  values.put(Events.TITLE, EventName);
  values.put(Events.DESCRIPTION, Description);
  values.put(Events.CALENDAR_ID, id);
  // values.put(Events._ID, meeting_id);
  values.put(Events.EVENT_TIMEZONE, TimeZone.getDefault().getID());

  Uri uri = cr.insert(Events.CONTENT_URI, values);
  long eventID = Long.parseLong(uri.getLastPathSegment());
 } catch (ParseException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
}
3
Dhruvit Darji

このコードはイベントを追加し、カレンダービューにイベントを表示します。 「保存」をクリックする必要はありません/ユーザーの操作は必要ありません。

            long calID = 3;
            long startMillis = 0;
            long endMillis = 0;
            Calendar beginTime = Calendar.getInstance();
            beginTime.set(2015, 6, 12, 7, 30);// set(int year, int month, int day, int hourOfDay, int minute)
            startMillis = beginTime.getTimeInMillis();
            Calendar endTime = Calendar.getInstance();
            endTime.set(2015, 6, 12, 8, 30);
            endMillis = endTime.getTimeInMillis();

            TimeZone tz = TimeZone.getDefault();

            ContentResolver cr = getContentResolver();
            ContentValues values = new ContentValues();
            values.put(CalendarContract.Events.DTSTART, startMillis);
            values.put(CalendarContract.Events.DTEND, endMillis);
            values.put(CalendarContract.Events.TITLE, "Jazzercise");
            values.put(CalendarContract.Events.DESCRIPTION, "Group workout");
            values.put(CalendarContract.Events.CALENDAR_ID, calID);
            values.put(CalendarContract.Events.EVENT_TIMEZONE,  tz.getID());
            Uri uri = cr.insert(CalendarContract.Events.CONTENT_URI, values);

            // get the event ID that is the last element in the Uri
            long eventID = Long.parseLong(uri.getLastPathSegment());


            Uri.Builder builder = CalendarContract.CONTENT_URI.buildUpon();
            builder.appendPath("time");
            ContentUris.appendId(builder, startMillis);
            Intent intent = new Intent(Intent.ACTION_VIEW).setData(builder.build());
            startActivity(intent);
1
Chinwe Asonye

インテントを使用してカレンダープロバイダーと通信する場合、お気づきのとおり、カレンダーアプリはユーザーに確認を求めます。これは、インテントを使用すると、特定の権限を要求する必要がないためです。

ちなみに、Googleはカレンダーの操作にインテントを使用することをお勧めします。

ただし、イベントの自動挿入が必要な場合は、アプリにマニフェストでWRITE_CALENDAR権限が必要です。インテントを使用する代わりに、ContentResolverを使用します。サンプルコードは https://developer.Android.com/guide/topics/providers/calendar-provider.html セクションイベントの追加

1
Matthew Burke