查了一天半,总算有点大概了。以下是自己的理解,有错误的地方望指正。

  android系统有日历功能,应用程序可以根据一些接口开发自己的功能,即使是日历app也是根据这些接口开发的,所以我们可以利用程序向系统日历写入事件,然后用手机上的日历软件就可以看到我们添加的事件。网上这方面资料也不少,也有demo,但是我没找到一个可以正确运行的,有的是缺少参数,有的是版本的原因,4.0以上的系统这方面变动比较大,所以只能一边查资料一边修改。

  大体思路就是:先查看系统日历是否有账户,如果没有必须要添加一个,然后才可以添加事件。其中有好多参数是必须要填的,还有什么 sync adapter。事件的保存是按账户为单位的。

  目前还不完善,删除时会把系统日历中的所有账户都删除,请注意!!!

大体框架利用:http://blog.csdn.net/Android_Tutor/article/details/6165470 ,感谢原作者的分享。为了体现原作者的向往情怀,事件内容维持不变!!

在此基础上做了完善以及进行了主要的注释。

用户权限:

01.<uses-permission android:name="android.permission.READ_CALENDAR"/>
02.<uses-permission android:name="android.permission.WRITE_CALENDAR"/>

XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" > <TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="向系统日历中添加事件" /> <Button
android:id="@+id/inputaccount"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="添加账户" /> <Button
android:id="@+id/readUserButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="查看账户" /> <Button
android:id="@+id/readEventButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="查看事件" /> <Button
android:id="@+id/writeEventButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="插入事件" /> <Button
android:id="@+id/delEventButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="删除事件" /> </LinearLayout>

主程序代码:

package com.example.canlendertesttwo;

