10

我正在开发的应用程序需要能够在选定的日历中创建事件,然后当用户在他们的日历查看应用程序中查看这些事件时,它会提供一个选项来返回到我的应用程序以查看有关它和数据的更多信息与它有关。

使用日历提供程序,我可以创建事件并将 Uri 存储到事件中以供以后使用/删除,但我还没有找到在日历查看应用程序中从这些事件打开我的应用程序的好方法。

我考虑的 2 个选项是在事件描述中包含一个自定义 URL,单击该 URL 时将被我的应用程序中的意图过滤器(例如 myapp://event/1000)捕获,或者我可以设置CUSTOM_APP_PACKAGE 和 CUSTOM_APP_URI值创建事件时的 CalendarContract。

我对第一个选项的问题是,我认为我不能保证日历查看应用程序会正确地将我的自定义 URL 视为链接并让用户单击它(在我的平板电脑上的 Google 日历中不起作用)。第二个选项看起来更有希望,但我找不到太多解释如何使用它的文档。

有谁知道如何正确地做到这一点?任何帮助表示赞赏!

4

2 回答 2

12

如果可以接受以 Jelly Bean (API 16+) 为目标,那么使用CUSTOM_APP_PACKAGE是最好的解决方案。添加新日历事件时,您只需填写CUSTOM_APP_PACKAGECUSTOM_APP_URI字段(分别使用您的包名称和标识事件的 URI):

ContentValues values = new ContentValues();
values.put(CalendarContract.Events.CALENDAR_ID, 1);
values.put(CalendarContract.Events.TITLE, "Check stackoverflow.com");
values.put(CalendarContract.Events.DTSTART, beginTime.getTimeInMillis());
values.put(CalendarContract.Events.DTEND, endTime.getTimeInMillis());
values.put(CalendarContract.Events.EVENT_TIMEZONE, TimeZone.getDefault().getID());

values.put(CalendarContract.Events.CUSTOM_APP_PACKAGE, getPackageName());
values.put(CalendarContract.Events.CUSTOM_APP_URI, "myAppointment://1");

getContentResolver().insert(CalendarContract.Events.CONTENT_URI, values);       

然后,您需要指定作为 AndroidManifest.xml 的一部分(如文档所述)将从日历应用程序调用的 Activity 以显示详细视图,例如

    <activity android:name=".ShowCalendarDetailActivity">
        <intent-filter>
            <action android:name="android.provider.calendar.action.HANDLE_CUSTOM_EVENT" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="vnd.android.cursor.item/event" />
        </intent-filter>            
    </activity>

ShowCalendarDetailActivity将在点击出现的按钮时启动,并将传递一个带有操作的 Intent,"android.provider.calendar.action.HANDLE_CUSTOM_EVENT"其 URI 将是日历项 URI。

您提供的自定义 URI 在 extras 中,带有 key CalendarContract.EXTRA_CUSTOM_APP_URI

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    String myCustomUri = getIntent().getStringExtra(CalendarContract.EXTRA_CUSTOM_APP_URI);

    ...
}

如果您想查看日历应用程序构建此意图的代码,请参阅EventInfoFragment.updateCustomAppButton().EventInfoFragment.java

于 2014-12-19T22:10:36.657 回答
4

您列出的第一个选项在我的 Nexus S 上运行良好。我现在刚刚尝试过,以确保它来自默认的 Google 日历应用程序。

就我而言,我不是在拦截myapp://event/1000,而是在拦截一个更像https://myspecialdomain.com/blahblah. 浏览器开始加载,但在它有时间加载任何东西之前,它被我的应用程序换掉了。

如果你愿意,我明天可以给你看我的代码。

于 2013-04-10T08:18:55.357 回答