【问题标题】:How to set a reminder in Android?如何在Android中设置提醒?
【发布时间】:2011-05-12 09:41:17
【问题描述】:

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

我不知道如何将它添加到 android 事件中。有没有类似setEvent 或类似的东西?

【问题讨论】:

    标签: android calendar


    【解决方案1】:

    不,如果你想透明地把它添加到用户的日历中,它比仅仅调用一个方法更复杂。

    你有几个选择;

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

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

      或者更复杂的一个:

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

      private String getCalendarUriBase(Activity act) {
      
          String calendarUriBase = null;
          Uri calendars = Uri.parse("content://calendar/calendars");
          Cursor managedCursor = null;
          try {
              managedCursor = act.managedQuery(calendars, null, null, null, null);
          } catch (Exception e) {
          }
          if (managedCursor != null) {
              calendarUriBase = "content://calendar/";
          } else {
              calendars = Uri.parse("content://com.android.calendar/calendars");
              try {
                  managedCursor = act.managedQuery(calendars, null, null, null, null);
              } catch (Exception e) {
              }
              if (managedCursor != null) {
                  calendarUriBase = "content://com.android.calendar/";
              }
          }
          return calendarUriBase;
      }
      

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

      // 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 版本,您应该使用CalendarContract

    更多信息请访问this blog post

    【讨论】:

    • events.add(event); 你能告诉我,你在这里指的是什么。因为我不知道“事件”是什么意思,它显示错误。
    • 抱歉,我在我的代码中引用了一个全局变量来将所有事件保存在一个列表中,这不是必需的 =) 我将编辑答案
    • 我应该提供什么而不是“行动”。
    • 另一个错误的参考,该死,我会更新答案,getCalendarUriBase(Activity act) 需要一个活动作为参数,如果你在你的活动中,只需提供“this”;)
    • 05-12 19:46:20.704: ERROR/AndroidRuntime(368): Caused by: java.lang.IllegalArgumentException: Unknown URL nullevents 05-12 19:46:20.704: ERROR/AndroidRuntime(368 ): at android.content.ContentResolver.insert(ContentResolver.java:626) 但是当我尝试在我的设备中运行它时仍然出现这些错误
    【解决方案2】:

    您可以在带有通知机制的合作社中使用 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);
    }
    

    它开始报警。

    public class ReminderBroadcastReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
                    .setSmallIcon(...)
                    .setContentTitle(..)
                    .setContentText(..);
            Intent intentToFire = new Intent(context, Activity.class);
            PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intentToFire, PendingIntent.FLAG_UPDATE_CURRENT);
            builder.setContentIntent(pendingIntent);
            NotificationManagerCompat.from(this);.notify((int) System.currentTimeMillis(), builder.build());
        }
    }
    

    【讨论】:

    • 这可能会有所帮助。但问题是,我不应该使用警报管理器。但仍然感谢您的帮助。
    • 使用变量而不显示它们在哪里声明的答案是最糟糕的
    • @ojonugwaochalifu 抱歉,已修复。
    【解决方案3】:

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

    为您的清单文件添加权限。

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

    【讨论】:

    • @Sanjeev Kumar 我们如何在一个事件中添加多次。我的意思是我想在 1 小时、20 分钟和 1 分钟之前添加事件。
    • @ Umair Iqbal :: 为此,您只需将事件添加到日历中作为新事件,所有事件详细信息都将相同,只是时间会改变。每个事件都有自己的 id,因此不会有任何问题,并且可以正常工作。
    • @pblead26 :: 只需新建一个项目并使用此方法,提供所需的权限即可。它会起作用的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多