Android 操作体系日历完结提示功用 顺便开关闹钟

假如想要一个稳定且不必忧虑生命周期的提示办法,能够试试利用体系日历去完结使命的提示,或许某个活动的预定。

gitee:顺手给小冷个star吧 这对小冷很重要 代码地址

环境

  • Java 11

  • Android sdk 30

  • Gredle 7.1

    minSdkVersion 23
    targetSdkVersion 30
    
  • 测验机型 mi 8(安卓 9) mi10 pro(安卓11) huawei m8(安卓7)

前置知识

日历操作表

其实完结这个功用实质是对安卓原生数据库的增删改查操作,下图便是30sdk中咱们能够用到的体系常量

每一个静态类都对应这一个体系中的数据表。能够经过 下面指令去找到对应的途径

CalendarContract.{table_name}.CONTENT_URI

Android 操作系统日历完成提醒功能 附带开关闹钟 适配高版本安卓

  • events 是咱们主要的使命内容和装备表
  • Reminders 是日历提示设置表
  • extendedProperties 是拓展特点类
  • Calendars 存放根底信息 如日历账户等信息

操作日历和设置闹钟提示 其实便是对上述三张表的处理

ContentValues

这个类是用来存放咱们自己界说的一些条件 ,在刺进体系表之前 拼装数据和一些必备的装备,运用的办法与Map共同。

PS: 由于底层保护了一个arrayMap 所以允许咱们传入K,V形式的数据

  ContentValues event = new ContentValues();
    event.put("title", title);
    event.put("description", description);
    event.put("calendar_id", calId); //刺进账户的id
    event.put("eventStatus", 1);
    event.put(CalendarContract.Events._ID, eventId);
    event.put(CalendarContract.Events.HAS_EXTENDED_PROPERTIES, true);
    event.put(CalendarContract.Events.DTSTART, start);
    event.put(CalendarContract.Events.DTEND, end);

咱们刺进数据表的步骤为

  1. 运用 ContentValues 拼装数据/加入需求的体系装备
  2. 运用 CalendarContract 拿到对应的体系途径
  3. 调用 context.getContentResolver() 这儿有封装好的增上改查办法来完结对底层数据库的操作

功用流程

1、获取权限

AndroidManifest 中增加权限

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

假如安卓版别高 最好在activity中运用动态的权限校验,在初始化的时候调用此办法,就能够完结弹窗动态权限校验了

 checkPermission(0, Manifest.permission.READ_CALENDAR, Manifest.permission.WRITE_CALENDAR); 
​
//   权限获取
  private void checkPermission(int callbackId, String... permissionsId) {
    boolean permissions = true;
    for (String p : permissionsId) {
      permissions = permissions && ContextCompat.checkSelfPermission(this, p) == PERMISSION_GRANTED;
     }
​
    if (!permissions)
      ActivityCompat.requestPermissions(this, permissionsId, callbackId);
   }

Android 操作系统日历完成提醒功能 附带开关闹钟 适配高版本安卓

2、创立日历账户

体系其实有为咱们创立默许账户,但是既然日历有为咱们预备创立用户的接口,那么咱们还是创立一个归于自己app的用户,之后的各种操作也不会影响到体系的内容

咱们自己界说了日历账户信息 在每次操作日历前 保证咱们的app日历账户存在于体系日历,假如不存在就去创立一个 (不会重复创立 不必忧虑账号冗余)

  private static String CALENDARS_NAME = "TaskList";
  private static String CALENDARS_ACCOUNT_NAME = "MyTaskList";
  private static String CALENDARS_ACCOUNT_TYPE = "MyTaskList";
  /**
   * 这儿创立账户的展现称号,体系日历为咱们供给了创立账户的入口,那咱们就不运用体系自带的账户,创立一个自己app的账户
   */
  private static String CALENDARS_DISPLAY_NAME = "靠谱的使命清单";  
