我正在使用镜像API(c#库)向Glass发送一副卡片
我知道您可以使用单张卡上的默认删除菜单项,但有没有办法为整个捆绑包提供删除功能,理想情况下是用户采取一项操作的结果?
我已成功在菜单项上使用DELETE操作,代码如下
MenuItem mi = new MenuItem();
mi.Action = "DELETE";
TimelineItem tli = new TimelineItem()
{
Html = itemHtml.ToString(),
Notification = new NotificationConfig() { Level = "DEFAULT" },
MenuItems = new List<MenuItem>() { mi }
};
有没有办法将此删除菜单项添加到捆绑封面?我知道这可能很棘手,因为点击捆绑封面会导致您导航到子卡片,因此没有像单张卡片那样存在菜单。我正在寻找一些东西(我试过但它只是忽略了菜单项),如下所示:
MenuItem mi = new MenuItem();
mi.Action = "DELETE";
TimelineItem tli = new TimelineItem()
{
Html = itemHtml.ToString(),
Notification = new NotificationConfig() { Level = "DEFAULT" },
IsBundleCover = true,
BundleId = bundleId,
MenuItems = new List<MenuItem>() { mi }
};
如果封面卡上无法使用,是否可以通过向子卡中添加删除菜单项来为捆绑包执行此操作?
任何建议都将不胜感激
答案 0 :(得分:2)
您可以使用自定义菜单执行此操作。下面的代码使用的是Java,但C#应该类似:
将自定义菜单项添加到卡片中:
List<MenuValue> menuValueList = new ArrayList<MenuValue>();
menuValueList.add(new MenuValue().setIconUrl(iconUrl).setDisplayName("Delete All"));
MenuItem menuItem = new MenuItem();
menuItem.setValues(menuValueList).setId("delete_bundle_A").setAction("CUSTOM");
List<MenuItem> menuItemList = new ArrayList<MenuItem>();
menuItemList.add(menuItem);
timelineItem.setMenuItems(menuItemList);
定义处理镜像服务器通知回调请求的控制器:
if (notification.getCollection().equals("timeline") && notification.getUserActions().contains(new UserAction().setType("CUSTOM").setPayload("delete_bundle_A"))) {
deleteCards(credential, bundleId);
}
删除卡功能:
// if bundleId is null or "", delete all cards
public static void deleteCards(Credential credential, String bundleId) throws IOException {
if (bundleId == null) {
bundleId = "";
}
Mirror.Timeline timelineItems = MirrorClient.getMirror(credential).timeline();
Mirror.Timeline.List list = timelineItems.list();
List<TimelineItem> timelineItemList = null;
do {
TimelineListResponse response = list.execute();
timelineItemList = response.getItems();
if (timelineItemList != null && timelineItemList.size() > 0) {
for (TimelineItem item : timelineItemList) {
if (bundleId == "" || bundleId.equalsIgnoreCase(item.getBundleId())) {
LOG.info("Deleting card " + item.getId());
MirrorClient.deleteTimelineItem(credential, item.getId());
}
}
list.setPageToken(response.getNextPageToken());
} else {
break;
}
} while (list.getPageToken() != null && list.getPageToken().length() > 0);
}
最后,在应用程序启动时不要忘记订阅时间表通知:
String notifyUrl = "https://mirrornotifications.appspot.com/forward?url=" + "http://yourServer.com/notify";
Subscription subscription = MirrorClient.insertSubscription(credential, notifyUrl, userId, "timeline");
答案 1 :(得分:1)
目前尚不清楚您是在询问如何创建菜单项以立即删除整个捆绑包,或者您是否正在寻找代码来进行实际删除。
Yuan为这两者提供了一些非常好的答案(尤其是因为他实际上提供了代码,我不会这样做),但是您可能还需要考虑三件事。
1)您无法在捆绑封面上设置菜单,但如果您没有明确指定捆绑封面,则最新的卡片将显示为封面,也将显示显示为捆绑中的第一张卡片。你可以通过这种方式进入菜单。 (例如,默认消息传递应用程序以这种方式工作,但第一张卡具有与其余卡相同的菜单。)
2)您无需创建新的菜单项。如果您愿意,可以使用DELETE菜单项。您将收到捆绑中其中一张卡的删除通知,然后您可以读取bundleId并删除其余的卡。
3)您不需要遍历所有您插入的卡片,只是为了找到具有该bundleId的卡片。那是可怕的效率低下。我不熟悉C#,但是通过阅读https://developers.google.com/resources/api-libraries/documentation/mirror/v1/csharp/latest/classGoogle_1_1Apis_1_1Mirror_1_1v1_1_1TimelineResource_1_1ListRequest.html处的文档,我感觉你可以创建一个ListRequest,然后在执行查询之前设置bundleId并获得结果。
所以我认为你可以将Yuan的代码更改为:
Mirror.Timeline.List list = timelineItems.list();
list.BundleId = bundleId;
List<TimelineItem> timelineItemList = null;
do {
TimelineListResponse response = list.execute();
timelineItemList = response.getItems();
if (timelineItemList != null && timelineItemList.size() > 0) {
for (TimelineItem item : timelineItemList) {
LOG.info("Deleting card " + item.getId());
MirrorClient.deleteTimelineItem(credential, item.getId());
}
list.setPageToken(response.getNextPageToken());
} else {
break;
}
} while (list.getPageToken() != null && list.getPageToken().length() > 0);
(这应该被视为伪代码,充其量)
如果您确信已将多少项放入捆绑包中,则可能还可以设置list.MaxResults
而不必遍历结果页面。所以也许更像是
Mirror.Timeline.List list = timelineItems.list();
list.BundleId = bundleId;
list.MaxResults = 20; // Set to more than the max number of items in a bundle
TimelineListResponse response = list.execute();
List<TimelineItem> timelineItemList = response.getItems();
if (timelineItemList != null && timelineItemList.size() > 0) {
for (TimelineItem item : timelineItemList) {
LOG.info("Deleting card " + item.getId());
MirrorClient.deleteTimelineItem(credential, item.getId());
}
}
答案 2 :(得分:0)
似乎没有办法在一个步骤中删除捆绑,但它仍然可能...... 您可以在/时间轴上执行GET以获取应用已推送到用户时间线的项目列表。过滤出来以查找包含要删除的bundleId的条目。对于其中每个项目,请调用DELETE / Timeline / {itemid}