Android 向系统日历中添加日程事件(本地推送)

简介: 读写权限是必须要加的; 添加事件

读写权限是必须要加滴


compile 'com.lovedise:permissiongen:0.0.6'//6.0权限包
  <uses-permission android:name="android.permission.READ_CALENDAR" />
  <uses-permission android:name="android.permission.WRITE_CALENDAR" />


添加事件


String data = "";
public void setReminderUtils(String strdata) {
    if (!MStringUtils.isNullOrEmpty(strdata)) {
        data = strdata;
        PermissionGen.with(MainActivity.this)
                .addRequestCode(15)
                .permissions(
                        Manifest.permission.READ_CALENDAR,
                        Manifest.permission.WRITE_CALENDAR
                ).request();
    }
}
@PermissionSuccess(requestCode = 15)
public void doReminder() {
    if (!EventReminderUtils.selectCalendarEvent(this, data)) {
        EventReminderUtils.addCalendarEvent(this, data);
    }
}
@PermissionFail(requestCode = 15)
public void doFailReminder() {
    MyToast.showMessage("手机应用权限被拒绝");
}
//删除事件
public void deleteReminder() {
    YouPinLog.e("Reminder", "setReminderUtils");
    PermissionGen.with(MainActivity.this)
            .addRequestCode(16)
            .permissions(
                    Manifest.permission.READ_CALENDAR,
                    Manifest.permission.WRITE_CALENDAR
            ).request();
}
@PermissionSuccess(requestCode = 16)
public void dodeleteReminder() {
    EventReminderUtils.deleteCalendarEvent(this);
}
@PermissionFail(requestCode = 16)
public void doFaildeleteReminder() {
    MyToast.showMessage("手机应用权限被拒绝");
}


package com.a.a.utils;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Color;
import android.net.Uri;
import android.provider.CalendarContract;
import java.text.SimpleDateFormat;
import java.util.TimeZone;
/**
 * 提醒
 * @author Administrator
 *
 */