import java.util.Calendar;
import java.util.TimeZone; import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.CalendarContract;
import android.provider.CalendarContract.Calendars;
import android.provider.CalendarContract.Events;
import android.view.View;
import android.widget.Toast; public class MainActivity extends Activity { //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"; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); } public void onClick(View v) {
if (v.getId() == R.id.readUserButton) { //读取系统日历账户,如果为0的话先添加
Cursor userCursor = getContentResolver().query(Uri.parse(calanderURL), null, null, null, null); System.out.println("Count: " + userCursor.getCount());
Toast.makeText(this, "Count: " + userCursor.getCount(), Toast.LENGTH_LONG).show(); for (userCursor.moveToFirst(); !userCursor.isAfterLast(); userCursor.moveToNext()) {
System.out.println("name: " + userCursor.getString(userCursor.getColumnIndex("ACCOUNT_NAME"))); String userName1 = userCursor.getString(userCursor.getColumnIndex("name"));
String userName0 = userCursor.getString(userCursor.getColumnIndex("ACCOUNT_NAME"));
Toast.makeText(this, "NAME: " + userName1 + " -- ACCOUNT_NAME: " + userName0, Toast.LENGTH_LONG).show();
}
}
else if (v.getId() == R.id.inputaccount) { //添加日历账户
initCalendars(); }
else if (v.getId() == R.id.delEventButton) { //删除事件 int rownum = getContentResolver().delete(Uri.parse(calanderURL), "_id!=-1", null); //注意:会全部删除所有账户,新添加的账户一般从id=1开始,
//可以令_id=你添加账户的id,以此删除你添加的账户
Toast.makeText(MainActivity.this, "删除了: " + rownum, Toast.LENGTH_LONG).show(); }
else if (v.getId() == R.id.readEventButton) { //读取事件
Cursor eventCursor = getContentResolver().query(Uri.parse(calanderEventURL), null, null, null, null);
if (eventCursor.getCount() > 0) {
eventCursor.moveToLast(); //注意:这里与添加事件时的账户相对应,都是向最后一个账户添加
String eventTitle = eventCursor.getString(eventCursor.getColumnIndex("title"));
Toast.makeText(MainActivity.this, eventTitle, Toast.LENGTH_LONG).show();
}
}
else if (v.getId() == R.id.writeEventButton) {
// 获取要出入的gmail账户的id
String calId = "";
Cursor userCursor = getContentResolver().query(Uri.parse(calanderURL), null, null, null, null);
if (userCursor.getCount() > 0) {
userCursor.moveToLast(); //注意:是向最后一个账户添加,开发者可以根据需要改变添加事件 的账户
calId = userCursor.getString(userCursor.getColumnIndex("_id"));
}
else {
Toast.makeText(this, "没有账户,请先添加账户", 0).show();
return;
} ContentValues event = new ContentValues();
event.put("title", "与苍井空小姐动作交流");
event.put("description", "Frankie受空姐邀请,今天晚上10点以后将在Sheraton动作交流.lol~");
// 插入账户
event.put("calendar_id", calId);
System.out.println("calId: " + calId);
event.put("eventLocation", "地球-华夏"); Calendar mCalendar = Calendar.getInstance();
mCalendar.set(Calendar.HOUR_OF_DAY, 11);
mCalendar.set(Calendar.MINUTE, 45);
long start = mCalendar.getTime().getTime();
mCalendar.set(Calendar.HOUR_OF_DAY, 12);
long end = mCalendar.getTime().getTime(); event.put("dtstart", start);
event.put("dtend", end);
event.put("hasAlarm", 1); event.put(Events.EVENT_TIMEZONE, "Asia/Shanghai"); //这个是时区,必须有,
//添加事件
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); Toast.makeText(MainActivity.this, "插入事件成功!!!", Toast.LENGTH_LONG).show();
}
} //添加账户
private void initCalendars() { TimeZone timeZone = TimeZone.getDefault();
ContentValues value = new ContentValues();
value.put(Calendars.NAME, "yy"); value.put(Calendars.ACCOUNT_NAME, "mygmailaddress@gmail.com");
value.put(Calendars.ACCOUNT_TYPE, "com.android.exchange");
value.put(Calendars.CALENDAR_DISPLAY_NAME, "mytt");
value.put(Calendars.VISIBLE, 1);
value.put(Calendars.CALENDAR_COLOR, -9206951);
value.put(Calendars.CALENDAR_ACCESS_LEVEL, Calendars.CAL_ACCESS_OWNER);
value.put(Calendars.SYNC_EVENTS, 1);
value.put(Calendars.CALENDAR_TIME_ZONE, timeZone.getID());
value.put(Calendars.OWNER_ACCOUNT, "mygmailaddress@gmail.com");
value.put(Calendars.CAN_ORGANIZER_RESPOND, 0); Uri calendarUri = Calendars.CONTENT_URI;
calendarUri = calendarUri.buildUpon()
.appendQueryParameter(CalendarContract.CALLER_IS_SYNCADAPTER, "true")
.appendQueryParameter(Calendars.ACCOUNT_NAME, "mygmailaddress@gmail.com")
.appendQueryParameter(Calendars.ACCOUNT_TYPE, "com.android.exchange")
.build(); getContentResolver().insert(calendarUri, value);
} }

运行结果:  

  

