如何获取特定应用的可用App Shortcuts?能否基于其创建Pinned Shortcut?
获取其他应用的App Shortcuts列表并创建Pinned Shortcut
嗨,作为启动器开发者,你遇到的这个反向获取App Shortcuts的问题确实比较冷门——官方文档大多聚焦在应用如何提供快捷方式,很少提及启动器的接收逻辑。我来一步步帮你解决:
一、获取指定应用的全部App Shortcuts列表
要拿到其他应用的快捷方式,核心要用到LauncherApps类(API 25+引入),这是系统专门给启动器类应用开放的服务,用于访问第三方应用的快捷方式、应用元数据等。
1. 权限准备
- API 33及以上:如果要获取所有应用的快捷方式,需在Manifest中声明
android.permission.QUERY_ALL_PACKAGES;如果只针对特定包,更安全的做法是声明android.permission.QUERY_PACKAGE_CONTENTS并指定目标包名。 - 启动器应用还需声明
android.permission.BIND_APP_LAUNCHER,确保系统识别你的应用为合法启动器。
2. 代码实现
// 获取LauncherApps系统服务实例 LauncherApps launcherApps = context.getSystemService(LauncherApps.class); // 构建快捷方式查询条件 ShortcutQuery query = new ShortcutQuery(); query.setPackageName("com.target.app.package"); // 替换为目标应用的包名 // 匹配所有类型的快捷方式:动态生成、Manifest静态定义、已固定到桌面的 query.setQueryFlags(ShortcutQuery.FLAG_MATCH_DYNAMIC | ShortcutQuery.FLAG_MATCH_MANIFEST | ShortcutQuery.FLAG_MATCH_PINNED); // 执行查询,拿到快捷方式列表 List<LauncherApps.ShortcutInfo> shortcutList = launcherApps.getShortcuts(query, null); // 遍历处理每个快捷方式信息 for (LauncherApps.ShortcutInfo info : shortcutList) { String shortcutId = info.getId(); CharSequence shortLabel = info.getShortLabel(); Intent launchIntent = info.getIntent(); // 还可以获取长标签、图标资源、是否允许固定等信息 }
⚠️ 注意:如果目标应用没有对外暴露任何快捷方式,返回的列表会是空的;部分应用可能限制只有默认启动器才能获取它们的快捷方式,此时需要确保你的应用是系统默认启动器。
二、基于获取到的快捷方式创建Pinned Shortcut
拿到LauncherApps.ShortcutInfo后,你可以通过ShortcutManager(或Jetpack的ShortcutManagerCompat做兼容)请求将快捷方式固定到桌面。
代码实现
// 获取ShortcutManager实例 ShortcutManager shortcutManager = context.getSystemService(ShortcutManager.class); // 从获取到的快捷方式信息构建可固定的ShortcutInfoCompat LauncherApps.ShortcutInfo sourceShortcut = ...; // 之前查询到的目标快捷方式 ShortcutInfoCompat pinnedShortcut = new ShortcutInfoCompat.Builder(context, sourceShortcut.getId()) .setShortLabel(sourceShortcut.getShortLabel()) .setLongLabel(sourceShortcut.getLongLabel()) .setIntent(sourceShortcut.getIntent()) .setIcon(IconCompat.createWithResource(context, R.drawable.your_custom_icon)) // 也可以复用原快捷方式的图标 .build(); // 请求固定快捷方式,系统会弹出用户确认对话框 ShortcutManagerCompat.requestPinShortcut(context, pinnedShortcut, null);
注意事项
- 固定操作必须经过用户确认,系统会自动弹出确认对话框,无法静默完成。
- API 26及以上无需声明
INSTALL_SHORTCUT权限,直接调用requestPinShortcut即可。
额外提示
- 测试时建议选择明确支持App Shortcuts的应用(比如微信、Google Maps),避免因目标应用无快捷方式导致测试失败。
- Kotlin版本的代码逻辑和Java一致,仅需调整语法细节即可。
内容的提问来源于stack exchange,提问作者android developer
相关产品推荐
相关产品推荐

