在我们的APP开发过程中,很多时候我们需要获取用户的日历日程事件,便于我们APP更好的了解用户,同时给予用户提醒。
要想获得日历日程的相关内容,首先我们需要拥有日历日程的读写权限。主要包括下面两个权限
获得对安卓系统日历事件操作的权限,也就是在AndroidManifest.xml文件中加入如下两行
· <uses-permission Android:name="android.permission.READ_CALENDAR"/>
· <uses-permission android:name="android.permission.WRITE_CALENDAR"/>
字面意思很明确就是分别的读写权限,类同于对短信的权限获取
安卓中日历用到三个URL,分别是日历用户的URL,事件的URL,以及事件提醒的URL,三个URL在安卓版本2.2前后分别是:
if(Integer.parseInt(Build.VERSION.SDK)>=8){
uri = "content://com.android.calendar/calendars";
eventUri = "content://com.android.calendar/events";
reminderUri = "content://com.android.calendar/reminders";
}
else{ //在安卓2.2版本以后的地址
calanderURL= "content://calendar/calendars";
calanderEventURL= "content://calendar/events";
reminderUri = "content://calendar/reminders";
}
之后我们通过内容解析者分别对这三个url内容进行查询
- Cursor userCursor = getContentResolver().query(Uri.parse(calanderURL), null,
- null, null, null);
- if(userCursor.getCount() > 0){
- userCursor.moveToFirst(); // 将游标移动到首位
- String userName = userCursor.getString(userCursor.getColumnIndex("name")); //拿到当前日历用户
- }
- Cursor eventCursor = getContentResolver().query(Uri.parse(calanderEventURL), null,
- null, null, null);
- if(eventCursor.getCount() > 0){
- eventCursor.moveToLast();
- String eventTitle = eventCursor.getString(eventCursor.getColumnIndex("title"));
- }
- //获取要出入的gmail账户的id
- String calId = "";
- Cursor userCursor = getContentResolver().query(Uri.parse(calanderURL), null,
- null, null, null);
- if(userCursor.getCount() > 0){
- userCursor.moveToFirst();
- calId = userCursor.getString(userCursor.getColumnIndex("_id"));
- }
- ContentValues event = new ContentValues(); // 新建日历事件
- event.put("title", "明天上午八点考试");
- event.put("description", "明天上午在第二教学楼有英语专业的考试");
- //插入插入用户
- event.put("calendar_id",calId);
- Calendar mCalendar = Calendar.getInstance();
- mCalendar.set(Calendar.HOUR_OF_DAY,10);
- long start = mCalendar.getTime().getTime();
- mCalendar.set(Calendar.HOUR_OF_DAY,11);
- long end = mCalendar.getTime().getTime();
- // 分别设置开始时间和结束时间
- event.put("dtstart", start);
- event.put("dtend", end);
- event.put("hasAlarm",1);
- Uri newEvent = getContentResolver().insert(Uri.parse(calanderEventURL), event);
- long id = Long.parseLong( newEvent.getLastPathSegment() );
- ContentValues values = new ContentValues();
- values.put( "event_id", id );
- //提前10分钟有提醒
- values.put( "minutes", 10 );
- getContentResolver().insert(Uri.parse(calanderRemiderURL), values);
- }
- }
private Context context;
private Handler handler;
public CalendarObserver(Context context,Handler handler) {
super(handler);
// TODO Auto-generated constructor stub
this.context=context;
this.handler=handler;
}
@Override
public void onChange(boolean selfChange) {
// TODO Auto-generated method stub
super.onChange(selfChange);
handler.obtainMessage(3,"events have chage").sendToTarget();
}
在主类中,实例化并实施监听
calObserver=new CalendarObserver(this,new Handler(){
@Override
public void handleMessage(Message msg) {
/**当监听到改变时,做业务操作*/
Log.i("tag", "now ");
String msgStr=(String)msg.obj;
System.out.println(msgStr+"----------------日程日程");
Toast.makeText(CalendarActivity.this, "日程事件修改被触发", Toast.LENGTH_SHORT).show();
}
};
//注册日程事件监听
getContentResolver().registerContentObserver(Events.CONTENT_URI, true, calObserver);
}
以下是日历事件的增删该差的具体demo
http://blog.csdn.net/justforhappness/article/details/40432663