觉得这篇文章不错,转载过来。

Android手机配备有一个内置的日历应用程序。第三方应用程序可以利用日历内容提供商接口读取用户的日历信息和安排在日历新的事件。这个日历可以直接同步用户的谷歌日历。 



不幸的是,没有文档和Android手机的日历应用集成,因为有另外一个联系人应用程序。相反,本文所提供的所有信息,将会通过逆向工程的谷歌日历内容提供商。该接口是受变化的,将会支持有限的功能。然而,日历一体化可以成为一些类型的应用强大的功能。 



本文的代码测试之到Android 2.0 SDK版本。我们将发布一个更新如果有一个很大的转变。我们没有测试这个装置,如早先的T - Mobile G1的(SDK的1.6)代码。 



访问日历数据 

为了支持添加到您的日历的Android应用程序,您必须给你的应用程序添加以下权限AndroidManifest.xml文件:

  1. <uses-permission
  2. android:name="android.permission.READ_CALENDAR">
  3. </uses-permission>
  4. <uses-permission
  5. android:name="android.permission.WRITE_CALENDAR">
  6. </uses-permission>

注册这些权限允许您访问谷歌登录用户的日历数据,无需处理任何问题。该日历应用程序未安装在Android模拟器,因此所有的测试和开发必须在日历应用程序实际完成安装的设备(使用模拟器将无法启动相应的提供者)。日历应用程序和内容提供商可在与谷歌服务,例如T - Mobile G1。 

检索用户日历列表 

用户可能在日历应用程序配置有很多名称的日历。例如,用户可能有一个工作日历(工作日历有关的活动),家庭日历(个人的)和假日日历(法定假日)。 

由用户配置的日历使用并访问内容提供商接口。为了检索用户的日历列表,我们需要为适当Uri以及日历内容提供商设计查询,如下所示:

  1. String[] projection = new String[] { "_id", "name" };
  2. Uri calendars = Uri.parse("content://calendar/calendars");
  3. Cursor managedCursor =
  4. managedQuery(calendars, projection, null, null, null);

现在,这个查询将返回所有日历,包括那些平时不会用到的。为了得到一个活跃的日历列表单,我们需要在“选择”设置为true的领域在内限制我们的查询

  1. String[] projection = new String[] { "_id", "name" };
  2. Uri calendars = Uri.parse("content://calendar/calendars");
  3. Cursor managedCursor =
  4. managedQuery(calendars, projection, "selected=1", null, null);

我们现在检索的日历列表。我们可以遍历的结果如下:

  1. if (managedCursor.moveToFirst()) {
  2. String calName;
  3. String calId;
  4. int nameColumn = managedCursor.getColumnIndex("name");
  5. int idColumn = managedCursor.getColumnIndex("_id");
  6. do {
  7. calName = managedCursor.getString(nameColumn);
  8. calId = managedCursor.getString(idColumn);
  9. } while (managedCursor.moveToNext());
  10. }

一旦我们知道我们想要访问的日历,我们可以添加一个日历事件。日历事件有一些重要领域,其中包括如活动名称,时间和地点以及设置的信息,哪一项将被显示在日历。日历事件可能是一次性或经常性的。 



给日历增加单一事件发生的情况 



添加一个条目到特定的日历,我们需要配置一个日历项插入使用与ContentValues如下:

  1. ContentValues event = new ContentValues();

每个活动必须与特定日历结合,所以,首先你会想到的是为此事件插入日历标识符。

  1. event.put("calendar_id", calId);

然后,我们设置了有关事件,其中包括活动的标题,描述和位置弦乐领域的一些基本信息。

  1. event.put("title", "Event Title");
  2. event.put("description", "Event Desc");
  3. event.put("eventLocation", "Event Location");

有许多不同的配置选项来设置事件的时间和日期。 



我们可以设置事件的开始和结束的信息如下:

  1. long startTime = START_TIME_MS;
  2. long endTime = END_TIME_MS;
  3. event.put("dtstart", startTime);
  4. event.put("dtend", endTime);

如果我们增加了生日或假日,我们会设置一个全天事件的条目:

  1. ); // 0 for false, 1 for true

这一信息对于大多数项足够了。但是,有一些其他有用的日历项属性。 



例如,您可以设置事件状态暂定(0),确认(1)或取消(2):

  1. );

