首页 > Android > Android中对Google Calendar的操作示例

Android中对Google Calendar的操作示例

2011年8月23日 发表评论 阅读评论

这两天在给我的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分享到:
          
分类: Android 标签: ,
  1. leonyu
    2011年11月25日15:26 | #1

    很好的文章,但说实话,对于我这样的门外汉来说,还是很有难度的。

    我一直在用google calendar,现在用的android手机,希望能用起来啊。

    是否能具体教一下怎样用?

    多谢!

    [回复]

    iStar CHINA Google Chrome Linux 回复:

    是不是你的手机上没有Calendar?你用的是第三方的ROM吧,默认的Android系统是有calendar的,你可以去安装一个你手机对应的Calendar.apk和CalendarProvider.apk。

    [回复]

  2. leonyu
    2011年11月25日17:24 | #2

    找了,安装了(国内找资源真不容易啊,好多乱七八糟的下载站),学习中,多谢了!

    [回复]

  3. fly
    2012年4月22日13:59 | #3

    你好,想请问google canlendar里不是可以存地址(新增事件里),点地址会连到google map,然后我要用我设计的app(我做的app跟导航有关系)去抓取google canlendar里的地址(我的app已经调用google canlendar.apk),让地址可连到到我自己的导航app?
    谢谢你

    [回复]

  4. young
    2012年5月1日10:56 | #4

    请问如何取得google calendar 事件里的地点?

    [回复]

  5. iStar
    2012年5月2日09:58 | #5

    @young
    地点也是一个字段,常量是android.provider.CalendarContract.Events.EVENT_LOCATION,具体的值是“eventLocation”,可以去试试!

    [回复]

  1. 本文目前尚无任何 trackbacks 和 pingbacks.