public class EventReminderUtils
{
   public EventReminderUtils(){}
   private static String CALANDER_URL = "content://com.android.calendar/calendars";
   private static String CALANDER_EVENT_URL = "content://com.android.calendar/events";
   private static String CALANDER_REMIDER_URL = "content://com.android.calendar/reminders";
   private static String CALENDARS_NAME = "table";
   private static String CALENDARS_ACCOUNT_NAME = "table@table.com";
   private static String CALENDARS_ACCOUNT_TYPE = "com.android.table";
   private static String CALENDARS_DISPLAY_NAME = "帅帅";
   public static String DATETIME_FORMAT_PATTERN = "yyyy-MM-dd HH:mm";
   //删除
   public static void deleteCalendarEvent(Context context){
      Cursor eventCursor = context.getContentResolver().query(Uri.parse(CALANDER_EVENT_URL), null, null, null, null);
      try {
         if (eventCursor == null)//查询返回空值
            return;
         if (eventCursor.getCount() > 0) {
            //遍历所有事件,找到title跟需要查询的title一样的项
            for (eventCursor.moveToFirst(); !eventCursor.isAfterLast(); eventCursor.moveToNext()) {
               String eventTitle = eventCursor.getString(eventCursor.getColumnIndex("title"));
               if (eventTitle.startsWith("标题提醒")) {
                  int id = eventCursor.getInt(eventCursor.getColumnIndex(CalendarContract.Calendars._ID));//取得id
                  Uri deleteUri = ContentUris.withAppendedId(Uri.parse(CALANDER_EVENT_URL), id);
                  int rows = context.getContentResolver().delete(deleteUri, null, null);
                  if (rows == -1) {
                     //事件删除失败
                     return;
                  }
               }
            }
         }
      } finally {
         if (eventCursor != null) {
            eventCursor.close();
         }
      }
   }
   public static boolean selectCalendarEvent(Context context,String data){
      Cursor eventCursor = context.getContentResolver().query(Uri.parse(CALANDER_EVENT_URL), null, null, null, null);
      try {
         if (eventCursor == null)//查询返回空值
            return false;
         if (eventCursor.getCount() > 0) {
            //遍历所有事件,找到title跟需要查询的title一样的项
            for (eventCursor.moveToFirst(); !eventCursor.isAfterLast(); eventCursor.moveToNext()) {
               String eventTitle = eventCursor.getString(eventCursor.getColumnIndex("title"));
               if (eventTitle.equals("标题提醒"+data)) {
                  return true;
               }
            }
         }
         return false;
      } finally {
         if (eventCursor != null) {
            eventCursor.close();
         }
      }
   }
   /**
    * 添加事件
    * @param context
    */
   public static void addCalendarEvent(Context context,String data){
      // 获取日历账户的id
      int calId = checkAndAddCalendarAccount(context);
      if (calId < 0) {
         // 获取账户id失败直接返回,添加日历事件失败
         return;
      }
      ContentValues event = new ContentValues();
      event.put("title", "标题提醒"+data);
      event.put("description", "您有一个美女未领,请尽快领取!");
      // 插入账户的id
      event.put("calendar_id", calId);
      long start = getDateLong(data+" 9:00");
      event.put(CalendarContract.Events.DTSTART, start);
      event.put(CalendarContract.Events.DTEND, start+10*1000);
      event.put(CalendarContract.Events.HAS_ALARM, 1);//设置有闹钟提醒
      event.put(CalendarContract.Events.EVENT_TIMEZONE, "Asia/Shanghai");  //这个是时区,必须有,
      //添加事件
      Uri newEvent = context.getContentResolver().insert(Uri.parse(CALANDER_EVENT_URL), event);
      if (newEvent == null) {
         // 添加日历事件失败直接返回
         return;
      }
      //事件提醒的设定
      ContentValues values = new ContentValues();
      values.put(CalendarContract.Reminders.EVENT_ID, ContentUris.parseId(newEvent));
      // 提前10分钟有提醒
      values.put(CalendarContract.Reminders.MINUTES, 10);
      values.put(CalendarContract.Reminders.METHOD, CalendarContract.Reminders.METHOD_ALERT);
      Uri uri = context.getContentResolver().insert(Uri.parse(CALANDER_REMIDER_URL), values);
      if(uri == null) {
         // 添加闹钟提醒失败直接返回
         return;
      }
   }
   //检查是否已经添加了日历账户,如果没有添加先添加一个日历账户再查询
   private static int checkAndAddCalendarAccount(Context context){
      int oldId = checkCalendarAccount(context);
      if( oldId >= 0 ){
         return oldId;
      }else{
         long addId = addCalendarAccount(context);
         if (addId >= 0) {
            return checkCalendarAccount(context);
         } else {
            return -1;
         }
      }
   }
   private static int checkCalendarAccount(Context context) {
      Cursor userCursor = context.getContentResolver().query(Uri.parse(CALANDER_URL), null, null, null, null);
      try {
         if (userCursor == null)//查询返回空值
            return -1;
         int count = userCursor.getCount();
         if (count > 0) {//存在现有账户,取第一个账户的id返回
            userCursor.moveToFirst();
            return userCursor.getInt(userCursor.getColumnIndex(CalendarContract.Calendars._ID));
         } else {
            return -1;
         }
      } finally {
         if (userCursor != null) {
            userCursor.close();
         }
      }
   }
   private static long addCalendarAccount(Context context) {
      TimeZone timeZone = TimeZone.getDefault();
      ContentValues value = new ContentValues();
      value.put(CalendarContract.Calendars.NAME, CALENDARS_NAME);
      value.put(CalendarContract.Calendars.ACCOUNT_NAME, CALENDARS_ACCOUNT_NAME);
      value.put(CalendarContract.Calendars.ACCOUNT_TYPE, CALENDARS_ACCOUNT_TYPE);
      value.put(CalendarContract.Calendars.CALENDAR_DISPLAY_NAME, CALENDARS_DISPLAY_NAME);
      value.put(CalendarContract.Calendars.VISIBLE, 1);
      value.put(CalendarContract.Calendars.CALENDAR_COLOR, Color.BLUE);
      value.put(CalendarContract.Calendars.CALENDAR_ACCESS_LEVEL, CalendarContract.Calendars.CAL_ACCESS_OWNER);
      value.put(CalendarContract.Calendars.SYNC_EVENTS, 1);
      value.put(CalendarContract.Calendars.CALENDAR_TIME_ZONE, timeZone.getID());
      value.put(CalendarContract.Calendars.OWNER_ACCOUNT, CALENDARS_ACCOUNT_NAME);
      value.put(CalendarContract.Calendars.CAN_ORGANIZER_RESPOND, 0);
      Uri calendarUri = Uri.parse(CALANDER_URL);
      calendarUri = calendarUri.buildUpon()
            .appendQueryParameter(CalendarContract.CALLER_IS_SYNCADAPTER, "true")
            .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_NAME, CALENDARS_ACCOUNT_NAME)
            .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_TYPE, CALENDARS_ACCOUNT_TYPE)
            .build();
      Uri result = context.getContentResolver().insert(calendarUri, value);
      long id = result == null ? -1 : ContentUris.parseId(result);
      return id;
   }
   /**
    * 日期格式字符串转换成时间戳
    *
    * @return
    */
   public static long getDateLong(String date_str) {
      try {
         SimpleDateFormat sdf = new SimpleDateFormat(DATETIME_FORMAT_PATTERN);
         return sdf.parse(date_str).getTime();
      } catch (Exception e) {
         e.printStackTrace();
      }
      return 0;
   }
}