​
/**
   * 查看是否存在现有账户,存在则回来账户id,不然回来-1
   */
  @SuppressLint("Range")
  private static int checkCalendarAccount(Context context) {
    Cursor userCursor = context.getContentResolver().query(CalendarContract.Calendars.CONTENT_URI, null, null, null, null);
    try {
      if (userCursor == null) { //查询回来空值
        return -1;
       }
      int count = userCursor.getCount();
      if (count > 0) { //存在现有账户,取第一个账户的id回来
        for (int i = 0; i <= count - 1; i++) {
          if (i == 0) {
            userCursor.moveToFirst();
           } else {
            userCursor.moveToNext();
           }
          String type = userCursor.getString(userCursor.getColumnIndex(CalendarContract.Calendars.ACCOUNT_TYPE));
          if (type.equals(CALENDARS_ACCOUNT_TYPE)) {
            return userCursor.getInt(userCursor.getColumnIndex(CalendarContract.Calendars._ID));
           }
         }
       }
      return -1;
     } finally {
      if (userCursor != null) {
        userCursor.close();
       }
     }
   }

增加办法

其实增加办法就和咱们平常操作数据库十分相似,便是拼装数据,放入到数据表中

  private static String CALENDARS_NAME = "TaskList";
  private static String CALENDARS_ACCOUNT_NAME = "MyTaskList";
  private static String CALENDARS_ACCOUNT_TYPE = "MyTaskList";
  /**
   * 这儿创立账户的展现称号,体系日历为咱们供给了创立账户的入口,那咱们就不运用体系自带的账户,创立一个自己app的账户
   */
  private static String CALENDARS_DISPLAY_NAME = "靠谱的使命清单";    
​
  /**
   * 增加日历账户,账户创立成功则回来账户id,不然回来-1
   */
  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 = CalendarContract.Calendars.CONTENT_URI;
    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;
   }

在拥有查看和创立办法后,咱们去笼统一个条件判别办法,来用于一次调用完结创立日历账户 查看的完结流程

checkAndAddCalendarAccount

  /**
   * 查看是否现已增加了日历账户,假如没有增加先增加一个日历账户再查询
   * 获取账户成功回来账户id,不然回来-1
   */
  @RequiresApi(api = Build.VERSION_CODES.N)
  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;
       }
     }
   }

3、拼装数据,增加日程

这个其实就比较简单了 ,便是为数据表增加行数和内容

  1. 查看日历账户 而且获取id

  2. 拼装event 新增event

  3. 依据isAlarm判别是否需求增加闹钟提示

    1. 在event数据中

       event.put(CalendarContract.Events.HAS_ALARM, 1);
      

      是用于老版别安卓的闹钟提示 比较新的国内安卓版别都不在依据这个字段来判别了

    2. 新一些的安卓版别 运用ExtendedProperties 来增加额外特点,现在已知miui的高版别是需求设置

       extendedProperties.put(CalendarContract.ExtendedProperties.VALUE, "{"need_alarm":true}");
      

      而且账户内容要是咱们自己创立的账户才能够完结闹钟提示

      PS: 在封装东西类前 我是用体系默许用户 无法设置 不知道原因

  4. 设置 Reminders 日程提示办法等

  5. 完结日程设置

