Android запускает статический ярлык приложения

В последние несколько дней я пытался выяснить, как запустить ярлыки приложений, добавленные в Android API 25, и я был несколько успешным. Запуск некоторых ярлыков, таких как работа Google Play Музыки без проблем, я предполагаю, потому что эти ярлыки запускают действия с действием. MAIN и category.LAUNCHER или экспортируются, но другие действия вызывают «java.lang.SecurityException: Permission Denial: start Intent», который кажется также разумно. Это кажется сногсшибательным, поскольку такие приложения, как Pixel Launcher, Sesame Shortcuts и т. Д., Могут сделать это, должен быть какой-то особый флаг намерения или что-то в этом роде. Я даже попытался поймать ярлык в моем приложении и воспроизвести его, но не успел

Вот пример того, как я это делаю для ярлыка «Новая вкладка» в Google Chrome:

val componentName = ComponentName("com.android.chrome", "org.chromium.chrome.browser.LauncherShortcutActivity") val intent = Intent(action) intent.component = componentName intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT or Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_TASK_ON_HOME) startActivity(intent) 

Я получил эти значения из metaData activityInfo, которые могут быть получены с помощью PackageManager

Вот код для перечисления всех доступных ярлыков, а затем запуск любого первого ярлыка (как пример):

 val launcherApps = context.getSystemService(Context.LAUNCHER_APPS_SERVICE) as LauncherApps val shortcutQuery = LauncherApps.ShortcutQuery() // Set these flags to match your use case, for static shortcuts only, // use FLAG_MATCH_MANIFEST on its own. shortcutQuery.setQueryFlags(LauncherApps.ShortcutQuery.FLAG_MATCH_DYNAMIC or LauncherApps.ShortcutQuery.FLAG_MATCH_MANIFEST or LauncherApps.ShortcutQuery.FLAG_MATCH_PINNED) shortcutQuery.setPackage(packageName) val shortcuts = try { launcherApps.getShortcuts(shortcutQuery, Process.myUserHandle()) } catch (e: SecurityException) { // This exception will be thrown if your app is not the default launcher Collections.emptyList<ShortcutInfo>() } // Lists all shortcuts from the query shortcuts.forEach { Log.d(TAG, "Shortcut found ${it.`package`}, ${it.id}") } // Starts the first shortcut, as an example (this of course is not safe like this, // it will crash if the list is empty, etc). val shortcut = shortcuts[0] launcherApps.startShortcut(shortcut.`package`, shortcut.id, null, null, Process.myUserHandle()) 

Этот код предполагает, что у вас есть переменная с именем context типа Context и переменная с именем packageName типа String откуда-то.


Кредиты: все это основано на работе Quan Vu по этой теме, его статье здесь и соответствующем репозитории здесь .

Intereting Posts
Методы Котлина с Vararg как первый параметр Как написать тест котлинского блока с тест-котлин? Как загрузить URL-адрес внутри WebView с помощью Android Kotlin? Как я могу создать «forEach», который возвращает объект, который является приемником для функции потребления? Как помещать выражение лямбда после параметров на mapTo вызвать юридический синтаксис? Закрыть / Скрыть SoftinputKeyboard в kotlin Аннотации getAnnotation для Java, используемые для метода Kotlin, возвращают null Получить ссылку на класс из функции верхнего уровня в kotlin Ошибка DataBinding в android Spinner Какова наиболее вероятная причина исключений, загадочно избегающих блока try-catch в этом случае? Ошибка: выполнение выполнено для задачи ': app: javaPreCompileDebug'. > java.io.IOException: не удалось удалить annotationProcessors.json Почему я не вижу компонент вспомогательного объекта расширенного класса? Подавать favicon.ico и другие статические файлы с помощью VertX Как написать рекурсивные сопрограммы в котлин Ошибка внутреннего компилятора Android Studio kaptDebugKoltin