Интент позволяет запустить активность в другом приложении, описав желаемое действие, например, «просмотреть карту» или «сделать снимок», в объекте Intent . Этот тип интента называется неявным интентом, поскольку он не указывает компонент приложения для запуска, а вместо этого определяет действие и предоставляет некоторые данные для его выполнения.
При вызове startActivity() или startActivityForResult() и передаче неявного намерения система определяет приложение, способное его обработать, и запускает соответствующее Activity . Если существует несколько приложений, способных обработать данное намерение, система отображает пользователю диалоговое окно для выбора приложения.
На этой странице описаны несколько неявных интентов, которые можно использовать для выполнения распространенных действий, сгруппированных по типу приложения, обрабатывающего интент. В каждом разделе также показано, как создать фильтр интентов , чтобы сообщить о возможности вашего приложения выполнять данное действие.
Внимание: если на устройстве нет приложений, способных принимать неявный интент, приложение аварийно завершит работу при вызове startActivity() . Чтобы сначала убедиться, что существует приложение, способное принимать интент, вызовите resolveActivity() для вашего объекта Intent . Если результат не равен null, значит, существует как минимум одно приложение, способное обработать интент, и вызов startActivity() безопасен. Если результат равен null, не используйте интент и, если возможно, отключите функцию, которая его вызывает.
Если вы не знакомы с тем, как создавать интенты или фильтры интентов, сначала прочтите разделы «Интенты» и «Фильтры интентов» .
Чтобы узнать, как запускать перечисленные на этой странице интенты с вашего хоста разработки, см. раздел «Проверка интентов с помощью Android Debug Bridge» .
Google Голосовые действия
Функция Google Voice Actions запускает некоторые из перечисленных на этой странице интентов в ответ на голосовые команды. Для получения дополнительной информации см. раздел «Начало работы с системными голосовыми действиями» .
Будильник
Ниже перечислены типичные действия для приложений-будильников, включая информацию, необходимую для создания фильтра намерений, который будет сообщать о возможности вашего приложения выполнять каждое из этих действий.
Создать будильник
Для создания нового будильника используйте действие ACTION_SET_ALARM и укажите подробные сведения о будильнике, такие как время и сообщение, используя следующие дополнительные параметры.
Примечание: В Android 2.3 (уровень API 9) и ниже доступны только дополнительные функции отображения часов, минут и сообщений. Остальные функции доступны в более высоких версиях платформы.
- Действие
-
ACTION_SET_ALARM - URI данных
- Никто
- Тип MIME
- Никто
- Дополнительные материалы
-
EXTRA_HOUR - Час будильника.
-
EXTRA_MINUTES - Минуты до срабатывания будильника.
-
EXTRA_MESSAGE - Пользовательское сообщение для идентификации сигнала тревоги.
-
EXTRA_DAYS -
ArrayListсодержащий все дни недели, в которые повторяется этот будильник. Каждый день должен быть объявлен целочисленным значением из классаCalendar, например,MONDAY.Если это разовый будильник, не указывайте эту дополнительную опцию.
-
EXTRA_RINGTONE -
content:URI, указывающий мелодию звонка для использования с будильником, илиVALUE_RINGTONE_SILENTдля отсутствия мелодии звонка.Чтобы использовать мелодию звонка по умолчанию, не указывайте этот дополнительный параметр.
-
EXTRA_VIBRATE - Логическое значение, указывающее, следует ли вибрировать при срабатывании этого сигнала тревоги.
-
EXTRA_SKIP_UI - Логическое значение, указывающее, должно ли отвечающее приложение пропускать свой пользовательский интерфейс при установке будильника. Если true, приложение должно пропустить любой подтверждающий интерфейс и установить указанный будильник.
-
Пример намерения:
Котлин
fun createAlarm(message: String, hour: Int, minutes: Int) { val intent = Intent(AlarmClock.ACTION_SET_ALARM).apply { putExtra(AlarmClock.EXTRA_MESSAGE, message) putExtra(AlarmClock.EXTRA_HOUR, hour) putExtra(AlarmClock.EXTRA_MINUTES, minutes) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void createAlarm(String message, int hour, int minutes) { Intent intent = new Intent(AlarmClock.ACTION_SET_ALARM) .putExtra(AlarmClock.EXTRA_MESSAGE, message) .putExtra(AlarmClock.EXTRA_HOUR, hour) .putExtra(AlarmClock.EXTRA_MINUTES, minutes); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
Для вызова интента ACTION_SET_ALARM ваше приложение должно иметь разрешение SET_ALARM :
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
Пример фильтра намерений:
<activity ...> <intent-filter> <action android:name="android.intent.action.SET_ALARM" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
Создать таймер
Для создания таймера обратного отсчета используйте действие ACTION_SET_TIMER и укажите параметры таймера, такие как продолжительность, используя следующие дополнительные параметры.
Примечание: Этот интент доступен в Android 4.4 (уровень API 19) и выше.
- Действие
-
ACTION_SET_TIMER - URI данных
- Никто
- Тип MIME
- Никто
- Дополнительные материалы
-
EXTRA_LENGTH - Длительность таймера в секундах.
-
EXTRA_MESSAGE - Пользовательское сообщение для идентификации таймера.
-
EXTRA_SKIP_UI - Логическое значение, указывающее, должно ли отвечающее приложение пропускать свой пользовательский интерфейс при установке таймера. Если true, приложение должно пропустить любое подтверждающее окно интерфейса и запустить указанный таймер.
-
Пример намерения:
Котлин
fun startTimer(message: String, seconds: Int) { val intent = Intent(AlarmClock.ACTION_SET_TIMER).apply { putExtra(AlarmClock.EXTRA_MESSAGE, message) putExtra(AlarmClock.EXTRA_LENGTH, seconds) putExtra(AlarmClock.EXTRA_SKIP_UI, true) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void startTimer(String message, int seconds) { Intent intent = new Intent(AlarmClock.ACTION_SET_TIMER) .putExtra(AlarmClock.EXTRA_MESSAGE, message) .putExtra(AlarmClock.EXTRA_LENGTH, seconds) .putExtra(AlarmClock.EXTRA_SKIP_UI, true); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
Для вызова интента ACTION_SET_TIMER ваше приложение должно иметь разрешение SET_ALARM :
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
Пример фильтра намерений:
<activity ...> <intent-filter> <action android:name="android.intent.action.SET_TIMER" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
Показать все оповещения
Чтобы отобразить список тревожных сигналов, используйте действие ACTION_SHOW_ALARMS .
Хотя не многие приложения используют этот интент, поскольку он в основном применяется системными приложениями, любое приложение, выполняющее функцию будильника, может реализовать этот фильтр интента и ответить, отобразив список текущих будильников.
Примечание: Этот интент доступен в Android 4.4 (уровень API 19) и выше.
- Действие
-
ACTION_SHOW_ALARMS - URI данных
- Никто
- Тип MIME
- Никто
Пример фильтра намерений:
<activity ...> <intent-filter> <action android:name="android.intent.action.SHOW_ALARMS" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
Календарь
Добавление события — распространенное действие для приложений-календарей. Создайте фильтр намерений, чтобы сообщить о возможности вашего приложения выполнять это действие, используя информацию из следующего раздела.
Добавить событие в календарь
Чтобы добавить новое событие в календарь пользователя, используйте действие ACTION_INSERT и укажите URI данных с помощью Events.CONTENT_URI . Затем вы можете указать различные детали события, используя следующие дополнительные параметры.
- Действие
-
ACTION_INSERT - URI данных
-
Events.CONTENT_URI - Тип MIME
-
"vnd.android.cursor.dir/event" - Дополнительные материалы
-
EXTRA_EVENT_ALL_DAY - Логическое значение, указывающее, является ли это мероприятие мероприятием на весь день.
-
EXTRA_EVENT_BEGIN_TIME - Время начала события (миллисекунды с начала эпохи).
-
EXTRA_EVENT_END_TIME - Время окончания события (миллисекунды с начала эпохи).
-
TITLE - Название мероприятия.
-
DESCRIPTION - Описание мероприятия.
-
EVENT_LOCATION - Место проведения мероприятия.
-
EXTRA_EMAIL - Список адресов электронной почты, разделенных запятыми, с указанием приглашенных лиц.
Множество дополнительных деталей событий можно указать, используя константы, определенные в классе
CalendarContract.EventsColumns.-
Пример намерения:
Котлин
fun addEvent(title: String, location: String, begin: Long, end: Long) { val intent = Intent(Intent.ACTION_INSERT).apply { data = Events.CONTENT_URI putExtra(Events.TITLE, title) putExtra(Events.EVENT_LOCATION, location) putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, begin) putExtra(CalendarContract.EXTRA_EVENT_END_TIME, end) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void addEvent(String title, String location, long begin, long end) { Intent intent = new Intent(Intent.ACTION_INSERT) .setData(Events.CONTENT_URI) .putExtra(Events.TITLE, title) .putExtra(Events.EVENT_LOCATION, location) .putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, begin) .putExtra(CalendarContract.EXTRA_EVENT_END_TIME, end); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
Пример фильтра намерений:
<activity ...> <intent-filter> <action android:name="android.intent.action.INSERT" /> <data android:mimeType="vnd.android.cursor.dir/event" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
Камера
Ниже перечислены распространенные действия для приложений камеры, включая информацию, необходимую для создания фильтра намерений, который будет рекламировать способность вашего приложения выполнять каждое из этих действий.
Сделайте снимок или видео и верните его.
Чтобы открыть приложение камеры и получить полученное фото или видео, используйте действие ACTION_IMAGE_CAPTURE или ACTION_VIDEO_CAPTURE . Также укажите URI-адрес, куда вы хотите сохранить фото или видео, в параметре EXTRA_OUTPUT .
- Действие
-
ACTION_IMAGE_CAPTUREили
ACTION_VIDEO_CAPTURE - Схема URI данных
- Никто
- Тип MIME
- Никто
- Дополнительные материалы
-
EXTRA_OUTPUT - URI-адрес, по которому приложение камеры сохраняет фото- или видеофайл (в виде объекта
Uri).
-
Когда приложение камеры успешно возвращает фокус на ваше действие — другими словами, ваше приложение получает обратный вызов onActivityResult() — вы можете получить доступ к фотографии или видео по URI, указанному вами со значением EXTRA_OUTPUT .
Примечание: При использовании ACTION_IMAGE_CAPTURE для захвата фотографии камера может также вернуть уменьшенную копию или миниатюру фотографии в результирующем Intent , сохраненную в виде Bitmap в дополнительном поле с именем "data" .
Пример намерения:
Котлин
const val REQUEST_IMAGE_CAPTURE = 1 val locationForPhotos: Uri = ... fun capturePhoto(targetFilename: String) { val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE).apply { putExtra(MediaStore.EXTRA_OUTPUT, Uri.withAppendedPath(locationForPhotos, targetFilename)) } if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE) } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == Activity.RESULT_OK) { val thumbnail: Bitmap = data.getParcelableExtra("data") // Do other work with full size photo saved in locationForPhotos. ... } }
Java
static final int REQUEST_IMAGE_CAPTURE = 1; static final Uri locationForPhotos; public void capturePhoto(String targetFilename) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.withAppendedPath(locationForPhotos, targetFilename)); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { Bitmap thumbnail = data.getParcelableExtra("data"); // Do other work with full size photo saved in locationForPhotos. ... } }
Для этого при работе с Android 12 (уровень API 31) или выше, обратитесь к следующему примеру Intent.
Пример намерения:
Котлин
val REQUEST_IMAGE_CAPTURE = 1 private fun dispatchTakePictureIntent() { val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) try { startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE) } catch (e: ActivityNotFoundException) { // Display error state to the user. } }
Java
static final int REQUEST_IMAGE_CAPTURE = 1; private void dispatchTakePictureIntent() { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); try { startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE); } catch (ActivityNotFoundException e) { // Display error state to the user. } } </section></div>
Для получения дополнительной информации о том, как использовать это намерение для создания фотографии, включая создание соответствующего Uri для места сохранения результата, прочитайте разделы «Сделать фотографии» или «Снять видео» .
Пример фильтра намерений:
<activity ...> <intent-filter> <action android:name="android.media.action.IMAGE_CAPTURE" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
При обработке этого намерения настройте свою активность так, чтобы она проверяла наличие дополнительного параметра EXTRA_OUTPUT во входящем Intent , затем сохраняла захваченное изображение или видео в месте, указанном этим параметром, и вызывала setResult() с Intent , которое включает сжатую миниатюру в дополнительном параметре с именем "data" .
Запустите приложение камеры в режиме фотосъемки.
Чтобы открыть приложение камеры в режиме фотосъемки, используйте действие INTENT_ACTION_STILL_IMAGE_CAMERA .
- Действие
-
INTENT_ACTION_STILL_IMAGE_CAMERA - Схема URI данных
- Никто
- Тип MIME
- Никто
- Дополнительные материалы
- Никто
Пример намерения:
Котлин
private fun dispatchTakePictureIntent() { val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) try { startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE) } catch (e: ActivityNotFoundException) { // Display error state to the user. } }
Java
public void capturePhoto(String targetFilename) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.withAppendedPath(locationForPhotos, targetFilename)); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); } }
Пример фильтра намерений:
<activity ...> <intent-filter> <action android:name="android.media.action.STILL_IMAGE_CAMERA" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
Запустить приложение камеры в режиме видеосъемки
Чтобы открыть приложение камеры в режиме видеосъемки, используйте действие INTENT_ACTION_VIDEO_CAMERA .
- Действие
-
INTENT_ACTION_VIDEO_CAMERA - Схема URI данных
- Никто
- Тип MIME
- Никто
- Дополнительные материалы
- Никто
Пример намерения:
Котлин
fun capturePhoto() { val intent = Intent(MediaStore.INTENT_ACTION_VIDEO_CAMERA) if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE) } }
Java
public void capturePhoto() { Intent intent = new Intent(MediaStore.INTENT_ACTION_VIDEO_CAMERA); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); } }
Пример фильтра намерений:
<activity ...> <intent-filter> <action android:name="android.media.action.VIDEO_CAMERA" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
Приложение «Контакты/Люди»
Ниже перечислены типичные действия для приложений управления контактами, включая информацию, необходимую для создания фильтра намерений, который будет рекламировать возможность вашего приложения выполнять каждое из этих действий.
Выберите контакт
Чтобы пользователь мог выбрать контакт и предоставить вашему приложению доступ ко всей контактной информации, используйте действие ACTION_PICK и укажите MIME-тип Contacts.CONTENT_TYPE .
В результате выполнения функции обратного вызова onActivityResult() передается Intent content: URI, указывающий на выбранный контакт. Ответ предоставляет вашему приложению временные разрешения на чтение этого контакта с помощью API поставщика контактов , даже если ваше приложение не включает разрешение READ_CONTACTS .
Совет: Если вам нужен доступ только к определенной контактной информации, например, к номеру телефона или адресу электронной почты, обратитесь к следующему разделу о том, как выбрать конкретные контактные данные .
- Действие
-
ACTION_PICK - Схема URI данных
- Никто
- Тип MIME
-
Contacts.CONTENT_TYPE
Пример намерения:
Котлин
const val REQUEST_SELECT_CONTACT = 1 fun selectContact() { val intent = Intent(Intent.ACTION_PICK).apply { type = ContactsContract.Contacts.CONTENT_TYPE } if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_SELECT_CONTACT) } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == REQUEST_SELECT_CONTACT && resultCode == RESULT_OK) { val contactUri: Uri = data.data // Do something with the selected contact at contactUri. //... } }
Java
static final int REQUEST_SELECT_CONTACT = 1; public void selectContact() { Intent intent = new Intent(Intent.ACTION_PICK); intent.setType(ContactsContract.Contacts.CONTENT_TYPE); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_SELECT_CONTACT); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_SELECT_CONTACT && resultCode == RESULT_OK) { Uri contactUri = data.getData(); // Do something with the selected contact at contactUri. ... } }
Чтобы узнать, как получить контактные данные после того, как у вас есть URI контакта, прочитайте раздел «Получение сведений о контакте» .
При получении URI контакта с помощью этого интента вам, как правило, не требуется разрешение READ_CONTACTS для чтения основных сведений о контакте, таких как отображаемое имя и статус «помечен» (например, «избран»). Однако, если вы пытаетесь прочитать более конкретные данные о конкретном контакте — например, его номер телефона или адрес электронной почты — вам потребуется разрешение READ_CONTACTS .
Выберите конкретные контактные данные
Чтобы пользователь мог выбрать определенную информацию из контакта, например номер телефона, адрес электронной почты или другой тип данных, используйте действие ACTION_PICK и укажите MIME-тип одного из следующих типов содержимого, например CommonDataKinds.Phone.CONTENT_TYPE чтобы получить номер телефона контакта.
Примечание: Во многих случаях вашему приложению необходимо иметь разрешение READ_CONTACTS для просмотра конкретной информации о конкретном контакте.
Если вам нужно получить только один тип данных из контакта, этот метод с использованием CONTENT_TYPE из классов ContactsContract.CommonDataKinds более эффективен, чем использование Contacts.CONTENT_TYPE , как показано в предыдущем разделе. В результате вы получаете прямой доступ к нужным данным без необходимости выполнения более сложного запроса к поставщику контактов .
В результате выполнения функции обратного вызова onActivityResult() передается Intent content: содержащий URI, указывающий на выбранные контактные данные. Ответ предоставляет вашему приложению временные разрешения на чтение этих контактных данных, даже если ваше приложение не включает разрешение READ_CONTACTS .
- Действие
-
ACTION_PICK - Схема URI данных
- Никто
- Тип MIME
-
CommonDataKinds.Phone.CONTENT_TYPE - Выберите контакты, у которых есть номер телефона.
-
CommonDataKinds.Email.CONTENT_TYPE - Выберите контакты, имеющие адрес электронной почты.
-
CommonDataKinds.StructuredPostal.CONTENT_TYPE - Выберите контактные данные, содержащие почтовый адрес.
Или одно из множества других значений
CONTENT_TYPEв разделеContactsContract.-
Пример намерения:
Котлин
const val REQUEST_SELECT_PHONE_NUMBER = 1 fun selectContact() { // Start an activity for the user to pick a phone number from contacts. val intent = Intent(Intent.ACTION_PICK).apply { type = CommonDataKinds.Phone.CONTENT_TYPE } if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_SELECT_PHONE_NUMBER) } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == REQUEST_SELECT_PHONE_NUMBER && resultCode == Activity.RESULT_OK) { // Get the URI and query the content provider for the phone number. val contactUri: Uri = data.data val projection: Array<String> = arrayOf(CommonDataKinds.Phone.NUMBER) contentResolver.query(contactUri, projection, null, null, null).use { cursor -> // If the cursor returned is valid, get the phone number. if (cursor.moveToFirst()) { val numberIndex = cursor.getColumnIndex(CommonDataKinds.Phone.NUMBER) val number = cursor.getString(numberIndex) // Do something with the phone number. ... } } } }
Java
static final int REQUEST_SELECT_PHONE_NUMBER = 1; public void selectContact() { // Start an activity for the user to pick a phone number from contacts. Intent intent = new Intent(Intent.ACTION_PICK); intent.setType(CommonDataKinds.Phone.CONTENT_TYPE); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_SELECT_PHONE_NUMBER); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_SELECT_PHONE_NUMBER && resultCode == RESULT_OK) { // Get the URI and query the content provider for the phone number. Uri contactUri = data.getData(); String[] projection = new String[]{CommonDataKinds.Phone.NUMBER}; Cursor cursor = getContentResolver().query(contactUri, projection, null, null, null); // If the cursor returned is valid, get the phone number. if (cursor != null && cursor.moveToFirst()) { int numberIndex = cursor.getColumnIndex(CommonDataKinds.Phone.NUMBER); String number = cursor.getString(numberIndex); // Do something with the phone number. //... } } }
Просмотреть контакт
Чтобы отобразить подробную информацию об известном контакте, используйте действие ACTION_VIEW и укажите контакт с URI content: в качестве данных намерения.
Существует два основных способа первоначального получения URI контакта:
- Используйте URI контакта, возвращаемый действием
ACTION_PICK, показанным в предыдущем разделе. Этот подход не требует никаких разрешений приложения. - Получите доступ к списку всех контактов напрямую, как описано в разделе «Получение списка контактов» . Для этого требуется разрешение
READ_CONTACTS.
- Действие
-
ACTION_VIEW - Схема URI данных
-
content:<URI> - Тип MIME
- Нет. Тип определяется по URI контакта.
Пример намерения:
Котлин
fun viewContact(contactUri: Uri) { val intent = Intent(Intent.ACTION_VIEW, contactUri) if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void viewContact(Uri contactUri) { Intent intent = new Intent(Intent.ACTION_VIEW, contactUri); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
Редактировать существующий контакт
Для редактирования известного контакта используйте действие ACTION_EDIT , укажите контакт с URI content: в качестве данных намерения и включите любую известную информацию о контакте в дополнительные параметры, указанные константами в ContactsContract.Intents.Insert .
Существует два основных способа первоначального получения URI контакта:
- Используйте URI контакта, возвращаемый действием
ACTION_PICK, показанным в предыдущем разделе. Этот подход не требует никаких разрешений приложения. - Получите доступ к списку всех контактов напрямую, как описано в разделе «Получение списка контактов» . Для этого требуется разрешение
READ_CONTACTS.
- Действие
-
ACTION_EDIT - Схема URI данных
-
content:<URI> - Тип MIME
- Тип определяется по URI контакта.
- Дополнительные материалы
- Один или несколько дополнительных параметров, определенных в
ContactsContract.Intents.Insert, позволяют заполнять поля контактной информации.
Пример намерения:
Котлин
fun editContact(contactUri: Uri, email: String) { val intent = Intent(Intent.ACTION_EDIT).apply { data = contactUri putExtra(ContactsContract.Intents.Insert.EMAIL, email) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void editContact(Uri contactUri, String email) { Intent intent = new Intent(Intent.ACTION_EDIT); intent.setData(contactUri); intent.putExtra(Intents.Insert.EMAIL, email); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
Для получения дополнительной информации о редактировании контакта, ознакомьтесь с разделом «Изменение контактов с помощью интентов» .
Вставьте контакт
Для добавления нового контакта используйте действие ACTION_INSERT , укажите тип MIME Contacts.CONTENT_TYPE и включите любую известную информацию о контакте в дополнительные данные, указанные константами в ContactsContract.Intents.Insert .
- Действие
-
ACTION_INSERT - Схема URI данных
- Никто
- Тип MIME
-
Contacts.CONTENT_TYPE - Дополнительные материалы
- Один или несколько дополнительных параметров, определенных в
ContactsContract.Intents.Insert.
Пример намерения:
Котлин
fun insertContact(name: String, email: String) { val intent = Intent(Intent.ACTION_INSERT).apply { type = ContactsContract.Contacts.CONTENT_TYPE putExtra(ContactsContract.Intents.Insert.NAME, name) putExtra(ContactsContract.Intents.Insert.EMAIL, email) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void insertContact(String name, String email) { Intent intent = new Intent(Intent.ACTION_INSERT); intent.setType(Contacts.CONTENT_TYPE); intent.putExtra(Intents.Insert.NAME, name); intent.putExtra(Intents.Insert.EMAIL, email); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
Для получения дополнительной информации о том, как добавить контакт, прочитайте раздел «Изменение контактов с помощью интентов» .
Электронная почта
Создание электронного письма с необязательными вложениями — распространенная функция почтовых приложений. Используйте информацию из следующего раздела, чтобы создать фильтр намерений, который будет сообщать о возможности вашего приложения выполнять это действие.
Составьте электронное письмо с возможностью прикрепления файлов.
Для составления электронного письма используйте одно из следующих действий в зависимости от того, будете ли вы добавлять вложения или нет, и укажите такие данные, как получатель и тема, используя дополнительные ключи, указанные в списке.
- Действие
-
ACTION_SENDTO(для случаев отсутствия вложений) или
ACTION_SEND(для одного вложения) или
ACTION_SEND_MULTIPLE(для нескольких вложений) - Схема URI данных
- Никто
- Тип MIME
-
"text/plain""*/*"
-
- Дополнительные материалы
-
Intent.EXTRA_EMAIL - Массив строк со всеми адресами электронной почты получателей, указанными в поле «Кому».
-
Intent.EXTRA_CC - Массив строк со всеми адресами электронной почты получателей, получавших копию письма (CC).
-
Intent.EXTRA_BCC - Массив строк со всеми адресами электронной почты получателей, начинающимися с "BCC".
-
Intent.EXTRA_SUBJECT - Строка, содержащая тему электронного письма.
-
Intent.EXTRA_TEXT - Строка, содержащая текст электронного письма.
-
Intent.EXTRA_STREAM -
Uri, указывающий на вложение. При использовании действияACTION_SEND_MULTIPLEэто будетArrayList, содержащий несколько объектовUri.
-
Пример намерения:
Котлин
fun composeEmail(addresses: Array<String>, subject: String, attachment: Uri) { val intent = Intent(Intent.ACTION_SEND).apply { type = "*/*" putExtra(Intent.EXTRA_EMAIL, addresses) putExtra(Intent.EXTRA_SUBJECT, subject) putExtra(Intent.EXTRA_STREAM, attachment) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void composeEmail(String[] addresses, String subject, Uri attachment) { Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("*/*"); intent.putExtra(Intent.EXTRA_EMAIL, addresses); intent.putExtra(Intent.EXTRA_SUBJECT, subject); intent.putExtra(Intent.EXTRA_STREAM, attachment); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
Если вы хотите убедиться, что ваше намерение будет обработано только почтовым приложением, а не приложением для обмена текстовыми сообщениями или социальными сетями, используйте действие ACTION_SENDTO и укажите схему данных "mailto:" , как показано в следующем примере:
Котлин
fun composeEmail(addresses: Array<String>, subject: String) { val intent = Intent(Intent.ACTION_SENDTO).apply { data = Uri.parse("mailto:") // Only email apps handle this. putExtra(Intent.EXTRA_EMAIL, addresses) putExtra(Intent.EXTRA_SUBJECT, subject) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void composeEmail(String[] addresses, String subject) { Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setData(Uri.parse("mailto:")); // Only email apps handle this. intent.putExtra(Intent.EXTRA_EMAIL, addresses); intent.putExtra(Intent.EXTRA_SUBJECT, subject); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
Пример фильтра намерений:
<activity ...> <intent-filter> <action android:name="android.intent.action.SEND" /> <data android:type="*/*" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SENDTO" /> <data android:scheme="mailto" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
Хранилище файлов
Ниже описаны типичные действия для приложений, хранящих файлы, включая информацию, необходимую для создания фильтра намерений, который будет сообщать о возможности вашего приложения выполнять каждое из этих действий.
Получить файл определенного типа
Чтобы запросить у пользователя выбор файла, например документа или фотографии, и получить ссылку на него в вашем приложении, используйте действие ACTION_GET_CONTENT и укажите желаемый MIME-тип. Возвращаемая ссылка на файл является временной и привязана к текущему жизненному циклу вашей активности, поэтому, если вы захотите получить к ней доступ позже, вам необходимо импортировать копию, которую вы сможете прочитать позже.
Эта функция также позволяет пользователю создать новый файл в процессе работы. Например, вместо выбора существующей фотографии пользователь может сделать новый снимок с помощью камеры.
Результат, передаваемый в метод onActivityResult() , включает данные с URI, указывающим на файл. URI может быть любым, например, http: URI, file: URI или content: URI. Однако, если вы хотите ограничить выборку только теми файлами, которые доступны через поставщика контента ( content: URI) и которые доступны в виде файлового потока с помощью openFileDescriptor() , добавьте категорию CATEGORY_OPENABLE к вашему намерению.
На Android 4.3 (уровень API 18) и выше вы также можете позволить пользователю выбирать несколько файлов, добавив в Intent параметр EXTRA_ALLOW_MULTIPLE со значением true . Затем вы можете получить доступ к каждому из выбранных файлов в объекте ClipData , возвращаемом функцией getClipData() .
- Действие
-
ACTION_GET_CONTENT - Схема URI данных
- Никто
- Тип MIME
- MIME-тип, соответствующий типу файла, который пользователь должен выбрать.
- Дополнительные материалы
-
EXTRA_ALLOW_MULTIPLE - Логическое значение, указывающее, может ли пользователь выбрать более одного файла одновременно.
-
EXTRA_LOCAL_ONLY - Логическое значение, указывающее, должен ли возвращаемый файл быть доступен непосредственно с устройства, а не требовать загрузки из удаленного сервиса.
-
- Категория (необязательно)
-
CATEGORY_OPENABLE - Чтобы возвращать только "открываемые" файлы, которые могут быть представлены в виде файлового потока с помощью
openFileDescriptor().
-
Пример намерения сделать фотографию:
Котлин
const val REQUEST_IMAGE_GET = 1 fun selectImage() { val intent = Intent(Intent.ACTION_GET_CONTENT).apply { type = "image/*" } if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_IMAGE_GET) } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == REQUEST_IMAGE_GET && resultCode == Activity.RESULT_OK) { val thumbnail: Bitmap = data.getParcelableExtra("data") val fullPhotoUri: Uri = data.data // Do work with photo saved at fullPhotoUri. ... } }
Java
static final int REQUEST_IMAGE_GET = 1; public void selectImage() { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_IMAGE_GET); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_IMAGE_GET && resultCode == RESULT_OK) { Bitmap thumbnail = data.getParcelable("data"); Uri fullPhotoUri = data.getData(); // Do work with photo saved at fullPhotoUri. ... } }
Пример фильтра намерений для возврата фотографии:
<activity ...> <intent-filter> <action android:name="android.intent.action.GET_CONTENT" /> <data android:type="image/*" /> <category android:name="android.intent.category.DEFAULT" /> <!-- The OPENABLE category declares that the returned file is accessible from a content provider that supportsOpenableColumnsandContentResolver.openFileDescriptor(). --> <category android:name="android.intent.category.OPENABLE" /> </intent-filter> </activity>
Открыть файл определенного типа
Вместо получения копии файла, которую необходимо импортировать в приложение, используя действие ACTION_GET_CONTENT , на Android 4.4 и выше вы можете запросить открытие файла, управляемого другим приложением, используя действие ACTION_OPEN_DOCUMENT и указав MIME-тип. Чтобы также позволить пользователю создать новый документ, в который ваше приложение сможет записывать данные, используйте вместо этого действие ACTION_CREATE_DOCUMENT .
Например, вместо выбора из существующих PDF-документов, намерение ACTION_CREATE_DOCUMENT позволяет пользователям выбрать место, где они хотели бы создать новый документ, например, в другом приложении, которое управляет хранением документа. Затем ваше приложение получает URI-адрес, куда оно может записать новый документ.
В то время как намерение, передаваемое в метод onActivityResult() из действия ACTION_GET_CONTENT может возвращать URI любого типа, намерение результата из ACTION_OPEN_DOCUMENT и ACTION_CREATE_DOCUMENT всегда указывает выбранный файл как URI content: поддерживаемый DocumentsProvider . Вы можете открыть файл с помощью openFileDescriptor() и запросить его подробные сведения, используя столбцы из DocumentsContract.Document .
Возвращаемый URI предоставляет вашему приложению долговременный доступ на чтение файла, а также, возможно, доступ на запись. Действие ACTION_OPEN_DOCUMENT особенно полезно, когда вы хотите прочитать существующий файл, не создавая его копию в приложении, или когда вы хотите открыть и отредактировать файл на месте.
Вы также можете разрешить пользователю выбирать несколько файлов, добавив в Intent параметр EXTRA_ALLOW_MULTIPLE со значением true . Если пользователь выбирает только один элемент, вы можете получить его из getData() . Если пользователь выбирает более одного элемента, метод getData() возвращает null, и вам необходимо получить каждый элемент из объекта ClipData , который возвращается методом getClipData() .
Примечание: В вашем намерении необходимо указать MIME-тип и объявить категорию CATEGORY_OPENABLE . При необходимости вы можете указать более одного MIME-типа, добавив массив MIME-типов с помощью параметра EXTRA_MIME_TYPES — в этом случае вы должны установить основной MIME-тип в setType() равным "*/*" .
- Действие
-
ACTION_OPEN_DOCUMENTили
ACTION_CREATE_DOCUMENT - Схема URI данных
- Никто
- Тип MIME
- MIME-тип, соответствующий типу файла, который пользователь должен выбрать.
- Дополнительные материалы
-
EXTRA_MIME_TYPES - Массив MIME-типов, соответствующих типам файлов, запрашиваемых вашим приложением. При использовании этого дополнительного параметра необходимо установить основной MIME-тип в
setType()равным"*/*". -
EXTRA_ALLOW_MULTIPLE - Логическое значение, указывающее, может ли пользователь выбрать более одного файла одновременно.
-
EXTRA_TITLE - Используется совместно с
ACTION_CREATE_DOCUMENTдля указания начального имени файла. -
EXTRA_LOCAL_ONLY - Логическое значение, указывающее, должен ли возвращаемый файл быть доступен непосредственно с устройства, а не требовать загрузки из удаленного сервиса.
-
- Категория
-
CATEGORY_OPENABLE - Чтобы возвращать только "открываемые" файлы, которые могут быть представлены в виде файлового потока с помощью
openFileDescriptor().
-
Пример намерения сделать фотографию:
Котлин
const val REQUEST_IMAGE_OPEN = 1 fun selectImage2() { val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply { type = "image/*" addCategory(Intent.CATEGORY_OPENABLE) } // Only the system receives the ACTION_OPEN_DOCUMENT, so no need to test. startActivityForResult(intent, REQUEST_IMAGE_OPEN) } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == REQUEST_IMAGE_OPEN && resultCode == Activity.RESULT_OK) { val fullPhotoUri: Uri = data.data // Do work with full size photo saved at fullPhotoUri. ... } }
Java
static final int REQUEST_IMAGE_OPEN = 1; public void selectImage() { Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.setType("image/*"); intent.addCategory(Intent.CATEGORY_OPENABLE); // Only the system receives the ACTION_OPEN_DOCUMENT, so no need to test. startActivityForResult(intent, REQUEST_IMAGE_OPEN); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_IMAGE_OPEN && resultCode == RESULT_OK) { Uri fullPhotoUri = data.getData(); // Do work with full size photo saved at fullPhotoUri. ... } }
Сторонние приложения не могут реагировать на намерение с действием ACTION_OPEN_DOCUMENT . Вместо этого система получает это намерение и отображает все файлы, доступные из различных приложений, в едином пользовательском интерфейсе.
Чтобы отобразить файлы вашего приложения в этом пользовательском интерфейсе и позволить другим приложениям открывать их, необходимо реализовать DocumentsProvider и добавить фильтр намерений для PROVIDER_INTERFACE ( "android.content.action.DOCUMENTS_PROVIDER" ), как показано в следующем примере:
<provider ... android:grantUriPermissions="true" android:exported="true" android:permission="android.permission.MANAGE_DOCUMENTS"> <intent-filter> <action android:name="android.content.action.DOCUMENTS_PROVIDER" /> </intent-filter> </provider>
Для получения дополнительной информации о том, как сделать файлы, управляемые вашим приложением, доступными для открытия другими приложениями, прочитайте статью «Открытие файлов с помощью фреймворка доступа к хранилищу» .
Местные действия
Вызов автомобиля — распространённое локальное действие. Создайте фильтр намерений, чтобы сообщить о возможности вашего приложения выполнять это действие, используя информацию из следующего раздела.
Вызовите машину
Для вызова такси используйте действие ACTION_RESERVE_TAXI_RESERVATION .
Примечание: Перед выполнением этого действия приложение должно запросить подтверждение у пользователя.
- Действие
-
ACTION_RESERVE_TAXI_RESERVATION - URI данных
- Никто
- Тип MIME
- Никто
- Дополнительные материалы
- Никто
Пример намерения:
Котлин
fun callCar() { val intent = Intent(ReserveIntents.ACTION_RESERVE_TAXI_RESERVATION) if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void callCar() { Intent intent = new Intent(ReserveIntents.ACTION_RESERVE_TAXI_RESERVATION); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
Пример фильтра намерений:
<activity ...> <intent-filter> <action android:name="com.google.android.gms.actions.RESERVE_TAXI_RESERVATION" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
Карты
Отображение местоположения на карте — распространённое действие для картографических приложений. Создайте фильтр намерений, чтобы сообщить о возможности вашего приложения выполнять это действие, используя информацию из следующего раздела.
Показать местоположение на карте
Чтобы открыть карту, используйте действие ACTION_VIEW и укажите информацию о местоположении в данных намерения, используя одну из следующих схем.
- Действие
-
ACTION_VIEW - Схема URI данных
-
geo: latitude , longitude - Отобразите карту на заданных широте и долготе.
Пример:
"geo:47.6,-122.3" -
geo: latitude , longitude ?z= zoom - Отобразите карту с заданными долготой и широтой на определенном уровне масштабирования. Уровень масштабирования 1 отображает всю Землю с центром в заданных широте и долготе . Максимальный (ближайший) уровень масштабирования — 23.
Пример:
"geo:47.6,-122.3?z=11" -
geo:0,0?q=lat,lng(label) - Отобразите карту на заданных долготе и широте с помощью строковой метки.
Пример:
"geo:0,0?q=34.99,-106.61(Treasure)" -
geo:0,0?q=my+street+address - Отобразить местоположение для "моего адреса", которое может представлять собой конкретный адрес или запрос местоположения.
Пример:
"geo:0,0?q=1600+Amphitheatre+Parkway%2C+CA"Примечание: Все строки, передаваемые в URI
geo, должны быть закодированы. Например, строка1st & Pike, Seattleстановится1st%20%26%20Pike%2C%20Seattle. Пробелы в строке кодируются символом%20или заменяются знаком плюс (+).
-
- Тип MIME
- Никто
Пример намерения:
Котлин
fun showMap(geoLocation: Uri) { val intent = Intent(Intent.ACTION_VIEW).apply { data = geoLocation } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void showMap(Uri geoLocation) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(geoLocation); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
Пример фильтра намерений:
<activity ...> <intent-filter> <action android:name="android.intent.action.VIEW" /> <data android:scheme="geo" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
Музыка или видео
Ниже перечислены распространенные действия для музыкальных и видеоприложений, включая информацию, необходимую для создания фильтра намерений, который будет рекламировать возможность вашего приложения выполнять каждое из этих действий.
Воспроизвести медиафайл
Для воспроизведения музыкального файла используйте действие ACTION_VIEW и укажите URI-адрес файла в данных намерения.
- Действие
-
ACTION_VIEW - Схема URI данных
-
file: <URI>content: <URI>http: <URL>
-
- Тип MIME
-
"audio/*""application/ogg""application/x-ogg""application/itunes"- Или любой другой, необходимый вашему приложению.
-
Пример намерения:
Котлин
fun playMedia(file: Uri) { val intent = Intent(Intent.ACTION_VIEW).apply { data = file } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void playMedia(Uri file) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(file); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
Пример фильтра намерений:
<activity ...> <intent-filter> <action android:name="android.intent.action.VIEW" /> <data android:type="audio/*" /> <data android:type="application/ogg" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
Воспроизводить музыку на основе поискового запроса.
Для воспроизведения музыки на основе поискового запроса используйте интент INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH . Приложение может запускать этот интент в ответ на голосовую команду пользователя на воспроизведение музыки. Принимающее приложение выполняет поиск в своем инвентаре, чтобы сопоставить существующий контент с заданным запросом, и начинает воспроизведение этого контента.
В этом параметре следует указать дополнительную строку EXTRA_MEDIA_FOCUS , которая определяет предполагаемый режим поиска. Например, режим поиска может указывать, осуществляется ли поиск по имени исполнителя или по названию песни.
- Действие
-
INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH - Схема URI данных
- Никто
- Тип MIME
- Никто
- Дополнительные материалы
-
MediaStore.EXTRA_MEDIA_FOCUS(обязательно) Указывает режим поиска: ищет ли пользователь конкретного исполнителя, альбом, песню или плейлист. Большинство режимов поиска допускают дополнительные параметры. Например, если пользователь заинтересован в прослушивании конкретной песни, намерение может содержать три дополнительных параметра: название песни, исполнителя и альбом. Это намерение поддерживает следующие режимы поиска для каждого значения
EXTRA_MEDIA_FOCUS:Any -
"vnd.android.cursor.item/*"Воспроизводите любую музыку. Принимающее приложение воспроизводит музыку на основе интеллектуального выбора, например, последнего плейлиста, который слушал пользователь.
Дополнительные опции:
-
QUERY(обязательно): пустая строка. Этот дополнительный параметр всегда предоставляется для обратной совместимости. Существующие приложения, которые не знают о режимах поиска, могут обрабатывать это намерение как неструктурированный поиск.
-
Неструктурированный -
"vnd.android.cursor.item/*"Воспроизвести конкретную песню, альбом или жанр из неструктурированного поискового запроса. Приложения могут генерировать намерение в этом режиме поиска, когда не могут определить тип контента, который хочет прослушать пользователь. По возможности используйте более конкретные режимы поиска.
Дополнительные опции:
-
QUERY(обязательно): строка, содержащая любую комбинацию имени исполнителя, названия альбома, названия песни или жанра.
-
Воспроизводите музыку определённого жанра.
Дополнительные опции:
-
"android.intent.extra.genre"(обязательно) - Жанр. -
QUERY(обязательно): жанр. Этот дополнительный параметр всегда предоставляется для обратной совместимости. Существующие приложения, которые не знают о режимах поиска, могут обрабатывать это намерение как неструктурированный поиск.
-
Исполнитель -
Audio.Artists.ENTRY_CONTENT_TYPEВоспроизвести музыку конкретного исполнителя.
Дополнительные опции:
-
EXTRA_MEDIA_ARTIST(обязательно): имя художника. -
"android.intent.extra.genre": жанр. -
QUERY(обязательно): строка, содержащая любое сочетание имени исполнителя или жанра. Этот дополнительный параметр всегда предоставляется для обратной совместимости. Существующие приложения, которые не знают о режимах поиска, могут обрабатывать это намерение как неструктурированный поиск.
-
Альбом -
Audio.Albums.ENTRY_CONTENT_TYPEВоспроизвести музыку из определённого альбома.
Дополнительные опции:
-
EXTRA_MEDIA_ALBUM(обязательно): альбом. -
EXTRA_MEDIA_ARTIST: художник. -
"android.intent.extra.genre": жанр. -
QUERY(обязательно): строка, содержащая любую комбинацию названия альбома или исполнителя. Этот дополнительный параметр всегда предоставляется для обеспечения обратной совместимости. Существующие приложения, которые не знают о режимах поиска, могут обрабатывать это намерение как неструктурированный поиск.
-
Песня -
"vnd.android.cursor.item/audio"Воспроизведите определённую песню.
Дополнительные опции:
-
EXTRA_MEDIA_ALBUM: альбом. -
EXTRA_MEDIA_ARTIST: художник. -
"android.intent.extra.genre": жанр. -
EXTRA_MEDIA_TITLE(обязательно): название песни. -
QUERY(обязательно): строка, содержащая любую комбинацию названия альбома, исполнителя, жанра или названия. Этот дополнительный параметр всегда предоставляется для обратной совместимости. Существующие приложения, которые не знают о режимах поиска, могут обрабатывать это намерение как неструктурированный поиск.
-
Плейлист -
Audio.Playlists.ENTRY_CONTENT_TYPEВоспроизвести определенный плейлист или плейлист, соответствующий некоторым критериям, заданным в дополнительных настройках.
Дополнительные опции:
-
EXTRA_MEDIA_ALBUM: альбом. -
EXTRA_MEDIA_ARTIST: художник. -
"android.intent.extra.genre": жанр. -
"android.intent.extra.playlist": плейлист. -
EXTRA_MEDIA_TITLE: название песни, на основе которой создан плейлист. -
QUERY(обязательно): строка, содержащая любую комбинацию названия альбома, исполнителя, жанра, плейлиста или названия. Этот дополнительный параметр всегда предоставляется для обратной совместимости. Существующие приложения, которые не знают о режимах поиска, могут обрабатывать это намерение как неструктурированный поиск.
-
-
Пример намерения:
Если пользователь хочет послушать музыку определённого исполнителя, поисковое приложение может сгенерировать следующий запрос:
Котлин
fun playSearchArtist(artist: String) { val intent = Intent(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH).apply { putExtra(MediaStore.EXTRA_MEDIA_FOCUS, MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE) putExtra(MediaStore.EXTRA_MEDIA_ARTIST, artist) putExtra(SearchManager.QUERY, artist) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void playSearchArtist(String artist) { Intent intent = new Intent(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH); intent.putExtra(MediaStore.EXTRA_MEDIA_FOCUS, MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE); intent.putExtra(MediaStore.EXTRA_MEDIA_ARTIST, artist); intent.putExtra(SearchManager.QUERY, artist); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
Пример фильтра намерений:
<activity ...> <intent-filter> <action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
При обработке этого интента в вашей активности проверьте значение дополнительного параметра EXTRA_MEDIA_FOCUS во входящем Intent , чтобы определить режим поиска. После того, как ваша активность определит режим поиска, считайте значения дополнительных параметров для этого конкретного режима поиска. Имея эту информацию, ваше приложение сможет выполнить поиск в своем инвентаре, чтобы воспроизвести контент, соответствующий поисковому запросу. Это показано в следующем примере.
Котлин
override fun onCreate(savedInstanceState: Bundle?) { ... if (intent.action.compareTo(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH) == 0) { val mediaFocus: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_FOCUS) val query: String? = intent.getStringExtra(SearchManager.QUERY) // Some of these extras might not be available depending on the search mode. val album: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ALBUM) val artist: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ARTIST) val genre: String? = intent.getStringExtra("android.intent.extra.genre") val playlist: String? = intent.getStringExtra("android.intent.extra.playlist") val title: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_TITLE) // Determine the search mode and use the corresponding extras. when { mediaFocus == null -> { // 'Unstructured' search mode (backward compatible) playUnstructuredSearch(query) } mediaFocus.compareTo("vnd.android.cursor.item/*") == 0 -> { if (query?.isNotEmpty() == true) { // 'Unstructured' search mode. playUnstructuredSearch(query) } else { // 'Any' search mode. playResumeLastPlaylist() } } mediaFocus.compareTo(MediaStore.Audio.Genres.ENTRY_CONTENT_TYPE) == 0 -> { // 'Genre' search mode. playGenre(genre) } mediaFocus.compareTo(MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE) == 0 -> { // 'Artist' search mode. playArtist(artist, genre) } mediaFocus.compareTo(MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE) == 0 -> { // 'Album' search mode. playAlbum(album, artist) } mediaFocus.compareTo("vnd.android.cursor.item/audio") == 0 -> { // 'Song' search mode. playSong(album, artist, genre, title) } mediaFocus.compareTo(MediaStore.Audio.Playlists.ENTRY_CONTENT_TYPE) == 0 -> { // 'Playlist' search mode. playPlaylist(album, artist, genre, playlist, title) } } } }
Java
protected void onCreate(Bundle savedInstanceState) { //... Intent intent = this.getIntent(); if (intent.getAction().compareTo(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH) == 0) { String mediaFocus = intent.getStringExtra(MediaStore.EXTRA_MEDIA_FOCUS); String query = intent.getStringExtra(SearchManager.QUERY); // Some of these extras might not be available depending on the search mode. String album = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ALBUM); String artist = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ARTIST); String genre = intent.getStringExtra("android.intent.extra.genre"); String playlist = intent.getStringExtra("android.intent.extra.playlist"); String title = intent.getStringExtra(MediaStore.EXTRA_MEDIA_TITLE); // Determine the search mode and use the corresponding extras. if (mediaFocus == null) { // 'Unstructured' search mode (backward compatible). playUnstructuredSearch(query); } else if (mediaFocus.compareTo("vnd.android.cursor.item/*") == 0) { if (query.isEmpty()) { // 'Any' search mode. playResumeLastPlaylist(); } else { // 'Unstructured' search mode. playUnstructuredSearch(query); } } else if (mediaFocus.compareTo(MediaStore.Audio.Genres.ENTRY_CONTENT_TYPE) == 0) { // 'Genre' search mode. playGenre(genre); } else if (mediaFocus.compareTo(MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE) == 0) { // 'Artist' search mode. playArtist(artist, genre); } else if (mediaFocus.compareTo(MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE) == 0) { // 'Album' search mode. playAlbum(album, artist); } else if (mediaFocus.compareTo("vnd.android.cursor.item/audio") == 0) { // 'Song' search mode. playSong(album, artist, genre, title); } else if (mediaFocus.compareTo(MediaStore.Audio.Playlists.ENTRY_CONTENT_TYPE) == 0) { // 'Playlist' search mode. playPlaylist(album, artist, genre, playlist, title); } } }
Новая заметка
Создание заметки — распространенное действие для приложений, предназначенных для ведения заметок. Используйте информацию из следующего раздела, чтобы создать фильтр намерений, который будет рекламировать возможность вашего приложения выполнять это действие.
Создать заметку
Для создания новой заметки используйте действие ACTION_CREATE_NOTE и укажите сведения о заметке, такие как тема и текст, используя следующие дополнительные параметры.
Примечание: Перед выполнением этого действия приложение должно запросить подтверждение у пользователя.
- Действие
-
ACTION_CREATE_NOTE - Схема URI данных
- Никто
- Тип MIME
-
PLAIN_TEXT_TYPE - "*/*"
- Дополнительные материалы
-
EXTRA_NAME - Строка, указывающая на заголовок или тему заметки.
-
EXTRA_TEXT - Строка, указывающая текст заметки.
-
- Действие
-
ACTION_DIAL- Открывает номеронабиратель или телефонное приложение. -
ACTION_CALL— Совершает телефонный звонок (требуется разрешениеCALL_PHONE)
-
- Схема URI данных
-
tel:<phone-number> -
voicemail:<phone-number>
-
- Тип MIME
- Никто
-
tel:2125551212 -
tel:(212) 555 1212 - Действие
-
"com.google.android.gms.actions.SEARCH_ACTION" - Поддерживается поисковый запрос из Google Voice Actions.
-
- Дополнительные материалы
-
QUERY - Строка, содержащая поисковый запрос.
-
- Действие
-
ACTION_WEB_SEARCH - Схема URI данных
- Никто
- Тип MIME
- Никто
- Дополнительные материалы
-
SearchManager.QUERY - Поисковая строка.
-
- Действие
-
ACTION_SETTINGS
ACTION_WIRELESS_SETTINGS
ACTION_AIRPLANE_MODE_SETTINGS
ACTION_WIFI_SETTINGS
ACTION_APN_SETTINGS
ACTION_BLUETOOTH_SETTINGS
ACTION_DATE_SETTINGS
ACTION_LOCALE_SETTINGS
ACTION_INPUT_METHOD_SETTINGS
ACTION_DISPLAY_SETTINGS
ACTION_SECURITY_SETTINGS
ACTION_LOCATION_SOURCE_SETTINGS
ACTION_INTERNAL_STORAGE_SETTINGS
ACTION_MEMORY_CARD_SETTINGSДополнительные экраны настроек см. в документации
Settings. - Схема URI данных
- Никто
- Тип MIME
- Никто
- Действие
-
ACTION_SENDTOили
ACTION_SENDили
ACTION_SEND_MULTIPLE - Схема URI данных
-
sms: <phone_number>smsto: <phone_number>mms: <phone_number>mmsto: <phone_number>
Все эти схемы обрабатываются одинаково.
-
- Тип MIME
-
"text/plain""image/*""video/*"
-
- Дополнительные материалы
-
"subject" - Строка для темы сообщения (обычно только для MMS).
-
"sms_body" - Строка для текстового сообщения.
-
EXTRA_STREAM -
Uri, указывающий на изображение или видео для прикрепления. При использовании действияACTION_SEND_MULTIPLEэтот дополнительный параметр представляет собойArrayListобъектовUri, указывающих на изображения или видео для прикрепления.
-
- Действие
-
ACTION_VIEW - Схема URI данных
-
http: <URL>
https: <URL> - Тип MIME
-
"text/plain""text/html""application/xhtml+xml""application/vnd.wap.xhtml+xml"
-
- Настройте устройство Android для разработки или используйте виртуальное устройство .
- Установите версию вашего приложения, которая обрабатывает необходимые вам интенты.
- Запустите интент с помощью
adb:adb shell am start -a <ACTION> -t <MIME_TYPE> -d <DATA> \ -e <EXTRA_NAME> <EXTRA_VALUE> -n <ACTIVITY>
Например:
adb shell am start -a android.intent.action.DIAL \ -d tel:555-5555 -n org.example.MyApp/.MyActivity
- Если вы определили необходимые фильтры намерений, обработайте намерение.
Пример намерения:
Котлин
fun createNote(subject: String, text: String) { val intent = Intent(NoteIntents.ACTION_CREATE_NOTE).apply { putExtra(NoteIntents.EXTRA_NAME, subject) putExtra(NoteIntents.EXTRA_TEXT, text) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void createNote(String subject, String text) { Intent intent = new Intent(NoteIntents.ACTION_CREATE_NOTE) .putExtra(NoteIntents.EXTRA_NAME, subject) .putExtra(NoteIntents.EXTRA_TEXT, text); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
Пример фильтра намерений:
<activity ...> <intent-filter> <action android:name="com.google.android.gms.actions.CREATE_NOTE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="*/*" /> </intent-filter> </activity>
Телефон
Инициирование звонка — распространенное действие для мобильных приложений. Создайте фильтр намерений, чтобы сообщить о возможности вашего приложения выполнять это действие, используя информацию из следующего раздела.
Совершите телефонный звонок
Чтобы открыть приложение «Телефон» и набрать номер телефона, используйте действие ACTION_DIAL и укажите номер телефона, используя следующую схему URI. После открытия приложения отобразится номер телефона, и пользователю необходимо нажать кнопку «Вызов» , чтобы начать телефонный разговор.
Для совершения телефонного звонка напрямую используйте действие ACTION_CALL и укажите номер телефона, используя следующую схему URI. После открытия приложения телефон начнется телефонный звонок. Пользователю не нужно нажимать кнопку «Вызов» .
Для выполнения действия ACTION_CALL необходимо добавить разрешение CALL_PHONE в файл манифеста:
<uses-permission android:name="android.permission.CALL_PHONE" />
Допустимыми номерами телефонов являются номера, определенные в стандарте IETF RFC 3966. Примеры допустимых номеров включают следующие:
Встроенный в приложение «Телефон» номеронабиратель хорошо справляется со стандартизацией схем, например, телефонных номеров. Поэтому описанная схема не является строго обязательной в методе Uri.parse() . Однако, если вы не пробовали какую-либо схему или не уверены, можно ли её обработать, используйте вместо неё метод Uri.fromParts() .
Пример намерения:
Котлин
fun dialPhoneNumber(phoneNumber: String) { val intent = Intent(Intent.ACTION_DIAL).apply { data = Uri.parse("tel:$phoneNumber") } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void dialPhoneNumber(String phoneNumber) { Intent intent = new Intent(Intent.ACTION_DIAL); intent.setData(Uri.parse("tel:" + phoneNumber)); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
Поиск
Ниже перечислены типичные действия для поисковых приложений, включая информацию, необходимую для создания фильтра намерений, который будет рекламировать возможность вашего приложения выполнять каждое из этих действий.
Поиск с помощью конкретного приложения
Для поддержки поиска в контексте вашего приложения объявите в приложении фильтр намерений с действием SEARCH_ACTION , как показано в следующем примере фильтра намерений.
Примечание: Мы не рекомендуем использовать SEARCH_ACTION для поиска в приложении. Вместо этого используйте действие GET_THING , чтобы задействовать встроенную поддержку поиска в приложении Google Assistant. Для получения дополнительной информации см. документацию по действиям приложений Google Assistant.
Пример фильтра намерений:
<activity android:name=".SearchActivity"> <intent-filter> <action android:name="com.google.android.gms.actions.SEARCH_ACTION"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity>
Выполните поиск в интернете
Для начала веб-поиска используйте действие ACTION_WEB_SEARCH и укажите строку поиска в дополнительном параметре SearchManager.QUERY .
Пример намерения:
Котлин
fun searchWeb(query: String) { val intent = Intent(Intent.ACTION_WEB_SEARCH).apply { putExtra(SearchManager.QUERY, query) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void searchWeb(String query) { Intent intent = new Intent(Intent.ACTION_WEB_SEARCH); intent.putExtra(SearchManager.QUERY, query); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
Настройки
Чтобы открыть экран в системных настройках, когда ваше приложение требует от пользователя внесения изменений, используйте одно из следующих действий Intent:
Пример намерения:
Котлин
fun openWifiSettings() { val intent = Intent(Settings.ACTION_WIFI_SETTINGS) if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void openWifiSettings() { Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
Текстовые сообщения
Создание SMS/MMS-сообщения с вложением — распространённое действие для приложений обмена текстовыми сообщениями. Создайте фильтр намерений, чтобы рекламировать возможность вашего приложения выполнять это действие, используя информацию из следующего раздела.
Составьте SMS/MMS-сообщение с вложением.
Для отправки SMS или MMS сообщения используйте одно из следующих действий Intent и укажите подробности сообщения, такие как номер телефона, тема и текст сообщения, используя следующие дополнительные клавиши.
Пример намерения:
Котлин
fun composeMmsMessage(message: String, attachment: Uri) { val intent = Intent(Intent.ACTION_SENDTO).apply { type = HTTP.PLAIN_TEXT_TYPE putExtra("sms_body", message) putExtra(Intent.EXTRA_STREAM, attachment) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void composeMmsMessage(String message, Uri attachment) { Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setType(HTTP.PLAIN_TEXT_TYPE); intent.putExtra("sms_body", message); intent.putExtra(Intent.EXTRA_STREAM, attachment); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
Если вы хотите убедиться, что ваше намерение будет обработано только приложением для обмена текстовыми сообщениями, а не другими почтовыми или социальными приложениями, используйте действие ACTION_SENDTO и укажите схему данных "smsto:" , как показано в следующем примере:
Котлин
fun composeMmsMessage(message: String, attachment: Uri) { val intent = Intent(Intent.ACTION_SEND).apply { data = Uri.parse("smsto:") // Only SMS apps respond to this. putExtra("sms_body", message) putExtra(Intent.EXTRA_STREAM, attachment) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void composeMmsMessage(String message, Uri attachment) { Intent intent = new Intent(Intent.ACTION_SEND); intent.setData(Uri.parse("smsto:")); // Only SMS apps respond to this. intent.putExtra("sms_body", message); intent.putExtra(Intent.EXTRA_STREAM, attachment); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
Пример фильтра намерений:
<activity ...> <intent-filter> <action android:name="android.intent.action.SEND" /> <data android:type="text/plain" /> <data android:type="image/*" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
Примечание: Если вы разрабатываете приложение для обмена SMS/MMS-сообщениями, вам необходимо реализовать фильтры намерений для нескольких дополнительных действий, чтобы оно было доступно в качестве приложения SMS по умолчанию на Android 4.4 и выше. Для получения дополнительной информации см. документацию по Telephony .
Веб-браузер
Загрузка веб-адреса — распространённое действие для веб-приложений. Создайте фильтр намерений, чтобы сообщить о возможности вашего приложения выполнять это действие, используя информацию из следующего раздела.
Загрузить веб-адрес
Для открытия веб-страницы используйте действие ACTION_VIEW и укажите URL-адрес веб-страницы в данных намерения.
Пример намерения:
Котлин
fun openWebPage(url: String) { val webpage: Uri = Uri.parse(url) val intent = Intent(Intent.ACTION_VIEW, webpage) if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void openWebPage(String url) { Uri webpage = Uri.parse(url); Intent intent = new Intent(Intent.ACTION_VIEW, webpage); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
Пример фильтра намерений:
<activity ...> <intent-filter> <action android:name="android.intent.action.VIEW" /> <!-- Include the host attribute if you want your app to respond only to URLs with your app's domain. --> <data android:scheme="http" android:host="www.example.com" /> <category android:name="android.intent.category.DEFAULT" /> <!-- The BROWSABLE category is required to get links from web pages. --> <category android:name="android.intent.category.BROWSABLE" /> </intent-filter> </activity>
Совет: Если ваше приложение для Android предоставляет функциональность, аналогичную вашему веб-сайту, добавьте фильтр намерений для URL-адресов, ведущих на ваш веб-сайт. Тогда, если у пользователей установлено ваше приложение, ссылки из электронных писем или других веб-страниц, ведущие на ваш веб-сайт, будут открывать ваше приложение для Android вместо вашей веб-страницы. Подробнее см. в разделе «Обработка ссылок в приложениях для Android» .
Начиная с Android 12 (уровень API 31), универсальный веб-интент приводит к активности в вашем приложении только в том случае, если ваше приложение одобрено для конкретного домена, указанного в этом веб-интенте. Если ваше приложение не одобрено для этого домена, веб-интент приводит к использованию браузера пользователя по умолчанию.
Проверьте намерения с помощью Android Debug Bridge.
Чтобы убедиться, что ваше приложение реагирует на необходимые вам интенты, вы можете использовать инструмент adb для запуска определенных интентов, выполнив следующие действия:
For more information, see Issue shell commands .
Контент и образцы кода на этой странице предоставлены по лицензиям. Java и OpenJDK – это зарегистрированные товарные знаки корпорации Oracle и ее аффилированных лиц.
Последнее обновление: 2026-02-27 UTC.