import android.Manifest;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.database.SQLException;
import android.net.Uri;
import android.os.Build;
import android.provider.CalendarContract;
import android.support.v4.app.ActivityCompat;
import android.text.TextUtils;
import android.util.Log;
import android.widget.Toast;
import java.util.Calendar;
import java.util.TimeZone;
/**
* 同步日历事项提醒到系统日历
*/
public class CalendarReminderUtils {
//Android2.2版本以后的URL,之前的就不写了
private static String calanderURL = "content://com.android.calendar/calendars";
private static String calanderEventURL = "content://com.android.calendar/events";
private static String calanderRemiderURL = "content://com.android.calendar/reminders";
/**
*
* @param context
* @param dtStart
* @param title
* @param description
* @return
*/
public static int addCalendarEvent(Context context, String dtStart, String title, String description) {
return addCalendarEvent(context, dtStart, null, title, description, null, null, 0);
}
/**
* 添加日历事件
* 时间 要求格式 yyyy/mm/dd/hh/mm
*
* @param context
* @param dtStart 提醒开始时间
* @param dtEnd 提醒结束时间
* @param title 日程标题
* @param description 描述
* @param location 地点位置
* @param userName 用户名
* @param preHintTime 提前提醒时间
* @return
*/
public static int addCalendarEvent(Context context, String dtStart, String dtEnd, String title, String description, String location, String userName, long preHintTime) {
if (Integer.parseInt(Build.VERSION.SDK) >= 8) {
calanderURL = "content://com.android.calendar/calendars";
calanderEventURL = "content://com.android.calendar/events";
calanderRemiderURL = "content://com.android.calendar/reminders";
} else {
calanderURL = "content://calendar/calendars";
calanderEventURL = "content://calendar/events";
calanderRemiderURL = "content://calendar/reminders";
}
Cursor userCursor = context.getContentResolver().query(Uri.parse(calanderURL), null, null, null, null);
//如果小于1代表没有账户
if (userCursor.getCount() < 1) {
//添加账户
initCalendars(context, userName);
}
// 获取账户的id
String calId = "";
if (userCursor.getCount() > 0) {
//注意:是向最后一个账户添加,开发者可以根据需要改变添加事件 的账户
userCursor.moveToLast();
calId = userCursor.getString(userCursor.getColumnIndex("_id"));
}
ContentValues event = new ContentValues();
event.put("title", title);
event.put("description", description != null ? description : "");
// 插入账户
event.put("calendar_id", calId);
event.put("eventLocation", location != null ? location : "");
if (TextUtils.isEmpty(dtStart)) {
Toast.makeText(context, "提醒开始时间不能为空!", Toast.LENGTH_SHORT).show();
return -1;
}
if (TextUtils.isEmpty(dtEnd)) {
dtEnd = dtStart;
}
Calendar mCalendar = Calendar.getInstance();
//提醒开始时间
String[] startTime = dtStart.split("/");
mCalendar.set(Calendar.YEAR, Integer.parseInt(startTime[0]));//年
mCalendar.set(Calendar.MONTH, Integer.parseInt(startTime[1])-1);//月
mCalendar.set(Calendar.DAY_OF_MONTH, Integer.parseInt(startTime[2]));//日
mCalendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(startTime[3]));//时
mCalendar.set(Calendar.MINUTE, Integer.parseInt(startTime[4]));//分
long start = mCalendar.getTime().getTime();
//提醒结束时间
String[] endTime = dtEnd.split("/");
mCalendar.set(Calendar.YEAR, Integer.parseInt(endTime[0]));//年
mCalendar.set(Calendar.MONTH, Integer.parseInt(endTime[1])-1);//月
mCalendar.set(Calendar.DAY_OF_MONTH, Integer.parseInt(endTime[2]));//日
mCalendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(endTime[3]));//时
mCalendar.set(Calendar.MINUTE, Integer.parseInt(endTime[4]));//分
long end = mCalendar.getTime().getTime();
event.put("dtstart", start);
event.put("dtend", end);
event.put("hasAlarm", 1);
event.put(CalendarContract.Events.EVENT_TIMEZONE, "Asia/Shanghai"); //这个是时区,必须有,
//添加事件
Uri newEvent = context.getContentResolver().insert(Uri.parse(calanderEventURL), event);
//事件提醒的设定
long event_id = Long.parseLong(newEvent.getLastPathSegment());
ContentValues values = new ContentValues();
values.put("event_id", event_id);
// 提前10分钟有提醒
values.put("minutes", preHintTime);
try {
context.getContentResolver().insert(Uri.parse(calanderRemiderURL), values);
} catch (SQLException e) {
Log.e("error_code", "sql异常,插入失败");
}
return 0;
}
/**
* 添加账户
*
* @param context
* @param accountName 账户名
*/
private static void initCalendars(Context context, String accountName) {
TimeZone timeZone = TimeZone.getDefault();
ContentValues value = new ContentValues();
value.put(CalendarContract.Calendars.NAME, "yt");
value.put(CalendarContract.Calendars.ACCOUNT_NAME, accountName);//日历账户名称
value.put(CalendarContract.Calendars.ACCOUNT_TYPE, "com.android.exchange");
value.put(CalendarContract.Calendars.CALENDAR_DISPLAY_NAME, accountName);
value.put(CalendarContract.Calendars.VISIBLE, 1);
value.put(CalendarContract.Calendars.CALENDAR_COLOR, -9206951);
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, accountName);
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, accountName)
.appendQueryParameter(CalendarContract.Calendars.ACCOUNT_TYPE, "com.android.exchange")
.build();
//插入账号数据
context.getContentResolver().insert(calendarUri, value);
}
/**
* 删除日历事件
*/
public static int deleteCalendarEvent(Context context, String title) {
int rownum = 0;
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.WRITE_CALENDAR) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions((Activity) context, new String[]{"android.permission.WRITE_CALENDAR"}, 0x1100);
} else {
rownum = context.getContentResolver().delete(CalendarContract.Events.CONTENT_URI, CalendarContract.Events.TITLE + " = ?", new String[]{title});
}
return rownum;
}
/**
* 更新日程表事件
*
* @param context
* @param dtStart 开始时间 要求格式 yyyy/mm/dd/hh/mm
* @param dtEnd 结束时间 要求格式 yyyy/mm/dd/hh/mm
* @param title
* @param description
* @return
*/
public static int updataCalendarEvent(Context context, String dtStart, String dtEnd, String title, String description) {
ContentResolver cr = context.getContentResolver();
ContentValues values = new ContentValues();
Uri updateUri = null;
Calendar mCalendar = Calendar.getInstance();
//修改开始时间
if (!TextUtils.isEmpty(dtStart)) {
String[] startTime = dtStart.split("/");
mCalendar.set(Calendar.YEAR, Integer.parseInt(startTime[0]));//年
mCalendar.set(Calendar.MONTH, Integer.parseInt(startTime[1])-1);//月
mCalendar.set(Calendar.DAY_OF_MONTH, Integer.parseInt(startTime[2]));//日
mCalendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(startTime[3]));//时
mCalendar.set(Calendar.MINUTE, Integer.parseInt(startTime[4]));//分
long start = mCalendar.getTime().getTime();
values.put(CalendarContract.Events.DTSTART, start);
}
//修改结束时间
if (!TextUtils.isEmpty(dtEnd)) {
String[] endTime = dtEnd.split("/");
mCalendar.set(Calendar.YEAR, Integer.parseInt(endTime[0]));//年
mCalendar.set(Calendar.MONTH, Integer.parseInt(endTime[1])-1);//月
mCalendar.set(Calendar.DAY_OF_MONTH, Integer.parseInt(endTime[2]));//日
mCalendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(endTime[3]));//时
mCalendar.set(Calendar.MINUTE, Integer.parseInt(endTime[4]));//分
long end = mCalendar.getTime().getTime();
values.put(CalendarContract.Events.DTEND, end);
}
//修改标题
if (!TextUtils.isEmpty(title)) {
values.put(CalendarContract.Events.TITLE, title);
}
//修改描述
if (!TextUtils.isEmpty(description)) {
values.put(CalendarContract.Events.DESCRIPTION, description);
}
values.put(CalendarContract.Events.HAS_ALARM,1);//是否闹铃提醒
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.WRITE_CALENDAR) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions((Activity) context, new String[]{"android.permission.WRITE_CALENDAR"}, 0x1100);
}
try {
int rows = cr.update(CalendarContract.Events.CONTENT_URI, values, CalendarContract.Events.TITLE + " = ?", new String[]{title});
//int rows = cr.update(CalendarContract.Events.CONTENT_URI, values, CalendarContract.Events.TITLE + " = ? AND "+CalendarContract.Events.DTSTART+" = ? ", new String[]{title,date});
}catch (SQLException e){
e.printStackTrace();
}
return 0;
}
/**
* 遍历出整个表格中所有的属性值
*
* @param context
*/
public static void queryAtrValue(Context context) {
Uri uri = Uri.parse(calanderEventURL);
Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
while (cursor.moveToNext()) {
int columnCount = cursor.getColumnCount();
Log.e("callback", "columnCount :" + columnCount);//多少个属性
for (int i = 0; i < columnCount; i++) {
//获取到属性的名称
String columnName = cursor.getColumnName(i);
//获取到属性对应的值
String message = cursor.getString(cursor.getColumnIndex(columnName));
//打印属性和对应的值
Log.e("callback", columnName + " : " + message);
}
}
}
}
Android同步日程到系统日历
最新推荐文章于 2024-05-13 21:01:08 发布