Дублирование закрепленного ярлыка с помощью Менеджера ярлыков
Я пытаюсь создать закрепленный ярлык на главном экране моего использования ShortcutManager. Я могу создать закрепленный ярлык, используя следующий код:
Intent i = new Intent();
i.setAction(Intent.ACTION_VIEW);
i.setData(Uri.parse("www.google.com"));
if (ShortcutManagerCompat.isRequestPinShortcutSupported(context)){
ShortcutInfoCompat shortcutInfo = new ShortcutInfoCompat.Builder(context, "#1")
.setIntent(i)
.setShortLabel("label")
.setIcon(IconCompat.createWithResource(context, R.drawable.ic_launcher))
.build();
ShortcutManagerCompat.requestPinShortcut(context, shortcutInfo, null);
}else{
L.v("Shortcut", "Pinned shortcuts are not supported!");
}
Я сталкиваюсь с двумя проблемами:
- Нет проверки для дублирования ярлыков. Каждый раз, когда я нажимаю на кнопку, чтобы создать ярлык, он каждый раз создает ярлык, и домашний экран заполняется этими ярлыками. Есть ли способ проверить, существует ли ярлык, как:
Intent i = new Intent();
i.setAction(Intent.ACTION_VIEW);
i.setData(Uri.parse("www.google.com"));
Intent installer = new Intent(); installer.putExtra("android.intent.extra.shortcut.INTENT", i); installer.putExtra("android.intent.extra.shortcut.NAME", "Shortcut name"); installer.putExtra("android.intent.extra.shortcut.ICON_RESOURCE", Intent.ShortcutIconResource.fromContext(getApplicationContext() , R.drawable.ic_launcher));
installer.putExtra("duplicate", false);
installer.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
sendBroadcast(installer);
Проблема с этим фрагментом кода состоит в том, что он не работает в Android 8.0 и выше, но он корректно обрабатывает дублирование ярлыка, используя следующий код:-
installer.putExtra("duplicate", false);
Я хочу добиться того же, используя менеджер ярлыков
- Когда ярлык создается с помощью диспетчера ярлыков, значок дублируется, как
Я посмотрел на решение, представленное здесь, но пока не повезло:
Странное дублирование значков приложений в закрепленном ярлыке (Android O)
Есть идеи??
2 ответа
Вы можете получить все текущие ярлыки, позвонив
List<ShortcutInfo> currPinned = shortcutManager.getPinnedShortcuts();
затем добавить к Map
или Set
и перебрать их, и если он уже существует, не добавляйте его снова
if (currPinned != null) {
for (ShortcutInfo shortcut: currPinned) {
currPinnedMap.put(shortcut.getId(), shortcut);
}
}
....
//iterate over you "new shortcuts" and check if the present already
if (currPinnedMap.containsKey(id)) {
continue;
}
// add really new ones
fun isPinnedShortcutsExits(context: Context, id: String): Boolean {
return when {
Build.VERSION.SDK_INT >= 30 -> {
context.getSystemService(ShortcutManager::class.java)
.getShortcuts(ShortcutManager.FLAG_MATCH_PINNED)
.any { it.id == id }
}
Build.VERSION.SDK_INT >= 25 -> {
context.getSystemService(ShortcutManager::class.java)
.pinnedShortcuts
.any { it.id == id }
}
else -> false
}
}
или же
ShortcutManagerCompat.getShortcuts(this, ShortcutManagerCompat.FLAG_MATCH_PINNED)
.any { it.id == "xxx" }