20.Android中的日历读写操作


大家好,好久没有更新blog了,今天给大家分享一下Android日历读写的操作方法,这里主要用到了ContentProiver的知识。如果大家不明白ContentProvider建议先查一下资料,知道它是干什么的。这样更容易下面的例子。

好了废话不说,这里提个醒,Android中的日历只有真机才有,模拟上是没有的,所以测试环境一定要真机!!

因为日历是系统自带的,所以我们读写它一定要申请权限,也就是在AndroidManifest.xml加如下两行代码(一个读一个写):

?
1
2
< uses-permission android:name = "android.permission.READ_CALENDAR" />
< uses-permission android:name = "android.permission.WRITE_CALENDAR" />

Android中日历用了三个URL,分别是日历用户的URL,事件的URL,事件提醒URL,三个URL在Android2.1之前是如下的样子:

?
1
2
3
calanderURL = "content://calendar/calendars" ;
calanderEventURL = "content://calendar/events" ;
calanderRemiderURL= "content://calendar/reminders" ;

但是在Android2.2版本以后,三个URL有了改变,变成如下的样子:

?
1
2
3
calanderURL = "content://com.android.calendar/calendars" ;
calanderEventURL = "content://com.android.calendar/events" ;
calanderRemiderURL = "content://com.android.calendar/reminders" ;

还是老样子,为了让大家更好的理解,我写了一个简单的Demo,大家按照我的步骤一步一步的来:

第一步:新建一个Android工程命名为CalendarDemo

第二步:修改main.xml布局文件,增加了三个按钮,代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<? xml version = "1.0" encoding = "utf-8" ?>
< LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
     android:orientation = "vertical"
     android:layout_width = "fill_parent"
     android:layout_height = "fill_parent" >
     < TextView
         android:layout_width = "fill_parent"
         android:layout_height = "wrap_content"
         android:text = "@string/hello"
         />
     < Button
         android:id = "@+id/readUserButton"
         android:layout_width = "fill_parent"
         android:layout_height = "wrap_content"
         android:text = "Get a User"
         />
     < Button
         android:id = "@+id/readEventButton"
         android:layout_width = "fill_parent"
         android:layout_height = "wrap_content"
         android:text = "Get a Event"
         />
     < Button
         android:id = "@+id/writeEventButton"
         android:layout_width = "fill_parent"
         android:layout_height = "wrap_content"
         android:text = "Input a Event"
         />
</ LinearLayout >

第三步:修改主核心程序CalendarDemo.java,代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package com.tutor.calendardemo;
 
import java.util.Calendar;
 
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
 
public class CalendarDemo extends Activity implements OnClickListener {
     private Button mReadUserButton;
     private Button mReadEventButton;
     private Button mWriteEventButton;
 
     private static String calanderURL = "" ;
     private static String calanderEventURL = "" ;
     private static String calanderRemiderURL = "" ;
     // 为了兼容不同版本的日历,2.2以后url发生改变
     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" ;
         }
     }
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.main);
 
         setupViews();
     }
 
     private void setupViews() {
         mReadUserButton = (Button) findViewById(R.id.readUserButton);
         mReadEventButton = (Button) findViewById(R.id.readEventButton);
         mWriteEventButton = (Button) findViewById(R.id.writeEventButton);
         mReadUserButton.setOnClickListener( this );
         mReadEventButton.setOnClickListener( this );
         mWriteEventButton.setOnClickListener( this );
     }
 
     @Override
     public void onClick(View v) {
         if (v == mReadUserButton) {
 
             Cursor userCursor = getContentResolver().query(
                     Uri.parse(calanderURL), null , null , null , null );
             if (userCursor.getCount() > 0 ) {
                 userCursor.moveToFirst();
                 String userName = userCursor.getString(userCursor
                         .getColumnIndex( "name" ));
                 Toast.makeText(CalendarDemo. this , userName, Toast.LENGTH_LONG)
                         .show();
             }
         } else if (v == mReadEventButton) {
             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(CalendarDemo. this , eventTitle, Toast.LENGTH_LONG)
                         .show();
             }
         } else if (v == mWriteEventButton) {
             // 获取要出入的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" ,
                     "Frankie受空姐邀请,今天晚上10点以后将在Sheraton动作交流.lol~" );
             // 插入hoohbood@gmail.com这个账户
             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);
             Toast.makeText(CalendarDemo. this , "插入事件成功!!!" , Toast.LENGTH_LONG)
                     .show();
         }
     }
}

第四步:在AndroidManifest.xml中申请权限,代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<? xml version = "1.0" encoding = "utf-8" ?>
< manifest xmlns:android = "http://schemas.android.com/apk/res/android"
     package = "com.tutor.calendardemo" android:versionCode = "1"
     android:versionName = "1.0" >
     < application android:icon = "@drawable/icon" android:label = "@string/app_name" >
         < activity android:name = ".CalendarDemo" android:label = "@string/app_name" >
             < intent-filter >
                 < action android:name = "android.intent.action.MAIN" />
                 < category android:name = "android.intent.category.LAUNCHER" />
             </ intent-filter >
         </ activity >
     </ application >
     < uses-sdk android:minSdkVersion = "7" />
     < uses-permission android:name = "android.permission.READ_CALENDAR" />
     < uses-permission android:name = "android.permission.WRITE_CALENDAR" />
</ manifest >

第五步:运行上述Android工程,查看效果:

1
运行首界面

2
获取登录账户名

3
获取事件title

4
插入一个事件

5
查看日历多了一条事件

6
查看事件详情

Ok今天就讲到这里,呵呵~


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值