如果您的应用程序独立于用户的日历事件,您可以创建一个SyncAdapter
(也需要一个AccountAuthenticator
),并将其注册为与 android 日历内容同步。然后,作为同步适配器,使用您想要的颜色创建一个新日历并将其标记为只读;将您的活动放在那里,它们将出现在用户可能使用的任何日历应用程序中。从您的应用程序中,只需查询日历中的事件,您就可以在不进行额外过滤的情况下获取事件。
示例和文章:有关于日历提供程序的 android 文档,它描述了如何访问和修改日历和事件。您需要它来创建和填写您的日历。如果您的应用程序不需要身份验证,请参阅“创建存根验证器”,并通过编程方式创建帐户
Account account = new Account("static username, displayed to user", "your.type");
AccountManager.get(context).addAccountExplicitly(account, "", null);
ContentResolver.setSyncAutomatically(account, "com.android.calendar", true);
请记住使用单独的 xml 文件 (res/xml/yourname.xml) 注册您的同步适配器:
<?xml version="1.0" encoding="UTF-8"?>
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
android:contentAuthority="com.android.calendar"
android:accountType="your.type"
android:userVisible="true"
android:allowParallelSyncs="false"
android:isAlwaysSyncable="true"
android:supportsUploading="false"
/>
请注意,我添加了isAlwaysSyncable
; 未设置该属性时,ContentResolver.setIsSyncable
必须调用以允许任何同步。
您还需要在 AndroidManifest.xml 中注册一个生成 SyncAdapter 的服务(就像使用 一样AccountAuthenticator
):
<service android:name=".package.classname" android:exported="true">
<intent-filter>
<action android:name="android.content.SyncAdapter" />
</intent-filter>
<meta-data android:name="android.content.SyncAdapter" android:resource="@xml/yourname" />
</service>
<uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission android:name="android.permission.WRITE_CALENDAR" />
<!-- when distributing an AccountAuthenticator this is also required: -->
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
对于一般同步适配器的内容以及如何将它们组合在一起,有一篇很棒的博客文章“编写你自己的 Android 同步适配器”。