20.Android中的日历读写操作

本文详细介绍如何在Android应用中实现日历的读写功能,包括权限申请、使用ContentProvider进行读写操作,并提供了一个完整的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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

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

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

?
1
2
<uses-permissionandroid:name="android.permission.READ_CALENDAR"/>
<uses-permissionandroid: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
<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns: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 extendsActivityimplementsOnClickListener {
    privateButton mReadUserButton;
    privateButton mReadEventButton;
    privateButton mWriteEventButton;
 
    privatestaticString calanderURL ="";
    privatestaticString calanderEventURL ="";
    privatestaticString 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
    publicvoidonCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        setupViews();
    }
 
    privatevoidsetupViews() {
        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
    publicvoidonClick(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();
            }
        }elseif(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();
            }
        }elseif(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 =newContentValues();
            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);
            longstart = mCalendar.getTime().getTime();
            mCalendar.set(Calendar.HOUR_OF_DAY,11);
            longend = mCalendar.getTime().getTime();
 
            event.put("dtstart", start);
            event.put("dtend", end);
            event.put("hasAlarm",1);
 
            Uri newEvent = getContentResolver().insert(
                    Uri.parse(calanderEventURL), event);
            longid = Long.parseLong(newEvent.getLastPathSegment());
            ContentValues values =newContentValues();
            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
<?xmlversion="1.0"encoding="utf-8"?>
<manifestxmlns:android="http://schemas.android.com/apk/res/android"
    package="com.tutor.calendardemo"android:versionCode="1"
    android:versionName="1.0">
    <applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
        <activityandroid:name=".CalendarDemo"android:label="@string/app_name">
            <intent-filter>
                <actionandroid:name="android.intent.action.MAIN"/>
                <categoryandroid:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>
    <uses-sdkandroid:minSdkVersion="7"/>
    <uses-permissionandroid:name="android.permission.READ_CALENDAR"/>
    <uses-permissionandroid: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、付费专栏及课程。

余额充值