Объекты Intent позволяют запускать операцию в другом приложении – достаточно в объекте Intent описать простое действие, которое необходимо выполнить (например,"показать карту" или "сделать снимок"). Такой тип намерения называется неявным, поскольку в нем не указан компонент приложения, который нужно запустить, а задано действие и данные, необходимые для его выполнения.
Когда вы вызываете startActivity()
или startActivityForResult() и передаете ему неявное намерение, система разрешает намерение в приложение, которое может его обработать, и запускает соответствующий Activity. Если есть несколько приложений, которые могут обработать намерение, система предложит пользователю выбрать одно из них.
На этой странице описаны неявные намерения, которые можно использовать для выполнения распространенных действий. Они сгруппированы по типу приложения, обрабатывающего намерение. В каждом разделе также рассказывается, как создать фильтр намерений, чтобы рекламировать возможность приложения выполнять определенное действие.
Внимание! Если на устройстве нет приложений, которые могут получить неявное намерение, при вызове startActivity() приложение аварийно завершит работу. Чтобы проверить, есть ли приложение, которое может обработать намерение, вызовите метод resolveActivity() для объекта Intent. Если результат не равен null, значит есть хотя бы одно приложение, которое может обработать намерение, и можно безопасно вызвать startActivity(). Если результат равен null, не используйте намерение и, если возможно, отключите функцию, которая его вызывает.
Если вы не знаете, как создавать намерения и фильтры намерений, сначала прочитайте статью Намерения и фильтры намерений.
Чтобы узнать, как активировать намерения, перечисленные на этой странице, с хоста разработки, ознакомьтесь с разделом Проверка намерений с помощью Android Debug Bridge.
Голосовые команды Google Voice
Google Voice Actions активирует некоторые намерения, перечисленные на этой странице, в ответ на голосовые команды. Подробнее о начале работы с системными голосовыми действиями…
Будильник
Ниже перечислены распространенные действия, которые можно выполнять в приложениях-будильниках, а также информация, необходимая для создания фильтра намерений, чтобы рекламировать возможность вашего приложения выполнять каждое из этих действий.
Как создать будильник
Чтобы создать новый будильник, используйте действие ACTION_SET_ALARM
и укажите сведения о нем, например время и сообщение, с помощью следующих дополнительных параметров.
Примечание. В Android 2.3 (уровень API 9) и более ранних версиях доступны только дополнительные параметры часа, минут и сообщения. Остальные дополнительные функции доступны в более новых версиях платформы.
- Действие
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_OUTPUTextra.
- Действие
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 Contacts Provider, даже если у приложения нет разрешения 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_STREAM- Стрелка
Uri, указывающая на прикрепленный файл. Если используется действие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-тип. Ссылка на файл, возвращенная вашему приложению, действительна только в течение текущего жизненного цикла объекта activity. Если вы хотите получить доступ к файлу позже, вам нужно импортировать его копию.
Также пользователь может создать новый файл. Например, вместо того чтобы выбрать существующую фотографию, пользователь может сделать новую с помощью камеры.
Намерение результата, переданное в метод 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>
Подробнее о том, как сделать файлы, которыми управляет ваше приложение, доступными для открытия в других приложениях, рассказывается в статье Как открывать файлы с помощью Storage Access Framework.
Местные действия
Звонок в автосалон – распространенное местное действие. Создайте фильтр интентов, чтобы рекламировать возможность приложения выполнять это действие, используя информацию из следующего раздела.
Вызов такси
Чтобы вызвать такси, используйте действие 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_STREAM- Указатель
Uriна изображение или видео, которое нужно прикрепить. Если используется действиеACTION_SEND_MULTIPLE, этот дополнительный параметр представляет собой объектArrayListUri, указывающий на изображения или видео, которые нужно прикрепить.
- Действие
ACTION_VIEW- Схема URI данных
http:<URL>
https:<URL>- Тип MIME
-
"text/plain""text/html""application/xhtml+xml""application/vnd.wap.xhtml+xml"
- Настройте устройство Android для разработки или используйте виртуальное устройство.
- Установите версию приложения, которая поддерживает нужные вам намерения.
- Как активировать намерение с помощью
adbadb 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
- Если вы задали необходимые фильтры intent, обработайте intent.
Пример намерения:
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 Voice
Чтобы позвонить напрямую, используйте действие ACTION_CALL и укажите номер телефона, используя следующую схему URI: Когда откроется приложение "Телефон", начнется звонок. Пользователю не нужно нажимать кнопку Позвонить.
Для действия ACTION_CALL необходимо добавить в файл манифеста разрешение CALL_PHONE:
<uses-permission android:name="android.permission.CALL_PHONE" />
Действительными считаются номера телефонов, определенные в RFC 3966 IETF. Примеры допустимых ответов:
Приложение "Телефон" хорошо нормализует схемы, например номера телефонов. Таким образом, схема, описанная в методе 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 Ассистента. Подробнее о действиях в приложениях…
Пример фильтра интентов
<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); } }
Настройки
Чтобы открыть экран в системном приложении "Настройки", когда пользователю нужно что-то изменить, используйте одно из следующих действий намерения:
Пример намерения:
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 предоставляет функции, аналогичные функциям вашего сайта, добавьте фильтр intent для URL, которые указывают на ваш сайт. После этого, если у пользователя установлено ваше приложение, ссылки из электронных писем или других веб-страниц, ведущие на ваш сайт, будут открывать приложение для Android, а не веб-страницу. Подробнее о том, как настроить ссылки на приложения для Android…
В Android 12 (уровень API 31) и более поздних версиях общий intent для перехода на сайт разрешается в действие в приложении, только если приложение одобрено для определенного домена, указанного в этом intent. Если приложение не одобрено для домена, веб-намерение будет перенаправлено в браузер по умолчанию.
Как проверить намерения с помощью Android Debug Bridge
Чтобы проверить, реагирует ли ваше приложение на нужные вам намерения, вы можете использовать инструмент adb. Для этого выполните следующие действия:
Подробнее о том, как выполнять команды оболочки…