大家好,好久没有更新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工程,查看效果:
运行首界面
获取登录账户名
获取事件title
插入一个事件
查看日历多了一条事件
查看事件详情
Ok今天就讲到这里,呵呵~