从日历打开Android应用程序

woe*_*man 10 android android-calendar

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

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

我考虑过的两个选项是在事件描述中包含一个自定义URL,点击后会被我的app中的intent过滤器捕获(例如myapp:// event/1000),或者我可以设置CUSTOM_APP_PACKAGE和CUSTOM_APP_URI值创建事件时CalendarContract.

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

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

mat*_*ash 11

如果定位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);       
Run Code Online (Sandbox Code Playgroud)

然后,您需要指定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>
Run Code Online (Sandbox Code Playgroud)

ShowCalendarDetailActivity将在点击出现的按钮时启动,并将通过操作传递Intent,"android.provider.calendar.action.HANDLE_CUSTOM_EVENT"其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);

    ...
}
Run Code Online (Sandbox Code Playgroud)

如果你想看看在日历应用建立此意图的代码,看到EventInfoFragment.updateCustomAppButton()EventInfoFragment.java.


Ste*_*zyk 4

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

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

如果您愿意,我明天可以向您展示我的代码。