Намерение позволяет вам начать действие в другом приложении, описав действие, которое вы хотели бы выполнить, например, «просмотреть карту» или «сделать снимок», в объекте Intent
. Этот тип намерения называется неявным намерением, поскольку оно не указывает компонент приложения для запуска, а вместо этого указывает действие и предоставляет некоторые данные , с которыми можно выполнить действие.
Когда вы вызываете startActivity()
или startActivityForResult()
и передаете ему неявное намерение, система разрешает намерение в приложение, которое может обработать намерение, и запускает соответствующее ему Activity
. Если есть более одного приложения, которое может обработать намерение, система предоставляет пользователю диалоговое окно для выбора приложения для использования.
На этой странице описывается несколько неявных намерений, которые можно использовать для выполнения общих действий, организованных по типу приложения, которое обрабатывает намерение. В каждом разделе также показано, как можно создать фильтр намерений для рекламы способности вашего приложения выполнять действие.
Внимание: Если на устройстве нет приложений, которые могут получить неявное намерение, приложение аварийно завершает работу при вызове startActivity()
. Чтобы сначала проверить, существует ли приложение для получения намерения, вызовите resolveActivity()
для вашего объекта Intent
. Если результат не равен нулю, есть по крайней мере одно приложение, которое может обработать намерение, и можно безопасно вызвать startActivity()
. Если результат равен нулю, не используйте намерение и, если возможно, отключите функцию, которая вызывает намерение.
Если вы не знакомы с тем, как создавать намерения или фильтры намерений, сначала прочтите раздел Намерения и фильтры намерений .
Чтобы узнать, как активировать намерения, перечисленные на этой странице, с вашего хоста разработки, см. раздел Проверка намерений с помощью 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) } }
Ява
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
:
android:name="com.android.alarm.permission.SET_ALARM" />
Пример фильтра намерений:
...> android:name="android.intent.action.SET_ALARM" /> android:name="android.intent.category.DEFAULT" />
Создать таймер
Чтобы создать таймер обратного отсчета, используйте действие 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) } }
Ява
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
:
android:name="com.android.alarm.permission.SET_ALARM" />
Пример фильтра намерений:
...> android:name="android.intent.action.SET_TIMER" /> android:name="android.intent.category.DEFAULT" />
Показать все будильники
Чтобы отобразить список будильников, используйте действие ACTION_SHOW_ALARMS
.
Хотя не так много приложений используют это намерение, поскольку оно в основном используется системными приложениями, любое приложение, которое ведет себя как будильник, может реализовать этот фильтр намерений и отреагировать, показав список текущих будильников.
Примечание: это намерение доступно в Android 4.4 (уровень API 19) и выше.
- Действие
-
ACTION_SHOW_ALARMS
- URI данных
- Никто
- MIME-тип
- Никто
Пример фильтра намерений:
...> android:name="android.intent.action.SHOW_ALARMS" /> android:name="android.intent.category.DEFAULT" />
Календарь
Добавление события — это обычное действие для приложений календаря. Создайте фильтр намерений, чтобы рекламировать способность вашего приложения выполнять это действие, используя информацию в следующем разделе.
Добавить событие в календарь
Чтобы добавить новое событие в календарь пользователя, используйте действие 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) } }
Ява
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); } }
Пример фильтра намерений:
...> android:name="android.intent.action.INSERT" /> android:mimeType="vnd.android.cursor.dir/event" /> android:name="android.intent.category.DEFAULT" />
Камера
Ниже приведены общие действия для приложений камеры, включая информацию, необходимую для создания фильтра намерений, чтобы рекламировать способность вашего приложения выполнять каждое действие.
Сделайте снимок или снимите видео и отправьте его нам.
Чтобы открыть приложение камеры и получить полученное фото или видео, используйте действие 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. ... } }
Ява
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) или выше, обратитесь к следующему примеру намерения.
Пример намерения:
Котлин
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. } }
Ява
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
для выходного местоположения, см. в разделе Съемка фотографий или Съемка видео .
Пример фильтра намерений:
...> android:name="android.media.action.IMAGE_CAPTURE" /> android:name="android.intent.category.DEFAULT" />
При обработке этого намерения заставьте свою активность проверять наличие дополнительного элемента 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. } }
Ява
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); } }
Пример фильтра намерений:
...> android:name="android.media.action.STILL_IMAGE_CAMERA" /> android:name="android.intent.category.DEFAULT" />
Запустите приложение камеры в режиме видео
Чтобы открыть приложение камеры в режиме видео, используйте действие 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) } }
Ява
public void capturePhoto() { Intent intent = new Intent(MediaStore.INTENT_ACTION_VIDEO_CAMERA); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); } }
Пример фильтра намерений:
...> android:name="android.media.action.VIDEO_CAMERA" /> android:name="android.intent.category.DEFAULT" />
Приложение «Контакты/люди»
Ниже приведены общие действия для приложений управления контактами, включая информацию, необходимую для создания фильтра намерений, чтобы рекламировать способность вашего приложения выполнять каждое действие.
Выберите контакт
Чтобы пользователь выбрал контакт и предоставил вашему приложению доступ ко всей контактной информации, используйте действие ACTION_PICK
и укажите тип MIME Contacts.CONTENT_TYPE
.
Результат Intent
, доставленный в ваш обратный вызов onActivityResult()
содержит 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. //... } }
Ява
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
, как показано в предыдущем разделе. Результат предоставляет вам прямой доступ к нужным данным без необходимости выполнять более сложный запрос к Contacts Provider .
Результат Intent
доставленный в ваш обратный вызов onActivityResult()
содержит 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= 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. ... } } } }
Ява
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
и укажите контакт с content:
URI в качестве данных намерения.
Существует два основных способа первоначального получения URI контакта:
- Используйте URI контакта, возвращаемый действием
ACTION_PICK
, показанным в предыдущем разделе. Этот подход не требует никаких разрешений приложения. - Получите прямой доступ к списку всех контактов, как описано в разделе Получение списка контактов . Для этого подхода требуется разрешение
READ_CONTACTS
.
- Действие
-
ACTION_VIEW
- Схема URI данных
-
content:
- MIME-тип
- Нет. Тип выводится из URI контакта.
Пример намерения:
Котлин
fun viewContact(contactUri: Uri) { val intent = Intent(Intent.ACTION_VIEW, contactUri) if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Ява
public void viewContact(Uri contactUri) { Intent intent = new Intent(Intent.ACTION_VIEW, contactUri); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
Изменить существующий контакт
Чтобы отредактировать известный контакт, используйте действие ACTION_EDIT
, укажите контакт с content:
URI в качестве данных намерения и включите любую известную контактную информацию в дополнительные данные, указанные константами в ContactsContract.Intents.Insert
.
Существует два основных способа первоначального получения URI контакта:
- Используйте URI контакта, возвращаемый действием
ACTION_PICK
, показанным в предыдущем разделе. Этот подход не требует никаких разрешений приложения. - Получите прямой доступ к списку всех контактов, как описано в разделе Получение списка контактов . Для этого подхода требуется разрешение
READ_CONTACTS
.
- Действие
-
ACTION_EDIT
- Схема URI данных
-
content:
- 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) } }
Ява
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
, укажите Contacts.CONTENT_TYPE
в качестве типа MIME и включите любую известную контактную информацию в дополнительные данные, указанные константами в 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) } }
Ява
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
- Массив строк всех адресов электронной почты получателей «Копия».
-
Intent.EXTRA_BCC
- Массив строк всех адресов электронной почты получателей «BCC».
-
Intent.EXTRA_SUBJECT
- Строка с темой письма.
-
Intent.EXTRA_TEXT
- Строка с текстом письма.
-
Intent.EXTRA_STREAM
-
Uri
, указывающий на вложение. Если используется действиеACTION_SEND_MULTIPLE
, этоArrayList
, содержащий несколько объектовUri
.
-
Пример намерения:
Котлин
fun composeEmail(addresses: Array, 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) } }
Ява
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, 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) } }
Ява
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); } }
Пример фильтра намерений:
...> android:name="android.intent.action.SEND" /> android:type="*/*" /> android:name="android.intent.category.DEFAULT" /> android:name="android.intent.action.SENDTO" /> android:scheme="mailto" /> android:name="android.intent.category.DEFAULT" />
Хранение файлов
Ниже приведены общие действия для приложений хранения файлов, включая информацию, необходимую для создания фильтра намерений, чтобы рекламировать способность вашего приложения выполнять каждое действие.
Извлечь определенный тип файла
Чтобы запросить у пользователя выбор файла, например документа или фотографии, и вернуть ссылку на ваше приложение, используйте действие ACTION_GET_CONTENT
и укажите желаемый тип MIME. Ссылка на файл, возвращаемая вашему приложению, является временной для текущего жизненного цикла вашей активности, поэтому, если вы захотите получить к ней доступ позже, вам необходимо импортировать копию, которую вы сможете прочитать позже.
Это намерение также позволяет пользователю создать новый файл в процессе. Например, вместо того, чтобы выбрать существующую фотографию, пользователь может сделать новую фотографию с помощью камеры.
Результат намерения, доставленный в ваш метод onActivityResult()
включает данные с URI, указывающим на файл. URI может быть любым, например http:
URI, file:
URI или content:
URI. Однако, если вы хотите ограничить выбираемые файлы только теми, которые доступны из поставщика контента ( content:
URI) и которые доступны как файловый поток с openFileDescriptor()
, добавьте категорию CATEGORY_OPENABLE
в свое намерение.
На Android 4.3 (уровень API 18) и выше вы также можете позволить пользователю выбирать несколько файлов, добавив 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. ... } }
Ява
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. ... } }
Пример фильтра намерений для возврата фотографии:
...> android:name="android.intent.action.GET_CONTENT" /> android:type="image/*" /> android:name="android.intent.category.DEFAULT" /> android:name="android.intent.category.OPENABLE" />
Открыть определенный тип файла
Вместо того, чтобы извлекать копию файла, который необходимо импортировать в приложение, используя действие 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
всегда указывает выбранный файл как content:
URI, поддерживаемый DocumentsProvider
. Вы можете открыть файл с помощью openFileDescriptor()
и запросить его данные, используя столбцы из DocumentsContract.Document
.
Возвращенный URI предоставляет вашему приложению долгосрочный доступ на чтение файла, также, возможно, с доступом на запись. Действие ACTION_OPEN_DOCUMENT
особенно полезно, когда вы хотите прочитать существующий файл, не делая копию в вашем приложении, или когда вы хотите открыть и отредактировать файл на месте.
Вы также можете позволить пользователю выбирать несколько файлов, добавив 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. ... } }
Ява
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"
), как показано в следующем примере:
... android:grantUriPermissions="true" android:exported="true" android:permission="android.permission.MANAGE_DOCUMENTS"> android:name="android.content.action.DOCUMENTS_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) } }
Ява
public void callCar() { Intent intent = new Intent(ReserveIntents.ACTION_RESERVE_TAXI_RESERVATION); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
Пример фильтра намерений:
...> android:name="com.google.android.gms.actions.RESERVE_TAXI_RESERVATION" /> android:name="android.intent.category.DEFAULT" />
Карты
Отображение местоположения на карте — обычное действие для приложений карт. Создайте фильтр намерений, чтобы рекламировать способность вашего приложения выполнять это действие, используя информацию в следующем разделе.
Показать местоположение на карте
Чтобы открыть карту, используйте действие 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"
Примечание: Все строки, переданные в
geo
URI, должны быть закодированы. Например, строка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) } }
Ява
public void showMap(Uri geoLocation) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(geoLocation); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
Пример фильтра намерений:
...> android:name="android.intent.action.VIEW" /> android:scheme="geo" /> android:name="android.intent.category.DEFAULT" />
Музыка или видео
Ниже приведены общие действия для музыкальных и видеоприложений, включая информацию, необходимую для создания фильтра намерений, чтобы рекламировать способность вашего приложения выполнять каждое действие.
Воспроизвести медиа-файл
Чтобы воспроизвести музыкальный файл, используйте действие ACTION_VIEW
и укажите URI-адрес расположения файла в данных намерения.
- Действие
-
ACTION_VIEW
- Схема URI данных
-
file:
content:
http:
-
- 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) } }
Ява
public void playMedia(Uri file) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(file); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
Пример фильтра намерений:
...> android:name="android.intent.action.VIEW" /> android:type="audio/*" /> android:type="application/ogg" /> android:name="android.intent.category.DEFAULT" />
Воспроизведение музыки на основе поискового запроса
Чтобы воспроизвести музыку на основе поискового запроса, используйте намерение INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH
. Приложение может запустить это намерение в ответ на голосовую команду пользователя воспроизвести музыку. Принимающее приложение для этого намерения выполняет поиск в своем инвентаре, чтобы сопоставить существующий контент с заданным запросом, и начинает воспроизводить этот контент.
В этом намерении включите строку EXTRA_MEDIA_FOCUS
extra, которая указывает предполагаемый режим поиска. Например, режим поиска может указывать, выполняется ли поиск по имени исполнителя или названию песни.
- Действие
-
INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH
- Схема URI данных
- Никто
- MIME-тип
- Никто
- Дополнительно
-
MediaStore.EXTRA_MEDIA_FOCUS
(обязательно) Указывает режим поиска: ищет ли пользователь определенного исполнителя, альбом, песню или плейлист. Большинство режимов поиска принимают дополнительные дополнения. Например, если пользователь заинтересован в прослушивании определенной песни, намерение может иметь три дополнительных дополнения: название песни, исполнителя и альбом. Это намерение поддерживает следующие режимы поиска для каждого значения
EXTRA_MEDIA_FOCUS
:Любой -
"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) } }
Ява
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); } }
Пример фильтра намерений:
...> android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH" /> android:name="android.intent.category.DEFAULT" />
При обработке этого намерения в вашей активности проверьте значение EXTRA_MEDIA_FOCUS
extra во входящем 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) } } } }
Ява
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:
-
voicemail:
-
- 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:
smsto:
mms:
mmsto:
Все эти схемы обрабатываются одинаково.
-
- MIME-тип
-
"text/plain"
"image/*"
"video/*"
-
- Дополнительно
-
"subject"
- Строка темы сообщения (обычно только для MMS).
-
"sms_body"
- Строка для текстового сообщения.
-
EXTRA_STREAM
-
Uri
, указывающий на изображение или видео для прикрепления. Если используется действиеACTION_SEND_MULTIPLE
, это дополнение представляет собойArrayList
объектовUri
, указывающих на изображения или видео для прикрепления.
-
- Действие
-
ACTION_VIEW
- Схема URI данных
-
http:
https:
- MIME-тип
-
"text/plain"
"text/html"
"application/xhtml+xml"
"application/vnd.wap.xhtml+xml"
-
- Установите устройство Android для разработки или используйте виртуальное устройство .
- Установите версию вашего приложения, которая обрабатывает намерения, которые вы хотите поддержать.
- Поготовить намерение, используя
adb
:adb shell am start -a
-t -d \ -e -n Например:
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) } }
Ява
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); } }
Пример фильтра намерений:
...> android:name="com.google.android.gms.actions.CREATE_NOTE" /> android:name="android.intent.category.DEFAULT" /> android:mimeType="*/*" />
Телефон
Инициирование вызова — это обычное действие для телефонных приложений. Создайте фильтр намерений, чтобы рекламировать способность вашего приложения выполнять это действие, используя информацию в следующем разделе.
Позвонить по телефону
Чтобы открыть приложение телефона и набрать номер телефона, используйте действие ACTION_DIAL
и укажите номер телефона, используя следующую схему URI. Когда приложение телефона открывается, оно отображает номер телефона, и пользователь должен нажать кнопку «Вызов» , чтобы начать телефонный звонок.
Чтобы напрямую позвонить, используйте действие ACTION_CALL
и укажите номер телефона, используя следующую схему URI. Когда приложение телефона открывается, оно начинает телефонный звонок. Пользователю не нужно нажимать кнопку «Вызов» .
Для действия ACTION_CALL
необходимо добавить разрешение CALL_PHONE
в файл манифеста:
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) } }
Ява
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 App Actions .
Пример фильтра намерений:
android:name=".SearchActivity"> android:name="com.google.android.gms.actions.SEARCH_ACTION"/> android:name="android.intent.category.DEFAULT"/>
Выполните поиск в Интернете
Чтобы инициировать веб-поиск, используйте действие 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) } }
Ява
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); } }
Настройки
Чтобы открыть экран в системном приложении «Настройки», когда ваше приложение требует от пользователя что-либо изменить, используйте одно из следующих действий намерения:
Пример намерения:
Котлин
fun openWifiSettings() { val intent = Intent(Settings.ACTION_WIFI_SETTINGS) if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Ява
public void openWifiSettings() { Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
Текстовые сообщения
Составление SMS/MMS-сообщения с вложением является обычным действием для приложений текстовых сообщений. Создайте фильтр намерений, чтобы рекламировать способность вашего приложения выполнять это действие, используя информацию в следующем разделе.
Составьте SMS/MMS-сообщение с вложением
Чтобы инициировать текстовое SMS- или MMS-сообщение, используйте одно из следующих действий намерения и укажите данные сообщения, такие как номер телефона, тему и текст сообщения, с помощью следующих дополнительных клавиш.
Пример намерения:
Котлин
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) } }
Ява
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) } }
Ява
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); } }
Пример фильтра намерений:
...> android:name="android.intent.action.SEND" /> android:type="text/plain" /> android:type="image/*" /> android:name="android.intent.category.DEFAULT" />
Примечание: Если вы разрабатываете приложение для обмена SMS/MMS-сообщениями, вам необходимо реализовать фильтры намерений для нескольких дополнительных действий, чтобы они были доступны в качестве приложения SMS по умолчанию на Android 4.4 и выше. Для получения дополнительной информации см. документацию по Telephony
.
Веб-браузер
Загрузка веб-URL — это обычное действие для приложений веб-браузера. Создайте фильтр намерений, чтобы рекламировать способность вашего приложения выполнять это действие, используя информацию в следующем разделе.
Загрузить веб-URL
Чтобы открыть веб-страницу, используйте действие 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) } }
Ява
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); } }
Пример фильтра намерений:
...> android:name="android.intent.action.VIEW" /> android:scheme="http" android:host="www.example.com" /> android:name="android.intent.category.DEFAULT" /> android:name="android.intent.category.BROWSABLE" />
Совет: Если ваше приложение Android предоставляет функциональность, схожую с вашим веб-сайтом, включите фильтр намерений для URL-адресов, которые указывают на ваш веб-сайт. Затем, если у пользователей установлено ваше приложение, ссылки из писем или других веб-страниц, указывающие на ваш веб-сайт, откроют ваше приложение Android вместо вашей веб-страницы. Узнайте больше в разделе Обработка ссылок приложений Android .
Начиная с Android 12 (уровень API 31), общее веб -намерение решается для деятельности в вашем приложении, только если ваше приложение одобрено для конкретного домена, содержащегося в этом веб -намерении. Если ваше приложение не одобрено для домена, вместо этого решается в Интернете приложение для браузера пользователя.
Проверьте намерения с мостом отладки Android
Чтобы убедиться, что ваше приложение отвечает на намерения, которые вы хотите поддержать, вы можете использовать инструмент adb
для сбора конкретных намерений, выполнив следующее:
Для получения дополнительной информации см. Команды выпуска Shell .
Контент и образцы кода на этой странице предоставлены по лицензиям. Java и OpenJDK – это зарегистрированные товарные знаки корпорации Oracle и ее аффилированных лиц.
Последнее обновление: 2025-06-11 UTC.