调用完这个办法你就能够发现日历里 有对应的日程了


    /**
     * 这个是要害办法,调用刺进日程提示
     *
     * @param context
     * @param eventId         事情id
     * @param title           提示事情标题
     * @param description     事情描述
     * @param reminderTime    使命开端时刻,这儿参数名不太合适,后边会加提示时刻,
     * @param endTime         使命完毕时刻
     * @param previousMinutes 提早多少分钟提示,后续运用
     * @param isAlarm         是否需求闹钟提示
     */
    @RequiresApi(api = Build.VERSION_CODES.N)
    @SuppressLint("Range")
    public static Long addCalendarEvent(Context context, long eventId, String title, String description, long reminderTime, long endTime, int previousMinutes, boolean isAlarm) {
        if (context == null) {
            return -1L;
        }
        int calId = checkAndAddCalendarAccount(context); //获取日历账户的id
        if (calId < 0) { //获取账户id失利直接回来,增加日历事情失利
            return -1L;
        }
        //增加日历事情
        Calendar mCalendar = Calendar.getInstance();
        mCalendar.setTimeInMillis(reminderTime);//设置开端时刻
        long start = mCalendar.getTime().getTime();
        mCalendar.setTimeInMillis(endTime);//设置停止时刻
        long end = mCalendar.getTime().getTime();
        ContentValues event = new ContentValues();
        event.put("title", title);
        event.put("description", description);
        event.put("calendar_id", calId); //刺进账户的id
        event.put("eventStatus", 1);
        event.put(CalendarContract.Events._ID, eventId);
        event.put(CalendarContract.Events.HAS_EXTENDED_PROPERTIES, true);
        event.put(CalendarContract.Events.DTSTART, start);
        event.put(CalendarContract.Events.DTEND, end);
        if (isAlarm) {
            event.put(CalendarContract.Events.HAS_ALARM, 1);//设置有闹钟提示,但是经测验,此方案无效
        }
        event.put(CalendarContract.Events.EVENT_TIMEZONE, TimeZone.getDefault().getDisplayName());//这个是时区,必须有
        Uri newEvent = context.getContentResolver().insert(CalendarContract.Events.CONTENT_URI, event); //增加事情
        if (newEvent == null) { //增加日历事情失利直接回来
            return -1L;
        }
        //扩展特点 用于高版别安卓体系设置闹钟提示
        if (isAlarm) {
            Uri extendedPropUri = CalendarContract.ExtendedProperties.CONTENT_URI;
            extendedPropUri = extendedPropUri.buildUpon()
                    .appendQueryParameter(CalendarContract.CALLER_IS_SYNCADAPTER, "true")
                    .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_NAME, CALENDARS_ACCOUNT_NAME)
                    .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_TYPE, CALENDARS_ACCOUNT_TYPE).build();
            ContentValues extendedProperties = new ContentValues();
            extendedProperties.put(CalendarContract.ExtendedProperties.EVENT_ID, ContentUris.parseId(newEvent));
            extendedProperties.put(CalendarContract.ExtendedProperties.VALUE, "{"need_alarm":true}");
            extendedProperties.put(CalendarContract.ExtendedProperties.NAME, "agenda_info");
            Uri uriExtended = context.getContentResolver().insert(extendedPropUri, extendedProperties);
            if (uriExtended == null) { //增加事情提示失利直接回来
                return -1L;
            }
        }
        //事情提示的设定
        ContentValues values = new ContentValues();
        values.put(CalendarContract.Reminders.EVENT_ID, ContentUris.parseId(newEvent));
        values.put(CalendarContract.Reminders.MINUTES, 0);// 提早previousDate天有提示
        values.put(CalendarContract.Reminders.METHOD, CalendarContract.Reminders.METHOD_ALERT);
        Uri uri = context.getContentResolver().insert(CalendarContract.Reminders.CONTENT_URI, values);
        if (uri == null) { //增加事情提示失利直接回来
            return -1L;
        }
        Toast.makeText(context, "设置日程成功!!!", Toast.LENGTH_LONG).show();
        return eventId;
    }

4、 删去日程

这个就比较简单,由于咱们是自界说日程id 所以咱们直接经过传入的id 删去对应的日程即可,网上的东西类都是用title 容易删去同名日程

    /**
     * 删去日历事情
     */
    public static void deleteCalendarEvent(Context context, Long delEventID) {
        if (context == null) {
            return;
        }
        Uri deleteUri = ContentUris.withAppendedId(CalendarContract.Events.CONTENT_URI, delEventID);
        int rows = context.getContentResolver().delete(deleteUri, null, null);
        if (rows == -1) { //事情删去失利
            return;
        }
    }

东西类代码

