权限,使用
Intent(Intent.ACTION_INSERT, CalendarContract.Events.CONTENT_URI)`启动系统日历应用添加事件
在安卓系统中,可以通过发送隐式 Intent
调用系统自带的日历应用,或通过指定包名直接启动特定品牌的日历应用(如三星、小米等),以下是常见场景的实现方式:
// 创建隐式Intent,触发系统选择日历应用 Intent intent = new Intent(Intent.ACTION_VIEW); intent.setType("vnd.android.cursor.item/event"); startActivity(intent);
// 创建显式Intent,跳转到添加事件的界面 Intent intent = new Intent(Intent.ACTION_INSERT); intent.setDataAndType(CalendarContract.Events.CONTENT_URI, "vnd.android.cursor.item/event"); // 传递事件标题、开始时间、结束时间等参数 intent.putExtra(CalendarContract.Events.TITLE, "会议标题"); intent.putExtra(CalendarContract.Events.EVENT_TIMEZONE, "Asia/Shanghai"); intent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, startTime.getMillis()); intent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getMillis()); startActivity(intent);
手机品牌 | 日历应用包名 | 适用场景 |
---|---|---|
华为 | com.android.calendar |
直接启动华为日历 |
小米 | com.miui.calendar |
直接启动小米日历 |
三星 | com.samsung.android.app.calendar |
直接启动三星日历 |
OPPO | com.coloros.calendar |
直接启动OPPO日历 |
通用 | com.android.calendar |
大多数安卓系统默认日历 |
示例代码(直接启动指定包名):
Intent intent = getPackageManager().getLaunchIntentForPackage("com.android.calendar"); if (intent != null) { startActivity(intent); } else { // 提示用户未安装指定日历应用 }
权限要求:
android.permission.READ_CALENDAR
和 android.permission.WRITE_CALENDAR
。兼容性处理:
Intent
的支持不一致,建议优先使用隐式 Intent
。异常处理:
startActivity
会抛出异常,需捕获 ActivityNotFoundException
。解答:
PackageManager pm = getPackageManager(); boolean isInstalled = pm.queryIntentActivities( new Intent(Intent.ACTION_INSERT, CalendarContract.Events.CONTENT_URI), PackageManager.MATCH_DEFAULT_ONLY ).size() > 0;
解答:
需使用 ContentResolver
查询 CalendarContract.Events
,
ContentResolver resolver = getContentResolver(); Uri uri = CalendarContract.Events.CONTENT_URI; Cursor cursor = resolver.query(uri, null, null, null, null); while (cursor.moveToNext()) { String title = cursor.getString(cursor.getColumnIndex(CalendarContract.Events.TITLE)); // 处理事件数据 } cursor.close();
需注意动态申请 READ_CALENDAR
权限