Android 向系统日历中添加事件的更多相关文章

  1. Android向系统日历中添加日程事件

    转自Android向系统日历中添加日程事件 总结 在项目开发中,我们有预约提醒.定时提醒需求时,可以使用系统日历来辅助提醒: 通过向系统日历中写入事件.设置提醒方式(闹钟),实现到时间自动提醒的功能: ...

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

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

  3. 【定制Android系统】Android O 在ROM中添加自己的 so 库(1)——Android.mk 与 Android.bp 的区别【转】

    本文转载自: 版权声明:本文为博主原创文章,转载时请注明原作者及出处.    https://blog.csdn.net/u014248312/article/details/82020204需求:在 ...

  4. Android 获取系统相册中的所有图片

    Android 提供了API可获取到系统相册中的一些信息,主要还是通过ContentProvider 来获取想要的内容. 代码很简单,只要熟悉ContentProvider 就可以了. public ...

  5. Android Studio] Gradle项目中添加JNI生成文件(.so文件)

    转:http://blog.csdn.net/qiujuer/article/details/24209457 为了适应潮流使用Android Studio还是有半年多了! 对于从Eclipse迁移项 ...

  6. js中添加事件 attachEvent 与 addEventListener

    给元素添加事件时,使用js进行实现时产生了疑惑,有关事件浏览器兼容的问题,在此记录如下. <!DOCTYPE html> <html> <head> <met ...

  7. mfc 小程序---在系统菜单中添加菜单项

    1建立一个对话框工程:在dlg类里定义一个菜单指针m_pMenu,在对话框OnInitDialog函数里添加代码: m_pMenu=GetSystemMenu(FALSE);//获取系统菜单的指针 m ...

  8. Android Tips: 在给drawable中添加图片资源时,文件名必须全小写

    在给drawable中添加图片资源时,文件名必须全小写

  9. Android向系统相册中插入图片,相册中会出现两张 一样的图片(只是图片大小不一致)

    向系统相册中插入图片调用此方法时,相册中会出现两张一样的图片 MediaStore.Images.Media.insertImage 一张图片是原图一张图片是缩略图.表现形式为:android4.4. ...

随机推荐

  1. Shell学习笔记 - 环境变量配置文件(转)

    一.source命令 功能:在当前bash环境下读取并执行配置文件中的命令 1. 命令格式 source 配置文件  或  . 配置文件 2. 命令示例 [root@localhost ~]# sou ...

  2. 在Android项目中引入MuPdf

    由于公司手机App要加入一个附件查看功能,需要查看PDF文件,在网上找了许多第三方工具,最后选择了MuPDF. 更多第三方工具可以查看大神总结的:http://www.cnblogs.com/poke ...

  3. Linux入门学习,开启端口号

    之前买了一个阿里云Centos 7服务器,默认开启22端口和80端口,想开启其他端口号如何做 1.开启端口号 [root@localhost ~]# /sbin/iptables -I INPUT - ...

  4. 分享自制的13套 JQuery Mobile 界面主题(追加4套新款)

    15套整合在一起的,其中2套官方+13套自制,款款精致,方便移动开发. 字体默认为微软雅黑. 适配于 JQuery Mobile 1.4.3 下载地址:http://files.cnblogs.com ...

  5. Security.website-that-focus-on-mobile-app-security

    Mobile App Security 1. DATA THEOREM LAB https://datatheorem.github.io/ Data Theorem's technical blog ...

  6. 配置tomcat解压版

    配置Tomcat[解压版] 选择解压版的Tomcat的理由是可以让我们使用多个Tomcat,但是配置上就会出现一些问题,需要我们手动进行更改配置.我的Tomcat版本是:apache-tomcat-6 ...

  7. javascript eval和JSON之间的联系

    原出处:http://www.jb51.net/article/21688.htm eval函数的工作原理 eval函数会评估一个给定的含有JavaScript代码的字符串,并且试图去执行包含在字符串 ...

  8. 3dmax渲染插件,生成2.5d瓦片

    基于3dmax2013的2.5d渲染插件,demo版,需要的和感兴趣的可以试用,这是百度网盘地址:http://pan.baidu.com/s/1c0mYY7e 插件主要功能,按层级对3dmax场景进 ...

  9. jetbrains产品激活方式(WebStorm,Pycharm有效)

    注册时,在打开的License Activation窗口中选择"activation code",在输入框输入下面的注册码 43B4A73YYJ-eyJsaWNlbnNlSWQiO ...

  10. IE6的连接数限制问题

    今天解决了一个bug.看似是UI的bug,最后发现IE的设置问题(严格来说,IE6这么做没有问题,因为HTTP协议的规范如此). 先描述一下问题: 有一个页面管理Job,选中一些Job可以Run,每次 ...