import android.annotation.SuppressLint;
import android.app.Activity;
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.os.Build;
import android.provider.CalendarContract;
import android.util.Log;
import android.widget.Toast;
import androidx.annotation.RequiresApi;
import java.util.Calendar;
import java.util.TimeZone;
public class CalendarReminderUtils {
    private static String CALENDARS_NAME = "TaskList";
    private static String CALENDARS_ACCOUNT_NAME = "MyTaskList";
    private static String CALENDARS_ACCOUNT_TYPE = "MyTaskList";
    /**
     * 这儿创立账户的展现称号,体系日历为咱们供给了创立账户的入口,那咱们就不运用体系自带的账户,创立一个自己app的账户
     */
    private static String CALENDARS_DISPLAY_NAME = "靠谱的使命清单";
    /**
     * 查看是否现已增加了日历账户,假如没有增加先增加一个日历账户再查询
     * 获取账户成功回来账户id,不然回来-1
     */
    @RequiresApi(api = Build.VERSION_CODES.N)
    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;
            }
        }
    }
    /**
     * 查看是否存在现有账户,存在则回来账户id,不然回来-1
     */
    @SuppressLint("Range")
    private static int checkCalendarAccount(Context context) {
        Cursor userCursor = context.getContentResolver().query(CalendarContract.Calendars.CONTENT_URI, null, null, null, null);
        try {
            if (userCursor == null) { //查询回来空值
                return -1;
            }
            int count = userCursor.getCount();
            if (count > 0) { //存在现有账户,取第一个账户的id回来
                for (int i = 0; i <= count - 1; i++) {
                    if (i == 0) {
                        userCursor.moveToFirst();
                    } else {
                        userCursor.moveToNext();
                    }
                    String type = userCursor.getString(userCursor.getColumnIndex(CalendarContract.Calendars.ACCOUNT_TYPE));
                    if (type.equals(CALENDARS_ACCOUNT_TYPE)) {
                        return userCursor.getInt(userCursor.getColumnIndex(CalendarContract.Calendars._ID));
                    }
                }
            }
            return -1;
        } finally {
            if (userCursor != null) {
                userCursor.close();
            }
        }
    }
    /**
     * 增加日历账户,账户创立成功则回来账户id,不然回来-1
     */
    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 = CalendarContract.Calendars.CONTENT_URI;
        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;
    }
    /**
     * 这个是要害办法,调用刺进日程提示
     *
     * @param context
     * @param eventId         事情id
     * @param title           提示事情标题
     * @param description     事情描述
     * @param reminderTime    使命开端时刻,这儿参数名不太合适,后边会加提示时刻,
     * @param endTime         使命完毕时刻
     * @param previousMinutes 提早多少分钟提示,后续运用
     * @param isAlarm         是否需求闹钟提示
     */
    @RequiresApi(api = Build.VERSION_CODES.N)
    @SuppressLint("Range")
    public static Long addCalendarEvent(Context context, long eventId, String title, String description, long reminderTime, long endTime, int previousMinutes, boolean isAlarm) {
        if (context == null) {
            return -1L;
        }
        int calId = checkAndAddCalendarAccount(context); //获取日历账户的id
        if (calId < 0) { //获取账户id失利直接回来,增加日历事情失利
            return -1L;
        }
        //增加日历事情
        Calendar mCalendar = Calendar.getInstance();
        mCalendar.setTimeInMillis(reminderTime);//设置开端时刻
        long start = mCalendar.getTime().getTime();
        mCalendar.setTimeInMillis(endTime);//设置停止时刻
        long end = mCalendar.getTime().getTime();
        ContentValues event = new ContentValues();
        event.put("title", title);
        event.put("description", description);
        event.put("calendar_id", calId); //刺进账户的id
        event.put("eventStatus", 1);
        event.put(CalendarContract.Events._ID, eventId);
        event.put(CalendarContract.Events.HAS_EXTENDED_PROPERTIES, true);
        event.put(CalendarContract.Events.DTSTART, start);
        event.put(CalendarContract.Events.DTEND, end);
        if (isAlarm) {
            event.put(CalendarContract.Events.HAS_ALARM, 1);//设置有闹钟提示,但是经测验,此方案无效
        }
        event.put(CalendarContract.Events.EVENT_TIMEZONE, TimeZone.getDefault().getDisplayName());//这个是时区,必须有
        Uri newEvent = context.getContentResolver().insert(CalendarContract.Events.CONTENT_URI, event); //增加事情
        if (newEvent == null) { //增加日历事情失利直接回来
            return -1L;
        }
        //扩展特点 用于高版别安卓体系设置闹钟提示
        if (isAlarm) {
            Uri extendedPropUri = CalendarContract.ExtendedProperties.CONTENT_URI;
            extendedPropUri = extendedPropUri.buildUpon()
                    .appendQueryParameter(CalendarContract.CALLER_IS_SYNCADAPTER, "true")
                    .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_NAME, CALENDARS_ACCOUNT_NAME)
                    .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_TYPE, CALENDARS_ACCOUNT_TYPE).build();
            ContentValues extendedProperties = new ContentValues();
            extendedProperties.put(CalendarContract.ExtendedProperties.EVENT_ID, ContentUris.parseId(newEvent));
            extendedProperties.put(CalendarContract.ExtendedProperties.VALUE, "{"need_alarm":true}");
            extendedProperties.put(CalendarContract.ExtendedProperties.NAME, "agenda_info");
            Uri uriExtended = context.getContentResolver().insert(extendedPropUri, extendedProperties);
            if (uriExtended == null) { //增加事情提示失利直接回来
                return -1L;
            }
        }
        //事情提示的设定
        ContentValues values = new ContentValues();
        values.put(CalendarContract.Reminders.EVENT_ID, ContentUris.parseId(newEvent));
        values.put(CalendarContract.Reminders.MINUTES, 0);// 提早previousDate天有提示
        values.put(CalendarContract.Reminders.METHOD, CalendarContract.Reminders.METHOD_ALERT);
        Uri uri = context.getContentResolver().insert(CalendarContract.Reminders.CONTENT_URI, values);
        if (uri == null) { //增加事情提示失利直接回来
            return -1L;
        }
        Toast.makeText(context, "设置日程成功!!!", Toast.LENGTH_LONG).show();
        return eventId;
    }
    /**
     * 删去日历事情
     */
    public static void deleteCalendarEvent(Context context, Long delEventID) {
        if (context == null) {
            return;
        }
        Uri deleteUri = ContentUris.withAppendedId(CalendarContract.Events.CONTENT_URI, delEventID);
        int rows = context.getContentResolver().delete(deleteUri, null, null);
        if (rows == -1) { //事情删去失利
            return;
        }
    }
    /**
     * 查询日历日程相关的数据库表(查询其他表也适用),办法将查询表的一切列的一切行都展现出来了,便是这么人性化
     *
     * @param uri 用来区别查询的表的类型,查询不同的表,运用不同的URI即可,其他的都相同
     */
    @SuppressLint("Range")
    public void queryCalendarData(Uri uri, Activity context) {
        Cursor cursor = context.getContentResolver().query(uri, null,
                null, null, null);
        while (cursor.moveToNext()) {
            int columnCount = cursor.getColumnCount();
            Log.e("TAG", "columnCount :" + columnCount);//多少个特点
            for (int i = 0; i < columnCount; i++) {
                //获取到特点的称号
                String columnName = cursor.getColumnName(i);
                //获取到特点对应的值
                String message = cursor.getString(cursor.getColumnIndex(columnName));
                //打印特点和对应的值
                Log.e("TAG", columnName + " : " + message);
            }
        }
    }
}

