Как удалить закрепленные ярлыки?
Фон
Начиная с 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);
Docs:
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.
Пока что этот API кажется очень ограничивающим для меня, так как имеет много недостатков:
- Созданное изображение значка не может быть создано из идентификатора ресурса.
- На панели запуска созданный значок имеет крошечный значок приложения, которое его создало.
- Значок нельзя удалить с помощью API (только отключен), поэтому, если вы создали тот, который указывает на другое приложение, и это приложение было удалено, вы не сможете его удалить.
- Создание не может быть в фоновом режиме, так как для этого требуется диалог подтверждения. Он также не может быть создан в партии. Только один за другим.
- Все прикрепленные ярлыки, созданные вашим приложением, будут удалены, если ваше приложение было удалено.
Итак, мой вопрос сейчас:
Есть ли способ создать и удалить ярлык, используя предыдущий API, используя команду adb, с root при необходимости?
Можно ли удалить определенные закрепленные ярлыки с помощью команды adb, с правами root, если это необходимо?
1 ответ
disableShortcuts() - лучшее, что вы можете сделать. Он покажет пользователю специальное сообщение об ошибке, когда он попытается выбрать отключенный ярлык.
Ограничения на ярлыки Несмотря на то, что вы можете публиковать до пяти ярлыков (статические и динамические сочетания) одновременно для своего приложения, большинство программ запуска могут отображать только четыре.
Тем не менее, нет ограничения на количество закрепленных ярлыков для вашего приложения, которые могут создавать пользователи. Даже если ваше приложение не может удалить закрепленные ярлыки, оно все равно может их отключить.
Поскольку ваше приложение и его пользователи могут закреплять ярлыки на панели запуска устройства, возможно, что эти закрепленные ярлыки могут направлять пользователей на действия в вашем приложении, которые устарели или более не существуют. Чтобы справиться с этой ситуацией, вы можете отключить ярлыки, которые пользователи не должны выбирать, вызывая disableShortcuts(), который удаляет указанные ярлыки из списка статических и динамических ярлыков и отключает любые закрепленные копии этих ярлыков. Вы также можете использовать перегруженную версию этого метода, которая принимает CharSequence в качестве пользовательского сообщения об ошибке. Это сообщение об ошибке появляется, когда пользователи пытаются запустить любой отключенный ярлык.
Примечание. Если вы удалите некоторые из статических ярлыков вашего приложения при обновлении приложения, система автоматически отключит эти ярлыки.