如何获取特定应用程序的可用“应用快捷方式”?

13

背景

从 Android 的 API 25 开始,应用程序可以在启动器中长按它们提供额外的快捷方式:

enter image description here

问题

问题是,我找到的所有内容都是关于你的应用程序如何向启动器提供这些快捷方式的,但我找不到启动器如何获取它们列表的信息。

由于这是一个相当新的 API,大多数用户和开发人员甚至都不使用它,因此我找不到有关它的详细信息,尤其是因为我想搜索 API 使用的 "另一面"。

我尝试过的

我阅读了文档(例如这里)。我没有看到它被提到。只提到了其他应用程序的部分,但没有提到接收应用程序(启动器)。

问题

给定应用程序的包名称,如何使用新的 API 获取其所有 "应用程序快捷方式" 的列表?

是否可能使用它来请求从中创建一个固定的快捷方式?

2个回答

8

您需要创建启动器应用程序。之后,您可以查询packagemanager以获取特定包的shortcutinfo:

fun getShortcutFromApp(packageName: String): List<Shortcut> {
    val shortcutQuery = LauncherApps.ShortcutQuery()
    shortcutQuery.setQueryFlags(FLAG_MATCH_DYNAMIC or FLAG_MATCH_MANIFEST or FLAG_MATCH_PINNED)
    shortcutQuery.setPackage(packageName)
    return try {
        launcherApps.getShortcuts(shortcutQuery, Process.myUserHandle())
                .map { Shortcut(it.id, it.`package`, it.shortLabel.toString(), it) }
    } catch (e: SecurityException) {
        Collections.emptyList()
    }

这里可以找到一个完整的实现:

https://android.jlelse.eu/nhandling-shortcuts-when-building-an-android-launcher-5908d0bb50d2

该项目的Github链接:

https://github.com/nongdenchet/Shortcuts

LauncherApps是Android框架提供的一个类:

https://developer.android.com/reference/android/content/pm/LauncherApps.html

"用于检索当前用户和与当前用户可见的任何关联的托管配置文件的可启动活动列表的类,可以使用getProfiles()检索。主要用于启动器。应用程序可以查询每个用户配置文件。由于PackageManager不会为其他配置文件提供包广播,因此您可以在此处注册软件包更改。"


如果我的应用程序不是启动器应用程序,它将无法工作?还有,“Shortcut”类是什么?以及“launcherApps”?您的代码缺少运行所需的重要内容。而且您还没有回答我写的问题:是否可以创建固定的快捷方式? - android developer
根据文档,这是正确的。其余的代码在Github项目中。没意识到你有两个问题。 :) - dazza5000
请提供最少量的代码以使其正常工作。难道没有任何变通方法可以使其在没有启动器的情况下工作吗? - android developer
请参考以下链接以了解该问题:https://developer.android.com/reference/android/content/pm/LauncherApps.html#hasShortcutHostPermission() - dazza5000
真遗憾。请提供完整、精简的代码。 - android developer

1

你说的“如果你的应用是静态的”是什么意思?另外,问题是如何查询其他应用程序的快捷方式。而且,由于某些原因,我无法导入它:https://github.com/googlesamples/android-AppShortcuts/issues/16 。我只想在这里看到完整、最小化的实现方式。 - android developer
请查看我的更新答案,这是一个简单的实现示例。 - krishank Tripathi
我并没有询问如何为启动器创建它们,而是询问如何查询任何应用程序的相关信息。例如,Google日历有“新提醒”和“新事件”。问题是,如果我设置Google日历包名称(“com.google.android.calendar”)的输入,则查询的输出将是这两个应用程序快捷方式。 - android developer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接