Android 如何删除固定的快捷方式? 背景

Android 如何删除固定的快捷方式? 背景,android,android-8.0-oreo,pinned-shortcut,Android,Android 8.0 Oreo,Pinned Shortcut,从Android O开始,可以创建固定的快捷方式,该快捷方式(在受支持的启动器上)会显示一个对话框,以确认快捷方式的创建: ShortcutInfoCompat pinShortcutInfo = new ShortcutInfoCompat.Builder(context, uniqueShortcutId) .setShortLabel(label) .setIntent(shortcut

从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);
文件:

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

在这种情况下,我希望能够删除它

我试过的 我认为在下一段代码中这是可能的,但事实并非如此,因为它可能是关于动态快捷方式的,这是另外一回事:

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);
ShortcutManager ShortcutManager=(ShortcutManager)getSystemService(快捷方式服务);
最终列表pinnedShortcuts=shortcutManager.getPinnedShortcuts();
final ArrayList shortcutIdsToRemove=新ArrayList();
for(快捷键fo pinnedShortcut:pinnedShortcuts){
final-Intent-pinnedShortcutivent=pinnedShortcut.getIntent();
shortcutIdsToRemove.add(pinnedShortcut.getId());
}
shortcutManager.removeDynamicShortcuts(shortcutIdsToRemove);
//这也不起作用:shortcutManager.disableShortcuts(shortcutIdsToRemove);
问题 如何删除固定的快捷方式?有可能吗


更新:正如谷歌提到的,这似乎是不可能的

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

  • 无法从资源ID创建创建的图标图像
  • 在启动器上,创建的图标有一个创建它的应用程序的小图标
  • 无法通过API删除图标(仅禁用),因此如果您创建了一个指向另一个应用的图标,并且此应用已删除,则您将无法删除它
  • 创建不能在后台进行,因为它需要一个确认对话框。它也不能批量创建。只是一个接一个
  • 如果删除了应用,则将删除应用创建的所有固定快捷方式
  • 所以,我现在的问题是:

  • 是否有任何方法可以使用以前的API、adb命令和root(如果需要)创建和删除快捷方式

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

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

    从:

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

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

    :

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

    注意:如果在更新应用程序时删除了一些应用程序的静态快捷方式,系统会自动禁用这些快捷方式


    你发现了吗?@AlexandruPetrescu没有。遗憾的是没有…@AlexandruPetrescu我已经给出了我认为是这个问题最好的答案。请在宽限期结束前查看并奖励赏金。禁用是毫无用处的。用户看到一个他不能再使用的快捷方式,为什么要让它。。。你知道一种根目录的方式吗?或者使用旧的API创建和删除快捷方式?@androiddeveloper将你的应用程序限制为根目录用户是否真的值得?您被禁用的消息可能会简单地表示“此功能不再可用。快捷方式可能会被手动删除。”--用户可以自己删除。@androiddeveloper此外,即使您希望使用root用户来执行此操作,您也需要为您想要支持的每个可能的启动器以不同的方式处理删除操作。系统不保存快捷方式数据,启动器保存。我的意思是通过以前的API创建和删除。我认为,从Play Store安装应用程序时,会使用一个不需要用户确认的API创建快捷方式。也许是旧的。这也是为什么许多启动程序可以为新安装的应用程序设置快捷方式的原因,但只有在从Play Store安装应用程序时才有效,而不是通过普通APK文件安装。@androiddeveloper Play Store对其授予了特殊权限。它还可以自动启用“在其他应用之上绘制”权限,您必须手动为从其他任何位置安装的应用启用该权限。顺便说一句,甚至没有一个不推荐使用的用于删除快捷方式的API。只有在清除应用程序数据时,才会删除快捷方式,因此您可以尝试模拟“应用程序卸载”系统广播,这将导致启动器删除所有应用程序的快捷方式(您尝试重新添加)。简而言之,这是个坏主意,你不应该这么做。