【问题标题】:How to remove pinned shortcuts?如何删除固定的快捷方式?
【发布时间】:2017-11-06 22:40:14
【问题描述】:

背景

从 Android O 开始,可以创建固定快捷方式,它(在支持的启动器上)会显示一个对话框来确认它们的创建:

            ShortcutInfoCompat pinShortcutInfo = new ShortcutInfoCompat.Builder(context, uniqueShortcutId)
                    .setShortLabel(label)
                    .setIntent(shortcutIntent)
                    .setLongLabel(label)
                    .setIcon(IconCompat.createWithBitmap(bitmap))
                    .build();
            ShortcutManagerCompat.requestPinShortcut(this, pinShortcutInfo , null);

文档:

https://developer.android.com/reference/android/content/pm/ShortcutManager.html https://developer.android.com/guide/topics/ui/shortcuts.html

问题

有时,固定的快捷方式不再相关。例如,它指向不再存在的东西。

在这种情况下,我希望能够将其删除。

我尝试过的

我认为下一个代码可以做到这一点,但事实并非如此,因为它可能与动态快捷方式有关,这是另一回事:

ShortcutManager shortcutManager = (ShortcutManager) getSystemService(SHORTCUT_SERVICE);
final List<ShortcutInfo> pinnedShortcuts = shortcutManager.getPinnedShortcuts();
final ArrayList<String> shortcutIdsToRemove = new ArrayList<>();
for (ShortcutInfo pinnedShortcut : pinnedShortcuts) {
    final Intent pinnedShortcutIntent = pinnedShortcut.getIntent();
    shortcutIdsToRemove.add(pinnedShortcut.getId());
}
shortcutManager.removeDynamicShortcuts(shortcutIdsToRemove);
// this also doesn't work : shortcutManager.disableShortcuts(shortcutIdsToRemove);

问题

如何删除固定的快捷方式?有没有可能?


更新:似乎不可能,正如 Google 提到的 here

到目前为止,这个 API 对我来说似乎很受限制,因为它有很多缺点:

  1. 无法从资源 ID 创建创建的图标图像。
  2. 在启动器上,创建的图标有一个创建它的应用的小图标。
  3. 无法通过 API 移除图标(仅禁用),因此如果您创建的图标指向另一个应用,而该应用已被移除,您将无法移除它。
  4. 创建不能在后台进行,因为它需要一个确认对话框。它也不能批量创建。一个接一个。
  5. 如果您的应用被删除,您的应用创建的所有固定快捷方式都将被删除。

所以,我现在的问题是:

  1. 是否有任何方法可以使用以前的 API 创建和删除快捷方式,使用 adb 命令,如果需要,使用 root 权限?

  2. 是否可以使用 adb 命令删除特定的固定快捷方式,如果需要,可以使用 root 权限?

【问题讨论】:

  • 你有没有想过这个问题?
  • @AlexandruPetrescu 没有。遗憾的是没有......
  • @AlexandruPetrescu 我已经给出了我认为是这个问题的最佳答案。请在宽限期到期之前查看并奖励赏金。

标签: android android-8.0-oreo pinned-shortcut


【解决方案1】:

disableShortcuts() 是你能做的最好的。当用户尝试选择禁用的快捷方式时,它将向用户显示自定义错误消息。

来自official documentation

快捷方式限制 虽然您一次最多可以为您的应用发布五个快捷方式(静态和动态快捷方式组合),但大多数启动器只能显示四个。

但是,用户可以创建的应用的固定快捷方式的数量没有限制。即使您的应用无法移除固定的快捷方式,它仍然可以禁用它们。

Another section:

由于您的应用及其用户可以将快捷方式固定到设备的启动器,因此这些固定的快捷方式可能会将用户引导至您应用中过时或不再存在的操作。要管理这种情况,您可以通过调用 disableShortcuts() 来禁用您不希望用户选择的快捷方式,这会从静态和动态快捷方式列表中删除指定的快捷方式并禁用这些快捷方式的任何固定副本。您还可以使用此方法的重载版本,它接受 CharSequence 作为自定义错误消息。然后,当用户尝试启动任何禁用的快捷方式时,就会出现该错误消息。

注意:如果您在更新应用时移除了应用的某些静态快捷方式,系统会自动禁用这些快捷方式。

【讨论】:

  • 禁用是没用的。用户看到了一个他不能再使用的快捷方式,那么为什么要使用它...您是否知道可能为此而生根的方式,或者用于使用旧 API 创建和删除快捷方式的方式?
  • @androiddeveloper 将您的应用程序限制为 root 用户以获得该功能真的值得吗?您禁用的消息可能只是声明“此功能不再可用。可以手动删除快捷方式。” -- 用户可以自己做。
  • @androiddeveloper 同样,即使您想使用 root 执行此操作,您也需要针对您想要支持的每个可能的启动器以不同的方式处理删除。系统不保存快捷方式数据,启动器保存。
  • 我的意思是通过之前的 API 创建和删除。我认为以某种方式从 Play 商店安装应用程序会使用不需要用户确认的 API 创建快捷方式。也许它是旧的不知何故。这也是为什么许多启动器可以选择为新安装的应用程序放置快捷方式,但它仅在从 Play 商店安装时有效,而不是通过普通 APK 文件安装时有效。
  • @androiddeveloper 游戏商店拥有授予它的特殊权限。它还可以自动启用“在其他应用程序之上绘制”权限,您必须手动启用从其他任何地方安装的应用程序。 AFAIK,甚至没有用于删除快捷方式的已弃用 API。只有在清除应用数据时才会删除快捷方式,因此您可以尝试模仿“应用卸载”系统广播,这将导致启动器删除您应用的所有快捷方式(您冷尝试添加回来)。简而言之,这是一个坏主意,您不应该这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-02
  • 1970-01-01
  • 2013-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多