Android 启动器需要哪些权限才能使用 运行 快捷方式

Which permissions does an Android launcher need to run shortcuts

我正在编写一个 Android 启动器,它不支持小部件,但它支持快捷方式。 AOSP 提供的快捷方式之一是直接拨号,我的启动器需要 android.permission.CALL_PHONE 权限。我的问题是,是否需要添加任何其他权限以允许所有可能的快捷方式,甚至是第三方应用程序提供的快捷方式?

牛轧糖快捷方式(API 25 级以上)

add/launch 快捷方式没有标准权限。如果您应用的目标 api 级别为 25+,您可以通过 .xml 元数据使用 ShortcutManager 或静态快捷方式。

https://developer.android.com/guide/topics/ui/shortcuts.html

旧版快捷方式(低于 API 级别 25)

如果您想在没有用户交互的情况下安装和使用 Legacy 快捷方式,您需要声明 INSTALL SHORTCUT 权限。

旧版快捷方式使用 Intent Action:

为 Launcher 创建快捷方式:"android.intent.action.CREATE_SHORTCUT"

在启动器上安装快捷方式:"com.android.launcher.action.INSTALL_SHORTCUT"

AndroidManifest.xml 所需权限:

<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />

在上面搜索意图操作时,您可以找到更多资源。

这不是一个明确的答案,因为我在任何地方都找不到明确说明,但似乎只有 phone 调用快捷方式需要权限,所以 CALL_PHONE 权限是唯一的一个你需要的,启动快捷方式。

AOSP 启动器只检查 CALL_PHONE 权限。资料来源:https://android.googlesource.com/platform/packages/apps/Launcher3/+/master/src/com/android/launcher3/Launcher.java#1630

我找不到任何其他类型的需要权限的快捷方式。

没有办法提前知道这一点。某些应用程序只是假定其快捷方式的调用者具有某些权限(例如,某些系统启动器快捷方式通常仅在系统启动器本身中有效,因为它们有时需要一些自定义权限)。

一般来说,任何提供快捷方式的应用程序,应该 运行代码本身而不是调用应用程序,以确保存在所需的权限,但显然在某些应用程序中并非如此(尤其是在启动器中)。

我在我的一个应用程序中时不时地遇到这个问题并捕获异常并告诉用户,所选的快捷方式不支持其他应用程序并且以错误的方式实现。

示例 - 呼叫工作人员和不工作人员的快捷方式

例如考虑提供直接呼叫快捷方式的第三方应用程序。它可以通过两种方式处理:

走错路

它可以 return 如下所示的意图:

Intent intent = new Intent();
Intent launchIntent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + number);
intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, launchIntent);
...

只有具有操作调用权限的应用才能运行此意图

正确的方法

应用程序知道调用者可能没有调用 phone 权限,因此它不会直接 ​​return 直接 phone 调用意图,而是自定义一个它像

这样处理自己
Intent.ShortcutIconResource icon = Intent.ShortcutIconResource.fromContext(this, R.mipmap.icon);
Intent intent = new Intent();
Intent launchIntent = new Intent(this, MyPhoneCallActivity.class);
launchIntent.putExtra("number", number);
intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, launchIntent);
intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(pause != null ? (pause ? R.string.shortcut_pause : R.string.shortcut_resume) : R.string.shortcut_toggle_pause_resume));
intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, icon);

如果调用者执行快捷方式,MyPhoneCallActivity 将启动 - 这 运行 在应用程序本身内,并拥有快捷方式提供者的所有权限。这个 activity 然后可以简单地执行 Intent.ACTION_CALL 意图本身并在之后完成。这样,调用应用程序不需要任何特殊权限。通过 activity 的解决方法是解决此问题的一种有效方法。