Объекты Intent позволяют запускать операцию в другом приложении – достаточно в объекте Intent описать действие, которое необходимо выполнить (например,"показать карту" или "сделать снимок"). Такой тип намерения называется неявным, поскольку в нем не указывается компонент приложения, который нужно запустить, а задается действие и предоставляются данные для его выполнения.
Когда вы вызываете startActivity() или startActivityForResult() и передаете неявное намерение, система разрешает намерение для приложения, которое может его обработать, и запускает соответствующий компонент Activity. Если намерение может обработать несколько приложений, система предлагает пользователю выбрать одно из них.
На этой странице описаны несколько неявных намерений, которые можно использовать для выполнения распространенных действий. Они упорядочены по типу приложения, обрабатывающего намерение. В каждом разделе также показано, как создать фильтр интентов, чтобы сообщить о том, что ваше приложение может выполнять действие.
Внимание! Если на устройстве нет приложений, которые могут получить неявное намерение, то при вызове startActivity() приложение аварийно завершит работу. Чтобы проверить, есть ли приложение, которое может получить намерение, вызовите resolveActivity() для объекта Intent. Если результат не равен null, значит есть хотя бы одно приложение, которое может обработать намерение, и можно безопасно вызвать startActivity(). Если результат равен null, не используйте намерение и, если возможно, отключите функцию, которая его вызывает.
Если вы не знаете, как создавать интенты и фильтры интентов, прочитайте статью Интенты и фильтры интентов.
Чтобы узнать, как запускать перечисленные на этой странице интенты с хоста разработки, ознакомьтесь с разделом Проверка интентов с помощью Android Debug Bridge.
Голосовое управление Google
Google Voice активирует некоторые из интентов, перечисленных на этой странице в ответ на голосовые команды. Подробную информацию вы найдете в статье Начало работы с системными голосовыми командами.
Будильник
Ниже перечислены распространенные действия для приложений-будильников, а также информация, необходимая для создания фильтра интентов, который будет сообщать о том, что ваше приложение может выполнять каждое из этих действий.
Как создать будильник
Чтобы создать будильник, используйте действие ACTION_SET_ALARM и укажите время и сообщение, используя следующие дополнительные параметры.
Примечание. В Android 2.3 (уровень API 9) и более ранних версиях доступны только дополнительные параметры hour, minutes и message. Другие дополнительные функции доступны в более поздних версиях платформы.
- Действие
ACTION_SET_ALARM- URI данных
- Нет
- MIME-тип
- Нет.
- Дополнительные материалы
-
EXTRA_HOUR- Час, на который нужно установить будильник.
EXTRA_MINUTES- Минуты для будильника.
EXTRA_MESSAGE- Специальное сообщение, которое поможет вам понять, какой будильник сработал.
EXTRA_DAYSArrayList, содержащий дни недели, в которые повторяется будильник. Каждый день должен быть объявлен с помощью целого числа из классаCalendar, напримерMONDAY.Если будильник должен сработать один раз, не указывайте этот параметр.
EXTRA_RINGTONE- URI
content:, указывающий на рингтон, который будет использоваться для будильника, илиVALUE_RINGTONE_SILENT, если рингтон не нужен.Чтобы использовать рингтон по умолчанию, не указывайте это дополнение.
EXTRA_VIBRATE- Логическое значение, указывающее, нужно ли использовать вибрацию для этого будильника.
EXTRA_SKIP_UI- Логическое значение, указывающее, должно ли приложение-ответчик пропускать свой интерфейс при установке будильника. Если значение true, приложение должно установить будильник, не запрашивая подтверждения.
Пример намерения:
Kotlin
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, приложение должно пропустить все окна подтверждения и запустить указанный таймер.
Пример намерения:
Kotlin
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.
Пример намерения:
Kotlin
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".
Пример намерения:
Kotlin
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) или более поздней версии, используйте следующий пример намерения.
Пример намерения:
Kotlin
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-тип
- Нет
- Дополнительные материалы
- Нет
Пример намерения:
Kotlin
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-тип
- Нет
- Дополнительные материалы
- Нет
Пример намерения:
Kotlin
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.
Результат Intent, переданный в обратный вызов onActivityResult(), содержит URI content:, указывающий на выбранный контакт. В ответе вашему приложению предоставляются временные разрешения на чтение этого контакта с помощью API поставщика контактов, даже если у приложения нет разрешения READ_CONTACTS.
Совет. Если вам нужен доступ только к определенной контактной информации, например номеру телефона или адресу электронной почты, ознакомьтесь со следующим разделом о том, как выбрать определенные контактные данные.
- Действие
ACTION_PICK- Схема URI данных
- Нет
- MIME-тип
Contacts.CONTENT_TYPE
Пример намерения:
Kotlin
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, как показано в предыдущем разделе. Результат предоставляет вам прямой доступ к нужным данным без необходимости выполнять более сложный запрос к поставщику контактов.
Результат Intent, переданный в обратный вызов onActivityResult(), содержит URI content:, указывающий на выбранные контактные данные. В ответе вашему приложению предоставляются временные разрешения на чтение данных контакта, даже если у приложения нет разрешения READ_CONTACTS.
- Действие
ACTION_PICK- Схема URI данных
- Нет
- MIME-тип
-
CommonDataKinds.Phone.CONTENT_TYPE- Выберите контакт с номером телефона.
CommonDataKinds.Email.CONTENT_TYPE- Выберите из контактов с адресом электронной почты.
CommonDataKinds.StructuredPostal.CONTENT_TYPE- Выберите из контактов с почтовым адресом.
или одно из множества других значений
CONTENT_TYPEв разделеContactsContract.
Пример намерения:
Kotlin
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 контакта.
Пример намерения:
Kotlin
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, чтобы вы могли заполнить поля контактной информации.
Пример намерения:
Kotlin
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, укажите Contacts.CONTENT_TYPE в качестве MIME-типа и добавьте всю известную информацию о контакте в дополнительные данные, указанные константами в ContactsContract.Intents.Insert.
- Действие
ACTION_INSERT- Схема URI данных
- Нет
- MIME-тип
Contacts.CONTENT_TYPE- Дополнительные материалы
- Одно или несколько дополнительных значений, определенных в
ContactsContract.Intents.Insert.
Пример намерения:
Kotlin
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- Массив строк со всеми адресами электронной почты получателей копии.
Intent.EXTRA_BCC- Массив строк со всеми адресами электронной почты получателей скрытых копий.
Intent.EXTRA_SUBJECT- Строка с темой письма.
Intent.EXTRA_TEXT- Строка с текстом письма.
Intent.EXTRA_STREAMUri, указывающий на прикрепленный файл. Если используется действиеACTION_SEND_MULTIPLE, то это будетArrayList, содержащий несколько объектовUri.
Пример намерения:
Kotlin
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:", как показано в следующем примере:
Kotlin
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:, file: или content:. Однако если вы хотите ограничить выбор файлов только теми, которые доступны у поставщика контента (URI content:) и в виде файлового потока с помощью 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().
Пример намерения для получения фотографии:
Kotlin
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 особенно полезно, когда нужно прочитать существующий файл, не копируя его в приложение, или открыть и отредактировать файл на месте.
Вы также можете разрешить пользователю выбирать несколько файлов, добавив в намерение 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().
Пример намерения для получения фотографии:
Kotlin
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-тип
- Нет
- Дополнительные материалы
- Нет
Пример намерения:
Kotlin
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 на карте будет показана вся Земля с центром в точке, заданной параметрами lat и lng. Максимальный уровень масштабирования – 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-тип
- Нет
Пример намерения:
Kotlin
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"- или любые другие, которые требуются вашему приложению.
Пример намерения:
Kotlin
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:Любой –
"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(обязательный) – строка, содержащая любую комбинацию альбома, исполнителя, жанра, плейлиста или названия. Это дополнение всегда предоставляется для обратной совместимости. Существующие приложения, которые не поддерживают режимы поиска, могут обрабатывать это намерение как неструктурированный поиск.
Пример намерения:
Если пользователь хочет послушать музыку определенного исполнителя, поисковое приложение может сгенерировать следующее намерение:
Kotlin
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, чтобы определить режим поиска. После того как ваше действие определит режим поиска, прочитайте значения дополнительных параметров для этого конкретного режима поиска.
Получив эту информацию, приложение может выполнить поиск в своем инвентаре и воспроизвести контент, соответствующий поисковому запросу. Это показано в примере ниже.
Kotlin
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 - Строка, содержащая текст примечания.
-
- "Позвони по номеру 555-5555".
- "Позвони Бобу".
- "Позвони на голосовую почту"
- Действие
-
ACTION_DIAL– открывает приложение для набора номера или приложение "Телефон".ACTION_CALL– совершает телефонный звонок (требуется разрешениеCALL_PHONE).
- Схема URI данных
-
tel:<phone-number>voicemail:<phone-number>
- MIME-тип
- Нет
tel:2125551212tel:(212) 555 1212- Действие
-
"com.google.android.gms.actions.SEARCH_ACTION"- Поддержка поисковых запросов из голосовых команд Google.
- Дополнительные материалы
-
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_STREAMUri, указывающий на изображение или видео, которое нужно прикрепить. Если используется действие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
- Если вы определили необходимые фильтры интентов, обработайте интент.
Пример намерения:
Kotlin
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. Когда приложение "Телефон" откроется, в нем появится номер телефона, и пользователю нужно будет нажать кнопку Позвонить, чтобы начать звонок.
Голосовое управление Google
Чтобы позвонить по телефону, используйте действие ACTION_CALL и укажите номер телефона, используя следующую схему URI. Когда приложение телефона открывается, оно начинает телефонный звонок. Пользователю не нужно нажимать кнопку Позвонить.
Для действия ACTION_CALL необходимо добавить в файл манифеста разрешение CALL_PHONE:
<uses-permission android:name="android.permission.CALL_PHONE" />
Действительные номера телефонов определены в IETF RFC 3966. Примеры допустимых значений:
Приложение "Телефон" хорошо нормализует схемы, например телефонные номера. Поэтому схема, описанная в методе Uri.parse(), не является строго обязательной.
Однако если вы не пробовали схему или не уверены, что она может быть обработана, используйте метод Uri.fromParts().
Пример намерения:
Kotlin
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 Ассистент. Дополнительную информацию можно найти в документации по действиям в приложениях для Google Ассистента.
Пример фильтра намерений:
<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.
Пример намерения:
Kotlin
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:
Пример намерения:
Kotlin
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-сообщение, используйте одно из следующих действий интента и укажите сведения о сообщении, такие как номер телефона, тема и текст сообщения, с помощью следующих дополнительных ключей.
Пример намерения:
Kotlin
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:", как показано в следующем примере:
Kotlin
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.
Веб-браузер
Загрузка URL – это стандартное действие для браузеров. Создайте фильтр интентов, чтобы сообщить о возможности приложения выполнять это действие, используя информацию из следующего раздела.
Загрузить URL
Чтобы открыть веб-страницу, используйте действие ACTION_VIEW и укажите URL в данных намерения.
Пример намерения:
Kotlin
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. Для этого выполните следующие действия:
Подробнее о том, как выполнять команды оболочки…