Giới thiệu
Bài viết này hướng dẫn cách mở ứng dụng Calendar mặc định của Android để thêm sự kiện mới thông qua Intent ACTION_EDIT.
Các bước thực hiện
Bước 1: Tạo dự án mới
Khởi tạo project Android Studio mới.
Bước 2: Layout (res/layout/activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="8dp"
tools:context=".MainActivity">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="addCalendarEvent"
android:text="Thêm sự kiện Calendar" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="Thêm sự kiện vào Lịch Android"
android:textSize="18sp"
android:textStyle="bold" />
</RelativeLayout>
Bước 3: Code Java (src/MainActivity.java)
package app.com.sample;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import androidx.appcompat.app.AppCompatActivity;
import java.util.Calendar;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void addCalendarEvent(View view) {
Calendar calendar = Calendar.getInstance();
Intent intent = new Intent(Intent.ACTION_EDIT);
intent.setType("vnd.android.cursor.item/event");
// Thời gian bắt đầu: ngay bây giờ
intent.putExtra("beginTime", calendar.getTimeInMillis());
// Sự kiện cả ngày
intent.putExtra("allDay", true);
// Lặp lại hàng năm
intent.putExtra("rrule", "FREQ=YEARLY");
// Thời gian kết thúc: 1 giờ sau
intent.putExtra("endTime", calendar.getTimeInMillis() + 60 * 60 * 1000);
// Tiêu đề sự kiện
intent.putExtra("title", "Sự kiện từ App Demo");
// Mô tả (tùy chọn)
intent.putExtra("description", "Được tạo tự động từ ứng dụng demo");
// Kiểm tra có app Calendar nào xử lý intent không
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
} else {
// Fallback: mở Calendar app chung
Intent fallback = new Intent(Intent.ACTION_VIEW)
.setData(android.provider.CalendarContract.CONTENT_URI);
startActivity(fallback);
}
}
}
Các extra quan trọng cho Calendar Intent:
| Extra Key | Kiểu dữ liệu | Mô tả |
|---|---|---|
| title | String | Tiêu đề sự kiện |
| description | String | Mô tả chi tiết |
| eventLocation | String | Địa điểm |
| beginTime | long (millis) | Thời gian bắt đầu |
| endTime | long (millis) | Thời gian kết thúc |
| allDay | boolean | Sự kiện cả ngày |
| rrule | String | Quy tắc lặp (RFC 5545), vd: "FREQ=WEEKLY" |
| eventTimezone | String | Múi giờ, vd: "Asia/Ho_Chi_Minh" |
Bước 4: Manifest
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="app.com.sample">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Chạy ứng dụng
Chạy app, nhấn nút "Thêm sự kiện Calendar". Sẽ mở app Calendar (Google Calendar hoặc Calendar mặc định) với form tạo sự kiện đã điền sẵn thông tin.

Lưu ý
- Cần có ứng dụng Calendar cài đặt trên thiết bị
- Người dùng phải xác nhận lưu sự kiện
- Không cần quyền
WRITE_CALENDARkhi dùng Intent (chỉ cần khi ghi trực tiếp qua CalendarContract)
Cách ghi trực tiếp vào Calendar (cần permission)
// Cần permission: WRITE_CALENDAR ContentValues values = new ContentValues(); values.put(CalendarContract.Events.TITLE, "Title"); values.put(CalendarContract.Events.DTSTART, startTime); values.put(CalendarContract.Events.DTEND, endTime); values.put(CalendarContract.Events.CALENDAR_ID, 1); values.put(CalendarContract.Events.EVENT_TIMEZONE, "UTC"); getContentResolver().insert(CalendarContract.Events.CONTENT_URI, values);