从日历打开Android应用程序

我正在处理的应用程序需要能够在选定的日历中创build事件,然后当用户在日历查看应用程序中查看这些事件时,它提供了一个选项以返回到我的应用程序,以查看有关它和数据的更多信息与之相关。

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

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

我的第一个select的问题是,我不认为我可以保证日历查看应用程序将正确对待我的自定义URL作为链接,并让用户点击它(没有在我的平板电脑上的谷歌日历工作)。 第二个选项看起来更有希望,但是我一直没有find解释如何使用它的文档。

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

Solutions Collecting From Web of "从日历打开Android应用程序"

如果针对Jelly Bean(API 16+)是可接受的,那么使用CUSTOM_APP_PACKAGE是最好的解决scheme。 添加新的日历事件时,您只需填写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 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将在点击出现的button时开始,并将通过一个带有动作"android.provider.calendar.action.HANDLE_CUSTOM_EVENT"的Intent,它的URI将是日历项目的URI。

您提供的自定义URI位于附加项中,并带有CalendarContract.EXTRA_CUSTOM_APP_URI键。

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

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

你列出的第一个选项在我的Nexus S上工作正常。我现在只是试着确保它是从默认的Google日历应用程序工作。

在我的情况下,我不拦截myapp://event/1000 ,我拦截了一个像https://myspecialdomain.com/blahblah更实际的URL。 浏览器开始加载,但在加载任何内容之前,它会被我的应用程序换出。

如果你愿意,我可以明天告诉你我的代码。

@matiash如何用Google Calender Api做到这一点。

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