相关文章
|
27天前
|
人工智能 搜索推荐 物联网
Android系统版本演进与未来展望####
本文深入探讨了Android操作系统从诞生至今的发展历程,详细阐述了其关键版本迭代带来的创新特性、用户体验提升及对全球移动生态系统的影响。通过对Android历史版本的回顾与分析,本文旨在揭示其成功背后的驱动力,并展望未来Android可能的发展趋势与面临的挑战,为读者呈现一个既全面又具深度的技术视角。 ####
|
25天前
|
IDE Java 开发工具
移动应用与系统:探索Android开发之旅
在这篇文章中,我们将深入探讨Android开发的各个方面,从基础知识到高级技术。我们将通过代码示例和案例分析,帮助读者更好地理解和掌握Android开发。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和技巧。让我们一起开启Android开发的旅程吧!
|
13天前
|
监控 Java Android开发
深入探索Android系统的内存管理机制
本文旨在全面解析Android系统的内存管理机制,包括其工作原理、常见问题及其解决方案。通过对Android内存模型的深入分析,本文将帮助开发者更好地理解内存分配、回收以及优化策略,从而提高应用性能和用户体验。
|
14天前
|
存储 安全 Android开发
探索Android系统的最新安全特性
在数字时代,智能手机已成为我们生活中不可或缺的一部分。随着技术的不断进步,手机操作系统的安全性也越来越受到重视。本文将深入探讨Android系统最新的安全特性,包括其设计理念、实施方式以及对用户的影响。通过分析这些安全措施如何保护用户免受恶意软件和网络攻击的威胁,我们希望为读者提供对Android安全性的全面了解。
|
27天前
|
监控 Java Android开发
深入探讨Android系统的内存管理机制
本文将深入分析Android系统的内存管理机制,包括其内存分配、回收策略以及常见的内存泄漏问题。通过对这些方面的详细讨论,读者可以更好地理解Android系统如何高效地管理内存资源,从而提高应用程序的性能和稳定性。
62 16
|
20天前
|
安全 Android开发 iOS开发
深入探讨Android与iOS系统的差异及未来发展趋势
本文旨在深入分析Android和iOS两大移动操作系统的核心技术差异、用户体验以及各自的市场表现,进一步探讨它们在未来技术革新中可能的发展方向。通过对比两者的开放性、安全性、生态系统等方面,本文揭示了两大系统在移动设备市场中的竞争态势和潜在变革。
|
1月前
|
算法 JavaScript Android开发
|
1月前
|
安全 搜索推荐 Android开发
揭秘安卓与iOS系统的差异:技术深度对比
【10月更文挑战第27天】 本文深入探讨了安卓(Android)与iOS两大移动操作系统的技术特点和用户体验差异。通过对比两者的系统架构、应用生态、用户界面、安全性等方面,揭示了为何这两种系统能够在市场中各占一席之地,并为用户提供不同的选择。文章旨在为读者提供一个全面的视角,理解两种系统的优势与局限,从而更好地根据自己的需求做出选择。
92 2
|
1月前
|
安全 搜索推荐 程序员
深入探索Android系统的碎片化问题及其解决方案
在移动操作系统的世界中,Android以其开放性和灵活性赢得了广泛的市场份额。然而,这种开放性也带来了一个众所周知的问题——系统碎片化。本文旨在探讨Android系统碎片化的现状、成因以及可能的解决方案,为开发者和用户提供一种全新的视角来理解这一现象。通过分析不同版本的Android系统分布、硬件多样性以及更新机制的影响,我们提出了一系列针对性的策略,旨在减少碎片化带来的影响,提升用户体验。
|
1月前
|
安全 Android开发 iOS开发
深入探索iOS与Android系统的差异性及优化策略
在当今数字化时代,移动操作系统的竞争尤为激烈,其中iOS和Android作为市场上的两大巨头,各自拥有庞大的用户基础和独特的技术特点。本文旨在通过对比分析iOS与Android的核心差异,探讨各自的优势与局限,并提出针对性的优化策略,以期为用户提供更优质的使用体验和为开发者提供有价值的参考。