Android中对Google Calendar的操作示例
这两天在给我的App生日提醒增加一个将生日信息同步到Google Calendar的功能,发现这方面的资料特别少(难道很少人用Calendar?),费了老大的劲才算搞定,尤其是对已添加的日程进行修改和删除。下面是我应用中的一个类GoogleCalendarUtil,涵盖了对Calendar的各种操作,希望对有这方面需求的人有帮助。
首先,要访问Google Calendar必须在AndroidManifest.xml中添加两条权限:
<uses-permission android:name="android.permission.READ_CALENDAR"/> <uses-permission android:name="android.permission.WRITE_CALENDAR"/>
在这里我是对Calendar应用程序提供的ContentProvider进行操作(通过ContentResolver操作),不过值得注意的是在Android 2.2以后,CalendarProvider提供的Uri发生了变化,考虑到程序的兼容性,做了如下处理:
static{
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";
}
}
另外就没什么好说的了吧!下面是我写的一个工具类,写了一些注释,应该能看懂,里面的Friend是一个实体类,其中的sign字段存放了该Friend本年生日的Calendar日程的id,用来对日程修改时能找到对应的日程。下面是具体代码:
public class GoogleCalendarUtil {
private Context mContext;
private SharedData share;
private static String calanderURL = "";
private static String calanderEventURL = "";
private static String calanderRemiderURL = "";
private String calId = "";
//为了兼容不同版本的日历,2.2以后Uri发生改变
static{
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";
}
}
public GoogleCalendarUtil(Context context) {
super();
this.mContext = context;
share = new SharedData(mContext);
//获取要出入的gmail账户的id
Cursor userCursor = mContext.getContentResolver().query(Uri.parse(calanderURL),
null, null, null, null);
if(userCursor.getCount() > 0){
userCursor.moveToFirst();
calId = userCursor.getString(userCursor.getColumnIndex("_id"));
}
}
/**
* 添加生日信息到Google Calendar
*
*/
public void addToGoogleCalendar(Friend f, Calendar birthday) {
ContentValues event = new ContentValues();
event.put("title", f.getName() + "生日");
event.put("description", f.getName() + "生日到了,记得问候!");
event.put("calendar_id",calId);
birthday.set(Calendar.HOUR_OF_DAY, 8);
long start = birthday.getTime().getTime();
birthday.set(Calendar.HOUR_OF_DAY, 12);
long end = birthday.getTime().getTime();
event.put("dtstart", start);
event.put("dtend", end);
event.put("allDay", 1); // 0 for false, 1 for true
event.put("hasAlarm",1);// 0 for false, 1 for true
Uri newEvent = mContext.getContentResolver().insert(Uri.parse(calanderEventURL), event);
//获取所添加的event的主键_id
long id = Long.parseLong( newEvent.getLastPathSegment() );
ContentValues values = new ContentValues();
values.put( "event_id", id );
//设置提前提醒时间
int advanceDays = share.getAdvanceTime();
if (advanceDays == 0) {
// 默认提前十分钟
values.put( "minutes", 10);
} else {
values.put( "minutes", advanceDays * 24 * 60);
}
//设置提醒
mContext.getContentResolver().insert(Uri.parse(calanderRemiderURL), values);
//给Friend添加事件id,同时更新friend信息
f.setSign("" + id);
}
/**
* 修改已保存的日程
* @param name 好友姓名
* @param id 好友id
* @param recentBirthday 最近生日
*/
public void updateEvent(Friend f, Calendar birthday) {
Uri eventsUri = Uri.parse(calanderEventURL);
Uri eventUri = ContentUris.withAppendedId(eventsUri, Long.parseLong(f.getSign()));
Cursor c = mContext.getContentResolver().query(eventsUri,
null, "_id=?", new String[]{f.getSign()}, null);
if (c == null || c.getCount() <= 0) {
//没有查询到日程时,则新增日程
addToGoogleCalendar(f, birthday);
return ;
}
ContentValues event = new ContentValues();
event.put("title", f.getName() + "生日");
event.put("description", f.getName() + "生日到了,记得问候!");
event.put("calendar_id",calId);
birthday.set(Calendar.HOUR_OF_DAY, 8);
long start = birthday.getTime().getTime();
birthday.set(Calendar.HOUR_OF_DAY, 12);
long end = birthday.getTime().getTime();
event.put("dtstart", start);
event.put("dtend", end);
mContext.getContentResolver().update(eventUri, event, null, null);
}
/**
* 删除日程
* @param sign
*/
public void deleteEvent(String sign) {
Uri eventsUri = Uri.parse(calanderEventURL);
Uri eventUri = ContentUris.withAppendedId(eventsUri, Long.parseLong(sign));
mContext.getContentResolver().delete(eventUri, null, null);
}
}
| anyShare分享到: | |
| |
发表在《
发表在《
发表在《
很好的文章,但说实话,对于我这样的门外汉来说,还是很有难度的。
我一直在用google calendar,现在用的android手机,希望能用起来啊。
是否能具体教一下怎样用?
多谢!
[回复]
iStar
回复:
十一月 25th, 2011 at 下午 3:30
是不是你的手机上没有Calendar?你用的是第三方的ROM吧,默认的Android系统是有calendar的,你可以去安装一个你手机对应的Calendar.apk和CalendarProvider.apk。
[回复]
找了,安装了(国内找资源真不容易啊,好多乱七八糟的下载站),学习中,多谢了!
[回复]
你好,想请问google canlendar里不是可以存地址(新增事件里),点地址会连到google map,然后我要用我设计的app(我做的app跟导航有关系)去抓取google canlendar里的地址(我的app已经调用google canlendar.apk),让地址可连到到我自己的导航app?
谢谢你
[回复]
请问如何取得google calendar 事件里的地点?
[回复]
@young
地点也是一个字段,常量是android.provider.CalendarContract.Events.EVENT_LOCATION,具体的值是“eventLocation”,可以去试试!
[回复]