如何在Android中设置提醒?

如何在Android中设置提醒?,android,calendar,Android,Calendar,我正在尝试为Android构建一个日历应用程序。我被击中了中间。我已经设法从用户那里检索到时间和任务等信息 我不知道如何将此添加到android事件中。是否有类似于setEvent或类似的功能?您可以在具有通知机制的协作中使用AlarmManager 大概是这样的: Intent intent = new Intent(ctx, ReminderBroadcastReceiver.class); PendingIntent pendingIntent = PendingIntent.getBro

我正在尝试为Android构建一个日历应用程序。我被击中了中间。我已经设法从用户那里检索到时间和任务等信息


我不知道如何将此添加到android事件中。是否有类似于
setEvent
或类似的功能?

您可以在具有通知机制的协作中使用AlarmManager 大概是这样的:

Intent intent = new Intent(ctx, ReminderBroadcastReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(ctx, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager am = (AlarmManager) ctx.getSystemService(Activity.ALARM_SERVICE);
// time of of next reminder. Unix time.
long timeMs =...
if (Build.VERSION.SDK_INT < 19) {
    am.set(AlarmManager.RTC_WAKEUP, timeMs, pendingIntent);
} else {
    am.setExact(AlarmManager.RTC_WAKEUP, timeMs, pendingIntent);
}

不,如果您希望透明地将方法添加到用户的日历中,那么它比仅仅调用方法更复杂

你有两个选择

  • 调用在日历上添加事件的意图
    这将弹出日历应用程序,让用户添加事件。您可以传递一些参数来预填充字段:

    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", false);
    intent.putExtra("rrule", "FREQ=DAILY");
    intent.putExtra("endTime", cal.getTimeInMillis()+60*60*1000);
    intent.putExtra("title", "A Test Event from android app");
    startActivity(intent);
    
    或者更复杂的一个:

  • 使用此方法获取日历的引用
    (强烈建议不要使用此方法,因为它可能在较新的Android版本上中断):

    并以这种方式添加事件和提醒:

    // get calendar
    Calendar cal = Calendar.getInstance();     
    Uri EVENTS_URI = Uri.parse(getCalendarUriBase(this) + "events");
    ContentResolver cr = getContentResolver();
    
    // event insert
    ContentValues values = new ContentValues();
    values.put("calendar_id", 1);
    values.put("title", "Reminder Title");
    values.put("allDay", 0);
    values.put("dtstart", cal.getTimeInMillis() + 11*60*1000); // event starts at 11 minutes from now
    values.put("dtend", cal.getTimeInMillis()+60*60*1000); // ends 60 minutes from now
    values.put("description", "Reminder description");
    values.put("visibility", 0);
    values.put("hasAlarm", 1);
    Uri event = cr.insert(EVENTS_URI, values);
    
    // reminder insert
    Uri REMINDERS_URI = Uri.parse(getCalendarUriBase(this) + "reminders");
    values = new ContentValues();
    values.put( "event_id", Long.parseLong(event.getLastPathSegment()));
    values.put( "method", 1 );
    values.put( "minutes", 10 );
    cr.insert( REMINDERS_URI, values );
    
    您还需要将这些权限添加到此方法的清单中:

    <uses-permission android:name="android.permission.READ_CALENDAR" />
    <uses-permission android:name="android.permission.WRITE_CALENDAR" />
    
    
    
  • 更新:ICS问题

    上面的例子使用了未记录的日历API,新的公共日历API已经为ICS发布,因此出于这个原因,您应该使用新的android版本


    有关这方面的更多信息,请访问。

    Android完整的源代码,用于添加具有开始和结束时间格式的事件和提醒

    /** Adds Events and Reminders in Calendar. */
    private void addReminderInCalendar() {
        Calendar cal = Calendar.getInstance();
        Uri EVENTS_URI = Uri.parse(getCalendarUriBase(true) + "events");
        ContentResolver cr = getContentResolver();
        TimeZone timeZone = TimeZone.getDefault();
    
        /** Inserting an event in calendar. */
        ContentValues values = new ContentValues();
        values.put(CalendarContract.Events.CALENDAR_ID, 1);
        values.put(CalendarContract.Events.TITLE, "Sanjeev Reminder 01");
        values.put(CalendarContract.Events.DESCRIPTION, "A test Reminder.");
        values.put(CalendarContract.Events.ALL_DAY, 0);
        // event starts at 11 minutes from now
        values.put(CalendarContract.Events.DTSTART, cal.getTimeInMillis() + 11 * 60 * 1000);
        // ends 60 minutes from now
        values.put(CalendarContract.Events.DTEND, cal.getTimeInMillis() + 60 * 60 * 1000);
        values.put(CalendarContract.Events.EVENT_TIMEZONE, timeZone.getID());
        values.put(CalendarContract.Events.HAS_ALARM, 1);
        Uri event = cr.insert(EVENTS_URI, values);
    
        // Display event id
        Toast.makeText(getApplicationContext(), "Event added :: ID :: " + event.getLastPathSegment(), Toast.LENGTH_SHORT).show();
    
        /** Adding reminder for event added. */
        Uri REMINDERS_URI = Uri.parse(getCalendarUriBase(true) + "reminders");
        values = new ContentValues();
        values.put(CalendarContract.Reminders.EVENT_ID, Long.parseLong(event.getLastPathSegment()));
        values.put(CalendarContract.Reminders.METHOD, Reminders.METHOD_ALERT);
        values.put(CalendarContract.Reminders.MINUTES, 10);
        cr.insert(REMINDERS_URI, values);
    }
    
    /** Returns Calendar Base URI, supports both new and old OS. */
    private String getCalendarUriBase(boolean eventUri) {
        Uri calendarURI = null;
        try {
            if (android.os.Build.VERSION.SDK_INT <= 7) {
                calendarURI = (eventUri) ? Uri.parse("content://calendar/") : Uri.parse("content://calendar/calendars");
            } else {
                calendarURI = (eventUri) ? Uri.parse("content://com.android.calendar/") : Uri
                        .parse("content://com.android.calendar/calendars");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return calendarURI.toString();
    }
    
    /**在日历中添加事件和提醒*/
    私有void addalendar(){
    Calendar cal=Calendar.getInstance();
    urievents_Uri=Uri.parse(getCalendarUriBase(true)+“事件”);
    ContentResolver cr=getContentResolver();
    时区TimeZone=TimeZone.getDefault();
    /**在日历中插入事件*/
    ContentValues=新的ContentValues();
    value.put(CalendarContract.Events.CALENDAR\u ID,1);
    values.put(CalendarContract.Events.TITLE,“Sanjeev提醒01”);
    value.put(CalendarContract.Events.DESCRIPTION,“测试提醒”);
    value.put(CalendarContract.Events.ALL_DAY,0);
    //活动从现在起11分钟开始
    value.put(CalendarContract.Events.DTSTART,cal.getTimeInMillis()+11*60*1000);
    //60分钟后结束
    value.put(CalendarContract.Events.DTEND,cal.getTimeInMillis()+60*60*1000);
    value.put(CalendarContract.Events.EVENT_TIMEZONE,TIMEZONE.getID());
    value.put(CalendarContract.Events.HAS_报警,1);
    Uri事件=cr.insert(事件\ Uri,值);
    //显示事件id
    Toast.makeText(getApplicationContext(),“添加的事件::ID::”+Event.getLastPathSegment(),Toast.LENGTH_SHORT).show();
    /**为已添加的事件添加提醒*/
    Uri提醒_Uri=Uri.parse(getCalendarUriBase(true)+“提醒”);
    values=新的ContentValues();
    values.put(CalendarContract.members.EVENT_ID,Long.parseLong(EVENT.getLastPathSegment());
    values.put(CalendarContract.members.METHOD,members.METHOD\u ALERT);
    值。放置(CalendarContract.Members.MINUTES,10);
    cr.insert(提醒、URI、值);
    }
    /**返回日历基URI,支持新操作系统和旧操作系统*/
    私有字符串getCalendarUriBase(布尔eventUri){
    Uri calendarURI=null;
    试一试{
    
    如果(android.os.Build.VERSION.SDK_INT),这可能会有所帮助。但问题是,我不应该使用报警管理器。但仍然感谢您的帮助。使用变量但不显示其声明位置的答案是worst@ojonugwaochalifu抱歉,已修复。
    events.add(event);
    你能告诉我,你在这里指的是什么吗?因为我不知道“事件”是什么意思,它显示了错误。对不起,我在代码中引用了一个全局变量以将所有事件保留在一个列表中,不需要=)我将编辑答案,我应该提供什么来代替“act”。另一个错误的引用,该死,我会更新答案,getCalendarUriBase(Activity act)需要一个活动作为参数,如果您在活动中,只需提供“this”;)05-12 19:46:20.704:ERROR/AndroidRuntime(368):原因:java.lang.IllegalArgumentException:未知URL nullevents 05-12 19:46:20.704:ERROR/AndroidRuntime(368):位于android.content.ContentResolver.insert(ContentResolver.java:626)但当我尝试在我的系统中运行时,仍然会出现这些错误device@SanjeevKumar我们如何在一个事件上添加多次。我的意思是我想在1小时、20分钟和1分钟之前添加事件。@Umair Iqbal::为此,您只需将事件添加到日历中作为新事件。所有事件详细信息都将相同,只是时间会改变。每个事件它有自己的id,所以不会有任何问题,它可以正常工作。@pblead26::只需创建一个新项目并使用此方法,提供所需的权限。它可以正常工作。
    <uses-permission android:name="android.permission.READ_CALENDAR" />
    <uses-permission android:name="android.permission.WRITE_CALENDAR" />
    
    /** Adds Events and Reminders in Calendar. */
    private void addReminderInCalendar() {
        Calendar cal = Calendar.getInstance();
        Uri EVENTS_URI = Uri.parse(getCalendarUriBase(true) + "events");
        ContentResolver cr = getContentResolver();
        TimeZone timeZone = TimeZone.getDefault();
    
        /** Inserting an event in calendar. */
        ContentValues values = new ContentValues();
        values.put(CalendarContract.Events.CALENDAR_ID, 1);
        values.put(CalendarContract.Events.TITLE, "Sanjeev Reminder 01");
        values.put(CalendarContract.Events.DESCRIPTION, "A test Reminder.");
        values.put(CalendarContract.Events.ALL_DAY, 0);
        // event starts at 11 minutes from now
        values.put(CalendarContract.Events.DTSTART, cal.getTimeInMillis() + 11 * 60 * 1000);
        // ends 60 minutes from now
        values.put(CalendarContract.Events.DTEND, cal.getTimeInMillis() + 60 * 60 * 1000);
        values.put(CalendarContract.Events.EVENT_TIMEZONE, timeZone.getID());
        values.put(CalendarContract.Events.HAS_ALARM, 1);
        Uri event = cr.insert(EVENTS_URI, values);
    
        // Display event id
        Toast.makeText(getApplicationContext(), "Event added :: ID :: " + event.getLastPathSegment(), Toast.LENGTH_SHORT).show();
    
        /** Adding reminder for event added. */
        Uri REMINDERS_URI = Uri.parse(getCalendarUriBase(true) + "reminders");
        values = new ContentValues();
        values.put(CalendarContract.Reminders.EVENT_ID, Long.parseLong(event.getLastPathSegment()));
        values.put(CalendarContract.Reminders.METHOD, Reminders.METHOD_ALERT);
        values.put(CalendarContract.Reminders.MINUTES, 10);
        cr.insert(REMINDERS_URI, values);
    }
    
    /** Returns Calendar Base URI, supports both new and old OS. */
    private String getCalendarUriBase(boolean eventUri) {
        Uri calendarURI = null;
        try {
            if (android.os.Build.VERSION.SDK_INT <= 7) {
                calendarURI = (eventUri) ? Uri.parse("content://calendar/") : Uri.parse("content://calendar/calendars");
            } else {
                calendarURI = (eventUri) ? Uri.parse("content://com.android.calendar/") : Uri
                        .parse("content://com.android.calendar/calendars");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return calendarURI.toString();
    }
    
    <uses-permission android:name="android.permission.READ_CALENDAR" />
    <uses-permission android:name="android.permission.WRITE_CALENDAR" />