我正在处理的应用程序需要能够在所选日历中创建事件,然后当用户在其日历查看应用程序中查看这些事件时,它提供了一个选项,可以返回到我的应用程序以查看有关它的更多信息。以及与之相关的数据。
使用Calendar Provider我可以创建活动,然后将Uri存储到活动中供以后使用/删除,但我还没有找到一种在日历查看中从这些活动打开我的应用程序的好方法应用
我考虑过的两个选项是在事件描述中包含一个自定义URL,点击后会被我的应用中的意图过滤器捕获(例如myapp:// event / 1000)或者我可以设置{{ 3}}在创建事件时来自CalendarContract的值。
我的第一个选项的问题是,我认为我不能保证日历查看应用会将我的自定义网址正确视为链接并让用户点击它(在我的Google日历中无效)片剂)。第二个选项看起来更有希望,但我找不到很多解释如何使用它的文档。
有谁知道如何正确地做到这一点?任何帮助表示赞赏!
答案 0 :(得分:11)
如果定位Jelly Bean(API 16+)是可以接受的,那么使用CUSTOM_APP_PACKAGE
是最佳解决方案。添加新日历活动时,您只需填写CUSTOM_APP_PACKAGE
和CUSTOM_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的一部分(如the documentation所述)将从Calendar应用程序调用的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
将被启动,并且将通过动作"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);
...
}
如果您想查看日历应用构建此意图的代码,请参阅EventInfoFragment.java
中的EventInfoFragment.updateCustomAppButton()
。
答案 1 :(得分:4)
您列出的第一个选项在我的Nexus S上运行正常。我刚刚尝试过,以确保它来自默认的Google日历应用。
在我的情况下,我没有拦截myapp://event/1000
,我正在拦截更像https://myspecialdomain.com/blahblah
的实际网址。浏览器开始加载,但在它有时间加载任何东西之前,它会被我的应用程序换掉。
如果你愿意,我明天可以告诉你我的代码。