Android 启动静态应用快捷方式
Android start static app shortcut
过去几天我一直在尝试弄清楚如何启动 Android API 25 中添加的应用程序快捷方式,并且我取得了一定的成功。启动一些快捷方式,例如 Google Play Music's work without problem 我猜是因为这些快捷方式正在使用 action.MAIN 和 [=29= 启动活动] 或导出,但其他活动抛出 "java.lang.SecurityException: Permission Denial: starting Intent" 这似乎也很合理。这似乎是可行的,因为像素启动器、芝麻快捷方式等应用程序可以做到这一点,必须有一些特殊的意图标志或其他东西。我什至尝试在我的应用程序中捕获快捷方式意图并复制它但没有成功
这是我如何为 Google Chrome 的 "New Tab" 快捷方式执行此操作的示例:
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)
我从 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 关于此主题的工作,他的文章 here and the corresponding repository here。
过去几天我一直在尝试弄清楚如何启动 Android API 25 中添加的应用程序快捷方式,并且我取得了一定的成功。启动一些快捷方式,例如 Google Play Music's work without problem 我猜是因为这些快捷方式正在使用 action.MAIN 和 [=29= 启动活动] 或导出,但其他活动抛出 "java.lang.SecurityException: Permission Denial: starting Intent" 这似乎也很合理。这似乎是可行的,因为像素启动器、芝麻快捷方式等应用程序可以做到这一点,必须有一些特殊的意图标志或其他东西。我什至尝试在我的应用程序中捕获快捷方式意图并复制它但没有成功
这是我如何为 Google Chrome 的 "New Tab" 快捷方式执行此操作的示例:
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)
我从 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 关于此主题的工作,他的文章 here and the corresponding repository here。