您可以控制可以看到它的可见性设置为默认值(0此事件),保密(1),私营(2),或公共(3):

  1. );

您可以控制日历上事件是否消耗时间,通过设置其透明度,不透明(0)或透明(1)。

  1. );

您可以控制是否事件触发报警,提醒如下:

  1. ); // 0 for false, 1 for true

一旦日历事件配置正确,我们已经准备好使用ContentResolver插入到相应的开放新日历的日历事件项:

  1. Uri eventsUri = Uri.parse("content://calendar/events");
  2. Uri url = getContentResolver().insert(eventsUri, event);

该调用insert()方法接触的日历内容提供商,并试图插入到相应的用户的日历项。如果您导航到日历应用程序和启动它,你应该看到您在适当的日历中的日历项。自日历同步,你也看到日历项在线,如果你在网络上使用的谷歌日历。 



添加一个定期事件的日历 



您也可以设定定期日历事件。为了做到这一点,你必须根据当前的规则添加更多的字段。规则是根据RFC2445。 



结论 :

Android应用程序可以集成与用户的日历密切的许多Android设备。该日历功能是通过一条内容提供商的接口,允许第三方应用程序访问日历信息,并添加新日历项。 


遇到的问题:
----------------------------------------------------------------
在Android下面用代码插入一个事件和参与人之后,我再在Android上手动修改参与人之类的信息,它就报错了

好像是取不到参与人的URL了,取出来是个-1

  1. -24 10:12:16.707: ERROR/AndroidRuntime(3254): Caused by: java.lang.IllegalArgumentException: Unknown URL content://calendar/attendees/-1
  2. -24 10:12:16.707: ERROR/AndroidRuntime(3254):     at com.android.providers.calendar.CalendarProvider.updateInternal(CalendarProvider.java:3206)
  3. -24 10:12:16.707: ERROR/AndroidRuntime(3254):     at android.content.AbstractSyncableContentProvider.update(AbstractSyncableContentProvider.java:283)
  4. -24 10:12:16.707: ERROR/AndroidRuntime(3254):     at android.content.ContentProvider$Transport.update(ContentProvider.java:180)
  5. -24 10:12:16.707: ERROR/AndroidRuntime(3254):     at android.content.ContentResolver.update(ContentResolver.java:737)
  6. -24 10:12:16.707: ERROR/AndroidRuntime(3254):     at com.android.calendar.EventInfoActivity.updateResponse(EventInfoActivity.java:701)
  7. -24 10:12:16.707: ERROR/AndroidRuntime(3254):     at com.android.calendar.EventInfoActivity.saveResponse(EventInfoActivity.java:667)
  8. -24 10:12:16.707: ERROR/AndroidRuntime(3254):     at com.android.calendar.EventInfoActivity.onPause(EventInfoActivity.java:551)
  9. -24 10:12:16.707: ERROR/AndroidRuntime(3254):     at android.app.Activity.performPause(Activity.java:3782)
  10. -24 10:12:16.707: ERROR/AndroidRuntime(3254):     at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1190)
  11. -24 10:12:16.707: ERROR/AndroidRuntime(3254):     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3149)
  12. -24 10:12:16.707: ERROR/AndroidRuntime(3254):     ... 12 more
---------------------------------------------------------------

---------------------------------------------------------------

看了下EventInfoActivity的源码解决了

  1. && mCalendarOwnerAccount.equals(email)) {
  2. mCalendarOwnerAttendeeId = mAttendeesCursor.getInt(ATTENDEES_INDEX_ID);
  3. mOriginalAttendeeResponse = mAttendeesCursor.getInt(ATTENDEES_INDEX_STATUS);
  4. }

mCalendarOwnerAttendeeId默认给的值为-1,这里的代码判断了如果参与人的邮件和日历拥有者的邮件不一样,就应该把参与人当被邀请者 

我为了简单就直接把参与者邮件改成和日历拥有者一样的,把他当成ORGANIZER就正常了。

