How to add calendar events to default calendar, silently without Intent, in android 4?

后端 未结 6 1138
迷失自我
迷失自我 2020-12-04 16:41

I want to add calendar events programmatically (directly) in android 4+. Is it this possible to be tested on emulator? I don\'t own an android phone. Some sample code wou

相关标签:
6条回答
  • 2020-12-04 17:15

    Using this code, you can programmatically add an event to device calendar. I have tested in Marshmallow, and it works fine for me.

    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();
            }
        }
    
    0 讨论(0)
  • 2020-12-04 17:18

    Here is the way to ask user to which calendar the event has to be added. As my requirement was this and didn't find the solution at one place. I have summarized and came up with this solution, hope it helps someone :)

    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();
            }
    
    0 讨论(0)
  • 2020-12-04 17:25

    Dont Forget to add Permission to Manifest

    <uses-permission android:name="android.permission.READ_CALENDAR"/>
    <uses-permission android:name="android.permission.WRITE_CALENDAR"/>
    

    Code from :->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());
    
    0 讨论(0)
  • 2020-12-04 17:26

    I believe the section you are looking for is Using an intent to insert an event. In this section it describes how to create an intent for the event you want to add and then the default calender program on the emulator will respond and add it. You may have to set up a dummy profile so that the calendar program will start if you actually want to see that it receives the correct information.


    Code from 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, "rowan@example.com,trevor@example.com");
    startActivity(intent);
    
    0 讨论(0)
  • 2020-12-04 17:27

    Agree with above all answers but import is calender Id. you can not use 1 as samsung phone uses 1 for their calender(S Planner).So calender ID is id for which email you want event. you can get calender id by following code for specific event

    int calenderId=-1;
            String calenderEmaillAddress="xxx@gmail.com";
            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
    
    
            }
    
    0 讨论(0)
  • 2020-12-04 17:36

    Here is a working example of what i eventually made it:

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

    where dtuntil is

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

    Ref: Recurrence Rule

    0 讨论(0)
提交回复
热议问题