I am writing an Android launcher that does not support widgets, but it does support shortcuts. One of the shortcuts provided by AOSP is Direct dial, and my launcher needs the android.permission.CALL_PHONE permission for that. My question is, are there any other permissions that I need to add, to allow all possible shortcuts, even those provided by third party apps?
3 回答
这不是一个确定的答案,因为我在任何地方都找不到明确的说明,但似乎只有电话快捷方式需要权限,因此 CALL_PHONE 权限是您启动快捷方式所需的唯一权限。
AOSP 启动器仅检查 CALL_PHONE 权限。来源:https ://android.googlesource.com/platform/packages/apps/Launcher3/+/master/src/com/android/launcher3/Launcher.java#1630
我找不到任何其他需要权限的快捷方式。
牛轧糖捷径(API 25+ 级)
添加/启动快捷方式没有标准权限。如果您的应用的目标 API 级别为 25+,您可以通过 .xml 元数据使用 ShortcutManager 或静态快捷方式。
https://developer.android.com/guide/topics/ui/shortcuts.html
对于旧版快捷方式(API 级别 25 以下)
如果您想在没有用户交互的情况下安装和使用 Legacy 快捷方式,您需要声明 INSTALL SHORTCUT 权限。
旧版快捷方式使用 Intent Action:
为启动器创建快捷方式:“android.intent.action.CREATE_SHORTCUT”
在启动器上安装快捷方式:“com.android.launcher.action.INSTALL_SHORTCUT”
AndroidManifest.xml 所需的权限:
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
当您在上面搜索意图操作时,您可以找到更多资源。
没有办法提前知道这一点。一些应用程序只是假设其快捷方式的调用者具有某些权限(例如,某些系统启动器快捷方式通常仅在系统启动器本身中起作用,因为它们有时需要一些自定义权限)。
通常,任何提供快捷方式的应用程序都应该运行代码本身而不是调用应用程序,以确保存在所需的权限,但显然在某些应用程序中并非如此(尤其是在启动器中)。
我不时在我的应用程序中遇到这个问题并捕获异常并告诉用户,所选快捷方式不支持其他应用程序并且以错误的方式实现。
示例 - 呼叫有效而无效的人的快捷方式
例如,考虑提供直接呼叫快捷方式的第三方应用程序。它可以通过两种方式处理:
错误道
它可以返回如下意图:
Intent intent = new Intent();
Intent launchIntent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + number);
intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, launchIntent);
...
此意图只能由具有操作调用权限的应用程序运行
正确的方法
该应用程序知道,呼叫者可能没有呼叫电话权限,因此它不会直接返回直接电话呼叫意图,而是它自己处理的自定义意图,例如
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
则将启动 - 这在应用程序本身内部运行并具有快捷方式提供程序的所有权限。然后,此活动可以简单地执行Intent.ACTION_CALL
意图本身并在之后自行完成。这样,调用应用程序不需要任何特殊权限。通过活动的解决方法是解决此问题的一种有效方法。