如何从表盘启动 Moto 360 'Agenda' 应用程序(或任何其他日历)?

How can I launch the Moto 360 'Agenda' app (or any other calendar) from a watchface?

我是 android(更不用说 android 磨损)开发的新手,我的表盘点击处理程序中有这样的东西:

Uri.Builder builder = CalendarContract.CONTENT_URI.buildUpon();
builder.appendPath("time");
ContentUris.appendId(builder, startMillis);
Intent intent = new Intent(Intent.ACTION_VIEW)
    .setData(builder.build())
    .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

点击时我收到 没有应用程序可以处理此操作 消息。

当然,Agenda 应用程序就在那里,我还安装了一些其他日历应用程序(例如 google)。

听起来这些应用程序的 Wear 组件不支持标准日历 Intent,就像他们的手持组件(大概)支持的那样。开发人员很可能只是没有充分考虑到其他人(比如您)会想要在手表上这样做。

您可以通过使用 adb 从手表中拉出相应的 APK 来具体检查这一点,然后 运行 apktool 在它们上提取人类可读的清单。查看它们包含的 <intent> 元素应该告诉你:

  • 如果他们确实支持标准CalendarContract,在这种情况下,您的称呼方式有问题。
  • 如果没有,也许他们会发布一些您可以调用的其他 Intent
一般来说,

绝对是更正确的做法。但是,在 Moto360 上,我查看了启动 Agenda 应用程序时启动的 activity。从那开始,我设法获得了代码:

ComponentName component = new ComponentName("com.google.android.wearable.app", "com.google.android.clockwork.home.calendar.AgendaActivity");
Intent intent = new Intent()
    .setComponent(component)
    .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

努力实现你所追求的目标。

警告:以这种方式启动任何应用程序实际上是在自找麻烦。请注意,其他应用程序可以更改包名称、活动可以重命名等,这些都会破坏这种启动活动的方式。但是,如果无法通过通用 Intents 启动您想要的应用程序,这可能是一种方法。

我关注了 并设法通过调用使其工作:

Intent calendarIntent = new Intent();
calendarIntent.setAction(Intent.ACTION_MAIN);
calendarIntent.addCategory(Intent.CATEGORY_APP_CALENDAR);
startActivity(calendarIntent);