我正在编写一个不支持小部件的Android启动器,但它确实支持快捷方式。 AOSP提供的快捷方式之一是直接拨号,我的启动器需要android.permission.CALL_PHONE权限。我的问题是,我是否需要添加任何其他权限,以允许所有可能的快捷方式,甚至是第三方应用程序提供的快捷方式?
NOUGAT SHORTCUTS(API LEVEL 25+)
没有添加/启动快捷方式的标准权限。如果您的应用的目标api级别为25+,则可以通过.xml元数据使用ShortcutManager或静态快捷方式。
https://developer.android.com/guide/topics/ui/shortcuts.html
对于遗产快捷方式(低于API等级25)
如果要在没有用户交互的情况下安装和使用旧版快捷方式,则需要声明INSTALL SHORTCUT权限。
旧版快捷方式使用Intent Action:
为Launcher创建快捷方式:“android.intent.action.CREATE_SHORTCUT”
在Launcher上安装快捷方式:“com.android.launcher.action.INSTALL_SHORTCUT”
AndroidManifest.xml上的必需权限:
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
搜索上述意图操作时,您可以找到更多资源。
这不是一个明确的答案,因为我无法在任何地方找到明确说明,但似乎只有电话呼叫快捷方式需要权限,因此CALL_PHONE权限是您启动快捷方式所需的唯一权限。
AOSP启动程序仅检查CALL_PHONE权限。资料来源:https://android.googlesource.com/platform/packages/apps/Launcher3/+/master/src/com/android/launcher3/Launcher.java#1630
我无法找到任何其他类型的需要权限的快捷方式。
没有办法提前知道这一点。一些应用程序只是假设其快捷方式的调用者具有一些权限(例如,某些系统启动程序快捷方式通常仅在系统启动程序本身中工作,因为它们有时需要一些自定义权限)。
通常,任何提供快捷方式的应用程序都应该运行代码本身而不是调用应用程序以确保所需的权限存在,但显然在某些应用程序中并非如此(特别是在发射器中)。
我时不时地在我的应用程序中遇到此问题并捕获异常并告诉用户,所选快捷方式不支持其他应用程序并且以错误的方式实现。
示例 - 调用有效且无效的人的快捷方式
例如。想想提供直接呼叫快捷方式的第三方应用程序。它可以通过两种方式处理:
错误道
它可以返回如下的意图:
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
意图本身并在之后完成。这样,调用应用程序不需要任何特殊权限。通过活动的解决方法是解决此问题的一种解决方案。