Какие разрешения нужны для запуска Android-ярлыков?
Я пишу программу запуска Android, которая не поддерживает виджеты, но поддерживает ярлыки. Одним из ярлыков, предоставляемых AOSP, является прямой набор номера, и для этого моей программе запуска требуется разрешение android.permission.CALL_PHONE. У меня вопрос, есть ли какие-либо другие разрешения, которые мне нужно добавить, чтобы разрешить все возможные ярлыки, даже те, которые предоставляются сторонними приложениями?
2 ответа
Это не окончательный ответ, поскольку я нигде не смог найти этого явно заявленного, но кажется, что только ярлыки телефонных звонков требуют разрешения, поэтому разрешение 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
намерение себя и заканчивает себя потом. Таким образом, вызывающему приложению не требуется никаких специальных разрешений. Обходной путь с помощью действия является одним из решений этой проблемы, которая работает.
ДЛЯ ШУГОВЫХ РЕШЕТОК NOUGAT (УРОВЕНЬ API 25+)
Нет стандартного разрешения на добавление / запуск ярлыков. Если целевой уровень API вашего приложения составляет 25+, вы можете использовать ShortcutManager или статический ярлык через XML-метаданные.
https://developer.android.com/guide/topics/ui/shortcuts.html
Для коротких замыканий на LEGACY (НИЖЕ УРОВЕНЬ API 25)
Если вы хотите установить и использовать устаревшие ярлыки без участия пользователя, вам необходимо объявить разрешение INSTALL SHORTCUT.
Устаревшие ярлыки используют намеренное действие:
Создать ярлык для 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" />
Вы можете найти больше ресурсов при поиске намеренных действий выше.