Android 13如何创建启动日历应用的Intent?解决启动异常问题
Android 13中启动日历应用的替代方案
你遇到的ActivityNotFoundException是因为直接指定了固定包名com.android.calendar,但不同厂商定制的Android系统会使用不同的日历应用包名(比如谷歌日历是com.google.android.calendar,三星日历是com.samsung.android.calendar),且Android 13新增的应用可见性限制也会导致无法直接找到指定包名的应用。以下是几种可靠的替代方法:
方法一:让系统自动匹配可用日历应用
移除固定包名限制,让系统筛选能处理日历URI的应用,同时提前检查避免崩溃:
private fun openCalendar() { val intent = Intent(Intent.ACTION_VIEW).apply { data = CalendarContract.CONTENT_URI addCategory(Intent.CATEGORY_APP_CALENDAR) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } else { Toast.makeText(this, "未找到可用的日历应用", Toast.LENGTH_SHORT).show() } }
方法二:直接启动日历应用主界面
如果不需要打开特定日历视图,而是直接启动日历应用首页,可使用CATEGORY_APP_CALENDAR精准匹配:
private fun openCalendarHome() { val intent = Intent(Intent.ACTION_MAIN).apply { addCategory(Intent.CATEGORY_APP_CALENDAR) flags = Intent.FLAG_ACTIVITY_NEW_TASK } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } else { Toast.makeText(this, "未找到可用的日历应用", Toast.LENGTH_SHORT).show() } }
方法三:适配Android 13应用可见性限制
在Android 13及以上系统中,应用默认无法查询其他应用的信息,需在AndroidManifest.xml中添加查询声明,确保能找到日历应用:
<queries> <intent> <action android:name="android.intent.action.VIEW" /> <data android:scheme="content" /> <category android:name="android.intent.category.APP_CALENDAR" /> </intent> </queries>
内容的提问来源于stack exchange,提问作者liarspocker
相关产品推荐
相关产品推荐

