Google Glass Mirror API - 有没有办法删除一堆卡片?

时间:2013-11-17 19:59:08

标签: google-glass google-mirror-api

我正在使用镜像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 }
};

如果封面卡上无法使用,是否可以通过向子卡中添加删除菜单项来为捆绑包执行此操作?

任何建议都将不胜感激

3 个答案:

答案 0 :(得分:2)

您可以使用自定义菜单执行此操作。下面的代码使用的是Java,但C#应该类似:

  1. 将自定义菜单项添加到卡片中:

    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);
    
  2. 定义处理镜像服务器通知回调请求的控制器:

    if (notification.getCollection().equals("timeline") && notification.getUserActions().contains(new UserAction().setType("CUSTOM").setPayload("delete_bundle_A"))) {
        deleteCards(credential, bundleId);
    }
    
  3. 删除卡功能:

    // 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);
    }
    
  4. 最后,在应用程序启动时不要忘记订阅时间表通知:

    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}