调用Android自带日历功能(日历列表单、添加一个日历事件)的更多相关文章

  1. 调用Android自带日历功能

    Android手机配备有一个内置的日历应用程序.第三方应用程序可以利用日历内容提供商接口读取用户的日历信息和安排在日历新的事件.这个日历可以直接同步用户的谷歌日历. 不幸的是,没有文档和Android ...

  2. php从数据库里取出的数据列表里添加一个属性实战例子

    php从数据库里取出的数据列表里添加一个属性实战例子:$opendata = $this->omitmodel->getHistory(1,1);var_dump($opendata);f ...

  3. 调用Android自带浏览器打开网页

    转载请注明出处: http://blog.csdn.net/lowprofile_coding/article/details/77928608 在Android中可以调用自带的浏览器,或者指定一个浏 ...

  4. delphi调用windows自带语音功能

    windows自带语音接口 SAPI.SpVoice, 接口说明如下 https://docs.microsoft.com/en-us/previous-versions/windows/deskto ...

  5. 实现调用Android手机的拍照功能

    很简单,直接上示例吧 1 xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android&q ...

  6. Android向系统日历添加日程提醒事件

    在项目开发过程中,有时会有预约提醒.定时提醒等需求,这时我们可以使用系统日历来辅助提醒.通过向系统日历中写入事件.设置提醒方式(闹钟),实现到达某个特定的时间自动提醒的功能.这样做的好处是由于提醒功能 ...

  7. android wear开发:为可穿戴设备创建一个通知 - Creating a Notification for Wearables

    注:本文内容来自:https://developer.android.com/training/wearables/notifications/creating.html 翻译水平有限,如有疏漏,欢迎 ...

  8. Android使用GridView实现日历功能(详细代码)

    代码有点多,发个图先: 如果懒得往下看的,可以直接下载源码吧(0分的),最近一直有人要,由于时间太久了,懒得找出来整理,今天又看到有人要,正好没事就整理了一下 http://download.csdn ...

  9. Android 一个日历控件的实现代码

    转载  2017-05-19   作者:Othershe   我要评论 本篇文章主要介绍了Android 一个日历控件的实现代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看 ...

随机推荐

  1. 指针直接赋值为整型AND利用宏定义求结构体成员偏移量

    首先我们要更正一个很熟悉的概念,那就是指针不仅仅是“地址”,指针还有一个很重要的特性,那就是“类型”. 指针初始化时,“=”的右操作数; 除外,该语句表示指针为空): 所以 ; 这样的代码是不允许的. ...

  2. 加密传输SSL协议5_Hash Function

    怎么对一个大的文件进行签名,因为文件比较大,非对称签名很慢.那么想,我能把这个大的文件通过一种函数变换,变成一个和源文件唯一对应的的小的文件吗?答案是可以的. Hash Function 这里任何的文 ...

  3. MySQL:ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails

    MySQL在删除一张表时出现 ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fa ...

  4. Ajax访问PHP页面出现的跨域问题

    1.跨域问题:简单来说就是A域名下的程序想从B域名下的文件里面获取信息(这句话是我上网看到的) 2.一般请求(本地测试): 请求页 响应页      这样做是没问题的. 但我如果将Ajax请求的url ...

  5. Python封装的访问MySQL数据库的类及DEMO

    # Filename:mysql_class.py # Author:Rain.Zen; Date: 2014-04-15 import MySQLdb class MyDb: '''初始化[类似于构 ...

  6. binwalk windows安装和使用方法

    binwalk是一个文件的分析工具,旨在协助研究人员对文件进行分析,提取及逆向工程.简单易用,完全自动化脚本,并通过自定义签名,提取规则和插件模块,还重要一点的是可以轻松地扩展. 以上是binwalk ...

  7. SQL Server 全文索引

    create table Document(ID int not null,Name nvarchar(255) not null,Body nvarchar(max) not null);go cr ...

  8. DLR、ASTER GDEM、SRTM3、GMTED2010等5种全球高程数据对比

      目前网上有多种全球高程数据,国内在这方面也进步喜人,资源三号目前已放出来的卫片给了不少惊喜,其高程数值得期待.但资源三号的高程数据放出来还需等待,过去两三年全球高程数据发展相当迅猛,DLR放出了相 ...

  9. Telnet RFC

    http://tools.ietf.org/html/rfc857 http://www.faqs.org/rfcs/rfc854.html 不错: http://blog.csdn.net/chao ...

  10. Windows Azure 社区新闻综述(#70 版)

    欢迎查看最新版本的每周综述,其中包含有关云计算和 Windows Azure 的社区推动新闻.内容和对话. 以下是过去一周基于您的反馈汇集在一起的内容: 文章.视频和博客文章 ·   如何选择 No ...