【问题标题】:Gboard sticker search doesn't return resultGboard 贴纸搜索不返回结果
【发布时间】:2017-09-05 08:44:44
【问题描述】:

我通过应用索引将贴纸包添加到 GBoard,但 GBoard 搜索无法按关键字找到我的贴纸。

new Indexable.Builder("Sticker")
   .setName("Bye")
   .setImage("http://www.snoopysticker.com?id=1234")
   .setUrl("http://sticker/canonical/image/bye")
   .setDescription("A sticker for Bye")
   .put("keywords", "bye", "snoopy", "see ya", "good bye")
   .put("isPartOf",
        new Indexable.Builder("StickerPack")
          .setName("Snoopy Pack")
          .build())
   .build())};

【问题讨论】:

  • 我的贴纸没有出现在 gboard 中也有问题。首先,我必须获得 Gboard 的最新测试版才能获得贴纸功能。我来自 Allo 的个人贴纸立即出现。然后我用 NBAmoji 应用程序测试了贴纸功能,它完美无缺。但我仍然没有看到我的应用程序索引的贴纸出现在那里。我几乎完全按照示例代码进行操作,没有收到任何错误。一切似乎工作正常,更新任务成功完成。示例代码:github.com/firebase/quickstart-android/tree/master/app-indexing
  • 要访问 Gboard 中的贴纸,请长按表情符号按钮(逗号)。新的贴纸图标位于表情符号图标和 gif 图标之间的最底部。按下它,您应该会看到一些贴纸(如果有)或从 Play 商店下载坐骑应用程序的提示。当心,也有一些蹩脚的...... ;-)
  • 但是,如果您希望其他人帮助您,您应该提供更多IndexingServiceStickerProvider 的代码以及您的问题的详细描述。日志说什么?有什么错误吗?更新任务的行为如何?
  • @ArthurThompson 有什么想法吗?我们必须使用JobService吗?
  • 我明白了!我重命名了Indexable.Builders。它们必须分别命名为"Sticker""StickerPack"。 -> Indexable.Builder("StickerPack") (就像在这个问题中一样 - 所以这不是答案)。虽然它在示例代码中,但没有明确记录。

标签: android firebase android-app-indexing


【解决方案1】:

问题出在代码的另一部分,因为您在上面发布的内容在改编自Google's sample project for stickers 的以下示例中效果很好:

public static void clearStickers(FirebaseAppIndex firebaseAppIndex) {
    Task<Void> task = firebaseAppIndex.removeAll();
    task.addOnSuccessListener(__ -> Log.i(TAG, SUCCESS_IN_CLEARING_STICKERS));
    task.addOnFailureListener(e -> Log.i(TAG, FAILED_TO_CLEAR_STICKERS, e));
}

public static void setStickers(final Context context, FirebaseAppIndex firebaseAppIndex) {
    try {
        List<Indexable> stickers = getIndexableStickers(context);
        Indexable stickerPack = getIndexableStickerPack(context);

        List<Indexable> indexables = new ArrayList<>(stickers);
        indexables.add(stickerPack);

        Task<Void> task = firebaseAppIndex.update(
                indexables.toArray(new Indexable[indexables.size()]));
        task.addOnSuccessListener(__ -> Log.i(TAG, SUCCESS_IN_INSTALLING_STICKERS));
        task.addOnFailureListener(e -> Log.i(TAG, FAILED_TO_INSTALL_STICKERS, e));

    } catch (IOException | FirebaseAppIndexingInvalidArgumentException e) {
        Log.e(TAG, ERROR_IN_SETTING_STICKERS, e);
    }
}

private static Indexable getIndexableStickerPack(final Context context)
        throws IOException, FirebaseAppIndexingInvalidArgumentException {
    List<Indexable> indexables = StreamSupport
            .stream(getStickerBuilders(context))
            .map(IndexableBuilder::build)
            .collect(Collectors.toList());

    StickerPackBuilder stickerPackBuilder = Indexables.stickerPackBuilder()
            .setName(STICKER_PACK_NAME)
            // Use the first sticker as the hero for the pack
            .setUrl(String.format(STICKER_PACK_URL_PATTERN, 0))
            // Defaults to the first sticker in "hasSticker". Used to select between sticker
            // packs so should be representative of the sticker pack.
            .setImage(StickersDataFactory.getAllStickerReference().get(0).getURL())
            .put("hasSticker", indexables.toArray(new Indexable[indexables.size()]))
            .setDescription(STICKER_PACK_NAME);
    return stickerPackBuilder.build();
}

private static List<Indexable> getIndexableStickers(final Context context)
        throws IOException, FirebaseAppIndexingInvalidArgumentException {
    List<Indexable> indexableStickers = new ArrayList<>();
    List<Indexable.Builder> stickerBuilders = getStickerBuilders(context);

    for (Indexable.Builder stickerBuilder : stickerBuilders) {
        stickerBuilder.put("keywords", getKeywordsForSticker(context, null))
                .put("isPartOf", new Indexable.Builder("StickerPack").setName(STICKER_PACK_NAME) .build());

        indexableStickers.add(stickerBuilder.build());
    }

    return indexableStickers;
}

private static List<Indexable.Builder> getStickerBuilders(final Context context)
        throws IOException, FirebaseAppIndexingInvalidArgumentException {
    List<Indexable.Builder> stickerBuilders = new ArrayList<>();

    // Start from 1 because the first sticker will be used as hero for the pack
    for (int i = 1; i < StickersDataFactory.getAllStickerReference().size(); i++) {
            stickerBuilders.add(new Indexable.Builder("Sticker")
                    .setName(StickersDataFactory.getAllStickerReference().get(i).getName())
                    .setUrl(String.format(STICKER_URL_PATTERN, i))
                    .setImage(StickersDataFactory.getAllStickerReference().get(i).getURL())
                    .setDescription("Random description")
                    .put("keywords", getKeywordsForSticker(context, StickersDataFactory.getAllStickerReference().get(i)))
                    .put("isPartOf", new Indexable.Builder("StickerPack").setName(STICKER_PACK_NAME) .build()));
    }

    return stickerBuilders;
}

【讨论】:

    【解决方案2】:

    应该是Indexables.stickerBuilder(),而不是new Indexable.Builder("Sticker")。我从这个官方的 Google example 那里得到这个。

    【讨论】:

      猜你喜欢
      • 2018-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-31
      • 2011-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多