Demo

页面布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <Button
        android:id="@+id/deleteEventButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="delete a Event" />
    <Button
        android:id="@+id/writeEventButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Input a Event" />
</LinearLayout>

Activity


public class CalenderDemoActivity extends AppCompatActivity implements View.OnClickListener {
    private Button mDeleteEventButton;
    private Button mWriteEventButton;
    final int callbackId = 0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_calender_demo);
        checkPermission(callbackId, Manifest.permission.READ_CALENDAR, Manifest.permission.WRITE_CALENDAR);
        setupViews();
    }
    private void checkPermission(int callbackId, String... permissionsId) {
        boolean permissions = true;
        for (String p : permissionsId) {
            permissions = permissions && ContextCompat.checkSelfPermission(this, p) == PERMISSION_GRANTED;
        }
        if (!permissions)
            ActivityCompat.requestPermissions(this, permissionsId, callbackId);
    }
    private void setupViews() {
        mDeleteEventButton = (Button) findViewById(R.id.deleteEventButton);
        mWriteEventButton = (Button) findViewById(R.id.writeEventButton);
        mDeleteEventButton.setOnClickListener(this);
        mWriteEventButton.setOnClickListener(this);
    }
    /**
     * 查看是否存在现有账户,存在则回来账户id,不然回来-1
     */
    /**
     * 增加日历账户,账户创立成功则回来账户id,不然回来-1
     */
    @SuppressLint("Range")
    @Override
    public void onClick(View v) {
        Long eventId = Long.parseLong(String.valueOf((int)Math.random()*999+1));
        if (v == mWriteEventButton) {
            Calendar mCalendar = Calendar.getInstance();
            mCalendar.setTimeInMillis(System.currentTimeMillis() + 1 * 60 * 1000);
            long start = mCalendar.getTime().getTime();
            mCalendar.setTimeInMillis(start + 1 * 60 * 1000);
            long end = mCalendar.getTime().getTime();
            CalendarReminderUtils.addCalendarEvent(this, eventId,"工作提示", "该休息啦", start, end, 0,true);
            Log.d("============eventid", "onClick: " + eventId);
        } else if (v == mDeleteEventButton) {
//            CalendarReminderUtils.queryCalendarData(CalendarContract.Calendars.CONTENT_URI, this);
            CalendarReminderUtils.deleteCalendarEvent(this, eventId);
        }
    }
}

效果

Android 操作系统日历完成提醒功能 附带开关闹钟 适配高版本安卓

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。