Общие намерения

Интент позволяет запустить активность в другом приложении, описав желаемое действие, например, «просмотреть карту» или «сделать снимок», в объекте Intent . Этот тип интента называется неявным интентом, поскольку он не указывает компонент приложения для запуска, а вместо этого определяет действие и предоставляет некоторые данные для его выполнения.

При вызове startActivity() или startActivityForResult() и передаче неявного намерения система определяет приложение, способное его обработать, и запускает соответствующее Activity . Если существует несколько приложений, способных обработать данное намерение, система отображает пользователю диалоговое окно для выбора приложения.

На этой странице описаны несколько неявных интентов, которые можно использовать для выполнения распространенных действий, сгруппированных по типу приложения, обрабатывающего интент. В каждом разделе также показано, как создать фильтр интентов , чтобы сообщить о возможности вашего приложения выполнять данное действие.

Внимание: если на устройстве нет приложений, способных принимать неявный интент, приложение аварийно завершит работу при вызове startActivity() . Чтобы сначала убедиться, что существует приложение, способное принимать интент, вызовите resolveActivity() для вашего объекта Intent . Если результат не равен null, значит, существует как минимум одно приложение, способное обработать интент, и вызов startActivity() безопасен. Если результат равен null, не используйте интент и, если возможно, отключите функцию, которая его вызывает.

Если вы не знакомы с тем, как создавать интенты или фильтры интентов, сначала прочтите разделы «Интенты» и «Фильтры интентов» .

Чтобы узнать, как запускать перечисленные на этой странице интенты с вашего хоста разработки, см. раздел «Проверка интентов с помощью Android Debug Bridge» .

Google Голосовые действия

Функция Google Voice Actions запускает некоторые из перечисленных на этой странице интентов в ответ на голосовые команды. Для получения дополнительной информации см. раздел «Начало работы с системными голосовыми действиями» .

Будильник

Ниже перечислены типичные действия для приложений-будильников, включая информацию, необходимую для создания фильтра намерений, который будет сообщать о возможности вашего приложения выполнять каждое из этих действий.

Создать будильник

Google Голосовые действия

  • "Установите будильник на 7 утра"

Для создания нового будильника используйте действие ACTION_SET_ALARM и укажите подробные сведения о будильнике, такие как время и сообщение, используя следующие дополнительные параметры.

Примечание: В Android 2.3 (уровень API 9) и ниже доступны только дополнительные функции отображения часов, минут и сообщений. Остальные функции доступны в более высоких версиях платформы.

Действие
ACTION_SET_ALARM
URI данных
Никто
Тип MIME
Никто
Дополнительные материалы
EXTRA_HOUR
Час будильника.
EXTRA_MINUTES
Минуты до срабатывания будильника.
EXTRA_MESSAGE
Пользовательское сообщение для идентификации сигнала тревоги.
EXTRA_DAYS
ArrayList содержащий все дни недели, в которые повторяется этот будильник. Каждый день должен быть объявлен целочисленным значением из класса Calendar , например, MONDAY .

Если это разовый будильник, не указывайте эту дополнительную опцию.

EXTRA_RINGTONE
content: URI, указывающий мелодию звонка для использования с будильником, или VALUE_RINGTONE_SILENT для отсутствия мелодии звонка.

Чтобы использовать мелодию звонка по умолчанию, не указывайте этот дополнительный параметр.

EXTRA_VIBRATE
Логическое значение, указывающее, следует ли вибрировать при срабатывании этого сигнала тревоги.
EXTRA_SKIP_UI
Логическое значение, указывающее, должно ли отвечающее приложение пропускать свой пользовательский интерфейс при установке будильника. Если true, приложение должно пропустить любой подтверждающий интерфейс и установить указанный будильник.

Пример намерения:

Котлин

fun createAlarm(message: String, hour: Int, minutes: Int) {
    val intent = Intent(AlarmClock.ACTION_SET_ALARM).apply {
        putExtra(AlarmClock.EXTRA_MESSAGE, message)
        putExtra(AlarmClock.EXTRA_HOUR, hour)
        putExtra(AlarmClock.EXTRA_MINUTES, minutes)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

public void createAlarm(String message, int hour, int minutes) {
    Intent intent = new Intent(AlarmClock.ACTION_SET_ALARM)
            .putExtra(AlarmClock.EXTRA_MESSAGE, message)
            .putExtra(AlarmClock.EXTRA_HOUR, hour)
            .putExtra(AlarmClock.EXTRA_MINUTES, minutes);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}
Примечание:

Для вызова интента ACTION_SET_ALARM ваше приложение должно иметь разрешение SET_ALARM :

<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />

Пример фильтра намерений:

<activity ...>
    <intent-filter>
        <action android:name="android.intent.action.SET_ALARM" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

Создать таймер

Google Голосовые действия

  • "Установить таймер на 5 минут"

Для создания таймера обратного отсчета используйте действие ACTION_SET_TIMER и укажите параметры таймера, такие как продолжительность, используя следующие дополнительные параметры.

Примечание: Этот интент доступен в Android 4.4 (уровень API 19) и выше.

Действие
ACTION_SET_TIMER
URI данных
Никто
Тип MIME
Никто
Дополнительные материалы
EXTRA_LENGTH
Длительность таймера в секундах.
EXTRA_MESSAGE
Пользовательское сообщение для идентификации таймера.
EXTRA_SKIP_UI
Логическое значение, указывающее, должно ли отвечающее приложение пропускать свой пользовательский интерфейс при установке таймера. Если true, приложение должно пропустить любое подтверждающее окно интерфейса и запустить указанный таймер.

Пример намерения:

Котлин

fun startTimer(message: String, seconds: Int) {
    val intent = Intent(AlarmClock.ACTION_SET_TIMER).apply {
        putExtra(AlarmClock.EXTRA_MESSAGE, message)
        putExtra(AlarmClock.EXTRA_LENGTH, seconds)
        putExtra(AlarmClock.EXTRA_SKIP_UI, true)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

public void startTimer(String message, int seconds) {
    Intent intent = new Intent(AlarmClock.ACTION_SET_TIMER)
            .putExtra(AlarmClock.EXTRA_MESSAGE, message)
            .putExtra(AlarmClock.EXTRA_LENGTH, seconds)
            .putExtra(AlarmClock.EXTRA_SKIP_UI, true);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}
Примечание:

Для вызова интента ACTION_SET_TIMER ваше приложение должно иметь разрешение SET_ALARM :

<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />

Пример фильтра намерений:

<activity ...>
    <intent-filter>
        <action android:name="android.intent.action.SET_TIMER" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

Показать все оповещения

Чтобы отобразить список тревожных сигналов, используйте действие ACTION_SHOW_ALARMS .

Хотя не многие приложения используют этот интент, поскольку он в основном применяется системными приложениями, любое приложение, выполняющее функцию будильника, может реализовать этот фильтр интента и ответить, отобразив список текущих будильников.

Примечание: Этот интент доступен в Android 4.4 (уровень API 19) и выше.

Действие
ACTION_SHOW_ALARMS
URI данных
Никто
Тип MIME
Никто

Пример фильтра намерений:

<activity ...>
    <intent-filter>
        <action android:name="android.intent.action.SHOW_ALARMS" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

Календарь

Добавление события — распространенное действие для приложений-календарей. Создайте фильтр намерений, чтобы сообщить о возможности вашего приложения выполнять это действие, используя информацию из следующего раздела.

Добавить событие в календарь

Чтобы добавить новое событие в календарь пользователя, используйте действие ACTION_INSERT и укажите URI данных с помощью Events.CONTENT_URI . Затем вы можете указать различные детали события, используя следующие дополнительные параметры.

Действие
ACTION_INSERT
URI данных
Events.CONTENT_URI
Тип MIME
"vnd.android.cursor.dir/event"
Дополнительные материалы
EXTRA_EVENT_ALL_DAY
Логическое значение, указывающее, является ли это мероприятие мероприятием на весь день.
EXTRA_EVENT_BEGIN_TIME
Время начала события (миллисекунды с начала эпохи).
EXTRA_EVENT_END_TIME
Время окончания события (миллисекунды с начала эпохи).
TITLE
Название мероприятия.
DESCRIPTION
Описание мероприятия.
EVENT_LOCATION
Место проведения мероприятия.
EXTRA_EMAIL
Список адресов электронной почты, разделенных запятыми, с указанием приглашенных лиц.

Множество дополнительных деталей событий можно указать, используя константы, определенные в классе CalendarContract.EventsColumns .

Пример намерения:

Котлин

fun addEvent(title: String, location: String, begin: Long, end: Long) {
    val intent = Intent(Intent.ACTION_INSERT).apply {
        data = Events.CONTENT_URI
        putExtra(Events.TITLE, title)
        putExtra(Events.EVENT_LOCATION, location)
        putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, begin)
        putExtra(CalendarContract.EXTRA_EVENT_END_TIME, end)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

public void addEvent(String title, String location, long begin, long end) {
    Intent intent = new Intent(Intent.ACTION_INSERT)
            .setData(Events.CONTENT_URI)
            .putExtra(Events.TITLE, title)
            .putExtra(Events.EVENT_LOCATION, location)
            .putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, begin)
            .putExtra(CalendarContract.EXTRA_EVENT_END_TIME, end);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

Пример фильтра намерений:

<activity ...>
    <intent-filter>
        <action android:name="android.intent.action.INSERT" />
        <data android:mimeType="vnd.android.cursor.dir/event" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

Камера

Ниже перечислены распространенные действия для приложений камеры, включая информацию, необходимую для создания фильтра намерений, который будет рекламировать способность вашего приложения выполнять каждое из этих действий.

Сделайте снимок или видео и верните его.

Чтобы открыть приложение камеры и получить полученное фото или видео, используйте действие ACTION_IMAGE_CAPTURE или ACTION_VIDEO_CAPTURE . Также укажите URI-адрес, куда вы хотите сохранить фото или видео, в параметре EXTRA_OUTPUT .

Действие
ACTION_IMAGE_CAPTURE или
ACTION_VIDEO_CAPTURE
Схема URI данных
Никто
Тип MIME
Никто
Дополнительные материалы
EXTRA_OUTPUT
URI-адрес, по которому приложение камеры сохраняет фото- или видеофайл (в виде объекта Uri ).

Когда приложение камеры успешно возвращает фокус на ваше действие — другими словами, ваше приложение получает обратный вызов onActivityResult() — вы можете получить доступ к фотографии или видео по URI, указанному вами со значением EXTRA_OUTPUT .

Примечание: При использовании ACTION_IMAGE_CAPTURE для захвата фотографии камера может также вернуть уменьшенную копию или миниатюру фотографии в результирующем Intent , сохраненную в виде Bitmap в дополнительном поле с именем "data" .

Пример намерения:

Котлин

const val REQUEST_IMAGE_CAPTURE = 1
val locationForPhotos: Uri = ...

fun capturePhoto(targetFilename: String) {
    val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE).apply {
        putExtra(MediaStore.EXTRA_OUTPUT, Uri.withAppendedPath(locationForPhotos, targetFilename))
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivityForResult(intent, REQUEST_IMAGE_CAPTURE)
    }
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == Activity.RESULT_OK) {
        val thumbnail: Bitmap = data.getParcelableExtra("data")
        // Do other work with full size photo saved in locationForPhotos.
        ...
    }
}

Java

static final int REQUEST_IMAGE_CAPTURE = 1;
static final Uri locationForPhotos;

public void capturePhoto(String targetFilename) {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT,
            Uri.withAppendedPath(locationForPhotos, targetFilename));
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(intent, REQUEST_IMAGE_CAPTURE);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
        Bitmap thumbnail = data.getParcelableExtra("data");
        // Do other work with full size photo saved in locationForPhotos.
        ...
    }
}

Для этого при работе с Android 12 (уровень API 31) или выше, обратитесь к следующему примеру Intent.

Пример намерения:

Котлин

val REQUEST_IMAGE_CAPTURE = 1

private fun dispatchTakePictureIntent() {
    val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
    try {
        startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE)
    } catch (e: ActivityNotFoundException) {
        // Display error state to the user.
    }
}

Java

static final int REQUEST_IMAGE_CAPTURE = 1;

private void dispatchTakePictureIntent() {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    try {
        startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
    } catch (ActivityNotFoundException e) {
        // Display error state to the user.
    }
}
</section></div>

Для получения дополнительной информации о том, как использовать это намерение для создания фотографии, включая создание соответствующего Uri для места сохранения результата, прочитайте разделы «Сделать фотографии» или «Снять видео» .

Пример фильтра намерений:

<activity ...>
    <intent-filter>
        <action android:name="android.media.action.IMAGE_CAPTURE" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

При обработке этого намерения настройте свою активность так, чтобы она проверяла наличие дополнительного параметра EXTRA_OUTPUT во входящем Intent , затем сохраняла захваченное изображение или видео в месте, указанном этим параметром, и вызывала setResult() с Intent , которое включает сжатую миниатюру в дополнительном параметре с именем "data" .

Запустите приложение камеры в режиме фотосъемки.

Google Голосовые действия

  • "сфотографируйте"

Чтобы открыть приложение камеры в режиме фотосъемки, используйте действие INTENT_ACTION_STILL_IMAGE_CAMERA .

Действие
INTENT_ACTION_STILL_IMAGE_CAMERA
Схема URI данных
Никто
Тип MIME
Никто
Дополнительные материалы
Никто

Пример намерения:

Котлин

private fun dispatchTakePictureIntent() {
    val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
    try {
        startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE)
    } catch (e: ActivityNotFoundException) {
        // Display error state to the user.
    }
}

Java

public void capturePhoto(String targetFilename) {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT,
            Uri.withAppendedPath(locationForPhotos, targetFilename));
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(intent, REQUEST_IMAGE_CAPTURE);
    }
}

Пример фильтра намерений:

<activity ...>
    <intent-filter>
        <action android:name="android.media.action.STILL_IMAGE_CAMERA" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

Запустить приложение камеры в режиме видеосъемки

Google Голосовые действия

  • "записать видео"

Чтобы открыть приложение камеры в режиме видеосъемки, используйте действие INTENT_ACTION_VIDEO_CAMERA .

Действие
INTENT_ACTION_VIDEO_CAMERA
Схема URI данных
Никто
Тип MIME
Никто
Дополнительные материалы
Никто

Пример намерения:

Котлин

fun capturePhoto() {
    val intent = Intent(MediaStore.INTENT_ACTION_VIDEO_CAMERA)
    if (intent.resolveActivity(packageManager) != null) {
        startActivityForResult(intent, REQUEST_IMAGE_CAPTURE)
    }
}

Java

public void capturePhoto() {
    Intent intent = new Intent(MediaStore.INTENT_ACTION_VIDEO_CAMERA);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(intent, REQUEST_IMAGE_CAPTURE);
    }
}

Пример фильтра намерений:

<activity ...>
    <intent-filter>
        <action android:name="android.media.action.VIDEO_CAMERA" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

Приложение «Контакты/Люди»

Ниже перечислены типичные действия для приложений управления контактами, включая информацию, необходимую для создания фильтра намерений, который будет рекламировать возможность вашего приложения выполнять каждое из этих действий.

Выберите контакт

Чтобы пользователь мог выбрать контакт и предоставить вашему приложению доступ ко всей контактной информации, используйте действие ACTION_PICK и укажите MIME-тип Contacts.CONTENT_TYPE .

В результате выполнения функции обратного вызова onActivityResult() передается Intent content: URI, указывающий на выбранный контакт. Ответ предоставляет вашему приложению временные разрешения на чтение этого контакта с помощью API поставщика контактов , даже если ваше приложение не включает разрешение READ_CONTACTS .

Совет: Если вам нужен доступ только к определенной контактной информации, например, к номеру телефона или адресу электронной почты, обратитесь к следующему разделу о том, как выбрать конкретные контактные данные .

Действие
ACTION_PICK
Схема URI данных
Никто
Тип MIME
Contacts.CONTENT_TYPE

Пример намерения:

Котлин

const val REQUEST_SELECT_CONTACT = 1

fun selectContact() {
    val intent = Intent(Intent.ACTION_PICK).apply {
        type = ContactsContract.Contacts.CONTENT_TYPE
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivityForResult(intent, REQUEST_SELECT_CONTACT)
    }
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
    if (requestCode == REQUEST_SELECT_CONTACT && resultCode == RESULT_OK) {
        val contactUri: Uri = data.data
        // Do something with the selected contact at contactUri.
        //...
    }
}

Java

static final int REQUEST_SELECT_CONTACT = 1;

public void selectContact() {
    Intent intent = new Intent(Intent.ACTION_PICK);
    intent.setType(ContactsContract.Contacts.CONTENT_TYPE);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(intent, REQUEST_SELECT_CONTACT);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_SELECT_CONTACT && resultCode == RESULT_OK) {
        Uri contactUri = data.getData();
        // Do something with the selected contact at contactUri.
        ...
    }
}

Чтобы узнать, как получить контактные данные после того, как у вас есть URI контакта, прочитайте раздел «Получение сведений о контакте» .

При получении URI контакта с помощью этого интента вам, как правило, не требуется разрешение READ_CONTACTS для чтения основных сведений о контакте, таких как отображаемое имя и статус «помечен» (например, «избран»). Однако, если вы пытаетесь прочитать более конкретные данные о конкретном контакте — например, его номер телефона или адрес электронной почты — вам потребуется разрешение READ_CONTACTS .

Выберите конкретные контактные данные

Чтобы пользователь мог выбрать определенную информацию из контакта, например номер телефона, адрес электронной почты или другой тип данных, используйте действие ACTION_PICK и укажите MIME-тип одного из следующих типов содержимого, например CommonDataKinds.Phone.CONTENT_TYPE чтобы получить номер телефона контакта.

Примечание: Во многих случаях вашему приложению необходимо иметь разрешение READ_CONTACTS для просмотра конкретной информации о конкретном контакте.

Если вам нужно получить только один тип данных из контакта, этот метод с использованием CONTENT_TYPE из классов ContactsContract.CommonDataKinds более эффективен, чем использование Contacts.CONTENT_TYPE , как показано в предыдущем разделе. В результате вы получаете прямой доступ к нужным данным без необходимости выполнения более сложного запроса к поставщику контактов .

В результате выполнения функции обратного вызова onActivityResult() передается Intent content: содержащий URI, указывающий на выбранные контактные данные. Ответ предоставляет вашему приложению временные разрешения на чтение этих контактных данных, даже если ваше приложение не включает разрешение READ_CONTACTS .

Действие
ACTION_PICK
Схема URI данных
Никто
Тип MIME
CommonDataKinds.Phone.CONTENT_TYPE
Выберите контакты, у которых есть номер телефона.
CommonDataKinds.Email.CONTENT_TYPE
Выберите контакты, имеющие адрес электронной почты.
CommonDataKinds.StructuredPostal.CONTENT_TYPE
Выберите контактные данные, содержащие почтовый адрес.

Или одно из множества других значений CONTENT_TYPE в разделе ContactsContract .

Пример намерения:

Котлин

const val REQUEST_SELECT_PHONE_NUMBER = 1

fun selectContact() {
    // Start an activity for the user to pick a phone number from contacts.
    val intent = Intent(Intent.ACTION_PICK).apply {
        type = CommonDataKinds.Phone.CONTENT_TYPE
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivityForResult(intent, REQUEST_SELECT_PHONE_NUMBER)
    }
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
    if (requestCode == REQUEST_SELECT_PHONE_NUMBER && resultCode == Activity.RESULT_OK) {
        // Get the URI and query the content provider for the phone number.
        val contactUri: Uri = data.data
        val projection: Array<String> = arrayOf(CommonDataKinds.Phone.NUMBER)
        contentResolver.query(contactUri, projection, null, null, null).use { cursor ->
            // If the cursor returned is valid, get the phone number.
            if (cursor.moveToFirst()) {
                val numberIndex = cursor.getColumnIndex(CommonDataKinds.Phone.NUMBER)
                val number = cursor.getString(numberIndex)
                // Do something with the phone number.
                ...
            }
        }
    }
}

Java

static final int REQUEST_SELECT_PHONE_NUMBER = 1;

public void selectContact() {
    // Start an activity for the user to pick a phone number from contacts.
    Intent intent = new Intent(Intent.ACTION_PICK);
    intent.setType(CommonDataKinds.Phone.CONTENT_TYPE);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(intent, REQUEST_SELECT_PHONE_NUMBER);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_SELECT_PHONE_NUMBER && resultCode == RESULT_OK) {
        // Get the URI and query the content provider for the phone number.
        Uri contactUri = data.getData();
        String[] projection = new String[]{CommonDataKinds.Phone.NUMBER};
        Cursor cursor = getContentResolver().query(contactUri, projection,
                null, null, null);
        // If the cursor returned is valid, get the phone number.
        if (cursor != null && cursor.moveToFirst()) {
            int numberIndex = cursor.getColumnIndex(CommonDataKinds.Phone.NUMBER);
            String number = cursor.getString(numberIndex);
            // Do something with the phone number.
            //...
        }
    }
}

Просмотреть контакт

Чтобы отобразить подробную информацию об известном контакте, используйте действие ACTION_VIEW и укажите контакт с URI content: в качестве данных намерения.

Существует два основных способа первоначального получения URI контакта:

  • Используйте URI контакта, возвращаемый действием ACTION_PICK , показанным в предыдущем разделе. Этот подход не требует никаких разрешений приложения.
  • Получите доступ к списку всех контактов напрямую, как описано в разделе «Получение списка контактов» . Для этого требуется разрешение READ_CONTACTS .
Действие
ACTION_VIEW
Схема URI данных
content:<URI>
Тип MIME
Нет. Тип определяется по URI контакта.

Пример намерения:

Котлин

fun viewContact(contactUri: Uri) {
    val intent = Intent(Intent.ACTION_VIEW, contactUri)
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

public void viewContact(Uri contactUri) {
    Intent intent = new Intent(Intent.ACTION_VIEW, contactUri);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

Редактировать существующий контакт

Для редактирования известного контакта используйте действие ACTION_EDIT , укажите контакт с URI content: в качестве данных намерения и включите любую известную информацию о контакте в дополнительные параметры, указанные константами в ContactsContract.Intents.Insert .

Существует два основных способа первоначального получения URI контакта:

  • Используйте URI контакта, возвращаемый действием ACTION_PICK , показанным в предыдущем разделе. Этот подход не требует никаких разрешений приложения.
  • Получите доступ к списку всех контактов напрямую, как описано в разделе «Получение списка контактов» . Для этого требуется разрешение READ_CONTACTS .
Действие
ACTION_EDIT
Схема URI данных
content:<URI>
Тип MIME
Тип определяется по URI контакта.
Дополнительные материалы
Один или несколько дополнительных параметров, определенных в ContactsContract.Intents.Insert , позволяют заполнять поля контактной информации.

Пример намерения:

Котлин

fun editContact(contactUri: Uri, email: String) {
    val intent = Intent(Intent.ACTION_EDIT).apply {
        data = contactUri
        putExtra(ContactsContract.Intents.Insert.EMAIL, email)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

public void editContact(Uri contactUri, String email) {
    Intent intent = new Intent(Intent.ACTION_EDIT);
    intent.setData(contactUri);
    intent.putExtra(Intents.Insert.EMAIL, email);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

Для получения дополнительной информации о редактировании контакта, ознакомьтесь с разделом «Изменение контактов с помощью интентов» .

Вставьте контакт

Для добавления нового контакта используйте действие ACTION_INSERT , укажите тип MIME Contacts.CONTENT_TYPE и включите любую известную информацию о контакте в дополнительные данные, указанные константами в ContactsContract.Intents.Insert .

Действие
ACTION_INSERT
Схема URI данных
Никто
Тип MIME
Contacts.CONTENT_TYPE
Дополнительные материалы
Один или несколько дополнительных параметров, определенных в ContactsContract.Intents.Insert .

Пример намерения:

Котлин

fun insertContact(name: String, email: String) {
    val intent = Intent(Intent.ACTION_INSERT).apply {
        type = ContactsContract.Contacts.CONTENT_TYPE
        putExtra(ContactsContract.Intents.Insert.NAME, name)
        putExtra(ContactsContract.Intents.Insert.EMAIL, email)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

public void insertContact(String name, String email) {
    Intent intent = new Intent(Intent.ACTION_INSERT);
    intent.setType(Contacts.CONTENT_TYPE);
    intent.putExtra(Intents.Insert.NAME, name);
    intent.putExtra(Intents.Insert.EMAIL, email);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

Для получения дополнительной информации о том, как добавить контакт, прочитайте раздел «Изменение контактов с помощью интентов» .

Электронная почта

Создание электронного письма с необязательными вложениями — распространенная функция почтовых приложений. Используйте информацию из следующего раздела, чтобы создать фильтр намерений, который будет сообщать о возможности вашего приложения выполнять это действие.

Составьте электронное письмо с возможностью прикрепления файлов.

Для составления электронного письма используйте одно из следующих действий в зависимости от того, будете ли вы добавлять вложения или нет, и укажите такие данные, как получатель и тема, используя дополнительные ключи, указанные в списке.

Действие
ACTION_SENDTO (для случаев отсутствия вложений) или
ACTION_SEND (для одного вложения) или
ACTION_SEND_MULTIPLE (для нескольких вложений)
Схема URI данных
Никто
Тип MIME
"text/plain"
"*/*"
Дополнительные материалы
Intent.EXTRA_EMAIL
Массив строк со всеми адресами электронной почты получателей, указанными в поле «Кому».
Intent.EXTRA_CC
Массив строк со всеми адресами электронной почты получателей, получавших копию письма (CC).
Intent.EXTRA_BCC
Массив строк со всеми адресами электронной почты получателей, начинающимися с "BCC".
Intent.EXTRA_SUBJECT
Строка, содержащая тему электронного письма.
Intent.EXTRA_TEXT
Строка, содержащая текст электронного письма.
Intent.EXTRA_STREAM
Uri , указывающий на вложение. При использовании действия ACTION_SEND_MULTIPLE это будет ArrayList , содержащий несколько объектов Uri .

Пример намерения:

Котлин

fun composeEmail(addresses: Array<String>, subject: String, attachment: Uri) {
    val intent = Intent(Intent.ACTION_SEND).apply {
        type = "*/*"
        putExtra(Intent.EXTRA_EMAIL, addresses)
        putExtra(Intent.EXTRA_SUBJECT, subject)
        putExtra(Intent.EXTRA_STREAM, attachment)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

public void composeEmail(String[] addresses, String subject, Uri attachment) {
    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.setType("*/*");
    intent.putExtra(Intent.EXTRA_EMAIL, addresses);
    intent.putExtra(Intent.EXTRA_SUBJECT, subject);
    intent.putExtra(Intent.EXTRA_STREAM, attachment);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

Если вы хотите убедиться, что ваше намерение будет обработано только почтовым приложением, а не приложением для обмена текстовыми сообщениями или социальными сетями, используйте действие ACTION_SENDTO и укажите схему данных "mailto:" , как показано в следующем примере:

Котлин

fun composeEmail(addresses: Array<String>, subject: String) {
    val intent = Intent(Intent.ACTION_SENDTO).apply {
        data = Uri.parse("mailto:") // Only email apps handle this.
        putExtra(Intent.EXTRA_EMAIL, addresses)
        putExtra(Intent.EXTRA_SUBJECT, subject)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

public void composeEmail(String[] addresses, String subject) {
    Intent intent = new Intent(Intent.ACTION_SENDTO);
    intent.setData(Uri.parse("mailto:")); // Only email apps handle this.
    intent.putExtra(Intent.EXTRA_EMAIL, addresses);
    intent.putExtra(Intent.EXTRA_SUBJECT, subject);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

Пример фильтра намерений:

<activity ...>
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <data android:type="*/*" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.SENDTO" />
        <data android:scheme="mailto" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

Хранилище файлов

Ниже описаны типичные действия для приложений, хранящих файлы, включая информацию, необходимую для создания фильтра намерений, который будет сообщать о возможности вашего приложения выполнять каждое из этих действий.

Получить файл определенного типа

Чтобы запросить у пользователя выбор файла, например документа или фотографии, и получить ссылку на него в вашем приложении, используйте действие ACTION_GET_CONTENT и укажите желаемый MIME-тип. Возвращаемая ссылка на файл является временной и привязана к текущему жизненному циклу вашей активности, поэтому, если вы захотите получить к ней доступ позже, вам необходимо импортировать копию, которую вы сможете прочитать позже.

Эта функция также позволяет пользователю создать новый файл в процессе работы. Например, вместо выбора существующей фотографии пользователь может сделать новый снимок с помощью камеры.

Результат, передаваемый в метод onActivityResult() , включает данные с URI, указывающим на файл. URI может быть любым, например, http: URI, file: URI или content: URI. Однако, если вы хотите ограничить выборку только теми файлами, которые доступны через поставщика контента ( content: URI) и которые доступны в виде файлового потока с помощью openFileDescriptor() , добавьте категорию CATEGORY_OPENABLE к вашему намерению.

На Android 4.3 (уровень API 18) и выше вы также можете позволить пользователю выбирать несколько файлов, добавив в Intent параметр EXTRA_ALLOW_MULTIPLE со значением true . Затем вы можете получить доступ к каждому из выбранных файлов в объекте ClipData , возвращаемом функцией getClipData() .

Действие
ACTION_GET_CONTENT
Схема URI данных
Никто
Тип MIME
MIME-тип, соответствующий типу файла, который пользователь должен выбрать.
Дополнительные материалы
EXTRA_ALLOW_MULTIPLE
Логическое значение, указывающее, может ли пользователь выбрать более одного файла одновременно.
EXTRA_LOCAL_ONLY
Логическое значение, указывающее, должен ли возвращаемый файл быть доступен непосредственно с устройства, а не требовать загрузки из удаленного сервиса.
Категория (необязательно)
CATEGORY_OPENABLE
Чтобы возвращать только "открываемые" файлы, которые могут быть представлены в виде файлового потока с помощью openFileDescriptor() .

Пример намерения сделать фотографию:

Котлин

const val REQUEST_IMAGE_GET = 1

fun selectImage() {
    val intent = Intent(Intent.ACTION_GET_CONTENT).apply {
        type = "image/*"
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivityForResult(intent, REQUEST_IMAGE_GET)
    }
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
    if (requestCode == REQUEST_IMAGE_GET && resultCode == Activity.RESULT_OK) {
        val thumbnail: Bitmap = data.getParcelableExtra("data")
        val fullPhotoUri: Uri = data.data
        // Do work with photo saved at fullPhotoUri.
        ...
    }
}

Java

static final int REQUEST_IMAGE_GET = 1;

public void selectImage() {
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("image/*");
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(intent, REQUEST_IMAGE_GET);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_IMAGE_GET && resultCode == RESULT_OK) {
        Bitmap thumbnail = data.getParcelable("data");
        Uri fullPhotoUri = data.getData();
        // Do work with photo saved at fullPhotoUri.
        ...
    }
}

Пример фильтра намерений для возврата фотографии:

<activity ...>
    <intent-filter>
        <action android:name="android.intent.action.GET_CONTENT" />
        <data android:type="image/*" />
        <category android:name="android.intent.category.DEFAULT" />
        <!-- The OPENABLE category declares that the returned file is accessible
             from a content provider that supports OpenableColumns
             and ContentResolver.openFileDescriptor(). -->
        <category android:name="android.intent.category.OPENABLE" />
    </intent-filter>
</activity>

Открыть файл определенного типа

Вместо получения копии файла, которую необходимо импортировать в приложение, используя действие ACTION_GET_CONTENT , на Android 4.4 и выше вы можете запросить открытие файла, управляемого другим приложением, используя действие ACTION_OPEN_DOCUMENT и указав MIME-тип. Чтобы также позволить пользователю создать новый документ, в который ваше приложение сможет записывать данные, используйте вместо этого действие ACTION_CREATE_DOCUMENT .

Например, вместо выбора из существующих PDF-документов, намерение ACTION_CREATE_DOCUMENT позволяет пользователям выбрать место, где они хотели бы создать новый документ, например, в другом приложении, которое управляет хранением документа. Затем ваше приложение получает URI-адрес, куда оно может записать новый документ.

В то время как намерение, передаваемое в метод onActivityResult() из действия ACTION_GET_CONTENT может возвращать URI любого типа, намерение результата из ACTION_OPEN_DOCUMENT и ACTION_CREATE_DOCUMENT всегда указывает выбранный файл как URI content: поддерживаемый DocumentsProvider . Вы можете открыть файл с помощью openFileDescriptor() и запросить его подробные сведения, используя столбцы из DocumentsContract.Document .

Возвращаемый URI предоставляет вашему приложению долговременный доступ на чтение файла, а также, возможно, доступ на запись. Действие ACTION_OPEN_DOCUMENT особенно полезно, когда вы хотите прочитать существующий файл, не создавая его копию в приложении, или когда вы хотите открыть и отредактировать файл на месте.

Вы также можете разрешить пользователю выбирать несколько файлов, добавив в Intent параметр EXTRA_ALLOW_MULTIPLE со значением true . Если пользователь выбирает только один элемент, вы можете получить его из getData() . Если пользователь выбирает более одного элемента, метод getData() возвращает null, и вам необходимо получить каждый элемент из объекта ClipData , который возвращается методом getClipData() .

Примечание: В вашем намерении необходимо указать MIME-тип и объявить категорию CATEGORY_OPENABLE . При необходимости вы можете указать более одного MIME-типа, добавив массив MIME-типов с помощью параметра EXTRA_MIME_TYPES — в этом случае вы должны установить основной MIME-тип в setType() равным "*/*" .

Действие
ACTION_OPEN_DOCUMENT или
ACTION_CREATE_DOCUMENT
Схема URI данных
Никто
Тип MIME
MIME-тип, соответствующий типу файла, который пользователь должен выбрать.
Дополнительные материалы
EXTRA_MIME_TYPES
Массив MIME-типов, соответствующих типам файлов, запрашиваемых вашим приложением. При использовании этого дополнительного параметра необходимо установить основной MIME-тип в setType() равным "*/*" .
EXTRA_ALLOW_MULTIPLE
Логическое значение, указывающее, может ли пользователь выбрать более одного файла одновременно.
EXTRA_TITLE
Используется совместно с ACTION_CREATE_DOCUMENT для указания начального имени файла.
EXTRA_LOCAL_ONLY
Логическое значение, указывающее, должен ли возвращаемый файл быть доступен непосредственно с устройства, а не требовать загрузки из удаленного сервиса.
Категория
CATEGORY_OPENABLE
Чтобы возвращать только "открываемые" файлы, которые могут быть представлены в виде файлового потока с помощью openFileDescriptor() .

Пример намерения сделать фотографию:

Котлин

const val REQUEST_IMAGE_OPEN = 1

fun selectImage2() {
    val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
        type = "image/*"
        addCategory(Intent.CATEGORY_OPENABLE)
    }
    // Only the system receives the ACTION_OPEN_DOCUMENT, so no need to test.
    startActivityForResult(intent, REQUEST_IMAGE_OPEN)
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
    if (requestCode == REQUEST_IMAGE_OPEN && resultCode == Activity.RESULT_OK) {
        val fullPhotoUri: Uri = data.data
        // Do work with full size photo saved at fullPhotoUri.
        ...
    }
}

Java

static final int REQUEST_IMAGE_OPEN = 1;

public void selectImage() {
    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
    intent.setType("image/*");
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    // Only the system receives the ACTION_OPEN_DOCUMENT, so no need to test.
    startActivityForResult(intent, REQUEST_IMAGE_OPEN);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_IMAGE_OPEN && resultCode == RESULT_OK) {
        Uri fullPhotoUri = data.getData();
        // Do work with full size photo saved at fullPhotoUri.
        ...
    }
}

Сторонние приложения не могут реагировать на намерение с действием ACTION_OPEN_DOCUMENT . Вместо этого система получает это намерение и отображает все файлы, доступные из различных приложений, в едином пользовательском интерфейсе.

Чтобы отобразить файлы вашего приложения в этом пользовательском интерфейсе и позволить другим приложениям открывать их, необходимо реализовать DocumentsProvider и добавить фильтр намерений для PROVIDER_INTERFACE ( "android.content.action.DOCUMENTS_PROVIDER" ), как показано в следующем примере:

<provider ...
    android:grantUriPermissions="true"
    android:exported="true"
    android:permission="android.permission.MANAGE_DOCUMENTS">
    <intent-filter>
        <action android:name="android.content.action.DOCUMENTS_PROVIDER" />
    </intent-filter>
</provider>

Для получения дополнительной информации о том, как сделать файлы, управляемые вашим приложением, доступными для открытия другими приложениями, прочитайте статью «Открытие файлов с помощью фреймворка доступа к хранилищу» .

Местные действия

Вызов автомобиля — распространённое локальное действие. Создайте фильтр намерений, чтобы сообщить о возможности вашего приложения выполнять это действие, используя информацию из следующего раздела.

Вызовите машину

Google Голосовые действия

  • "Вызовите мне такси"
  • "Вызови меня машиной"

(Только для Wear OS)

Для вызова такси используйте действие ACTION_RESERVE_TAXI_RESERVATION .

Примечание: Перед выполнением этого действия приложение должно запросить подтверждение у пользователя.

Действие
ACTION_RESERVE_TAXI_RESERVATION
URI данных
Никто
Тип MIME
Никто
Дополнительные материалы
Никто

Пример намерения:

Котлин

fun callCar() {
    val intent = Intent(ReserveIntents.ACTION_RESERVE_TAXI_RESERVATION)
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

public void callCar() {
    Intent intent = new Intent(ReserveIntents.ACTION_RESERVE_TAXI_RESERVATION);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

Пример фильтра намерений:

<activity ...>
    <intent-filter>
        <action android:name="com.google.android.gms.actions.RESERVE_TAXI_RESERVATION" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

Карты

Отображение местоположения на карте — распространённое действие для картографических приложений. Создайте фильтр намерений, чтобы сообщить о возможности вашего приложения выполнять это действие, используя информацию из следующего раздела.

Показать местоположение на карте

Чтобы открыть карту, используйте действие ACTION_VIEW и укажите информацию о местоположении в данных намерения, используя одну из следующих схем.

Действие
ACTION_VIEW
Схема URI данных
geo: latitude , longitude
Отобразите карту на заданных широте и долготе.

Пример: "geo:47.6,-122.3"

geo: latitude , longitude ?z= zoom
Отобразите карту с заданными долготой и широтой на определенном уровне масштабирования. Уровень масштабирования 1 отображает всю Землю с центром в заданных широте и долготе . Максимальный (ближайший) уровень масштабирования — 23.

Пример: "geo:47.6,-122.3?z=11"

geo:0,0?q=lat,lng(label)
Отобразите карту на заданных долготе и широте с помощью строковой метки.

Пример: "geo:0,0?q=34.99,-106.61(Treasure)"

geo:0,0?q=my+street+address
Отобразить местоположение для "моего адреса", которое может представлять собой конкретный адрес или запрос местоположения.

Пример: "geo:0,0?q=1600+Amphitheatre+Parkway%2C+CA"

Примечание: Все строки, передаваемые в URI geo , должны быть закодированы. Например, строка 1st & Pike, Seattle становится 1st%20%26%20Pike%2C%20Seattle . Пробелы в строке кодируются символом %20 или заменяются знаком плюс ( + ).

Тип MIME
Никто

Пример намерения:

Котлин

fun showMap(geoLocation: Uri) {
    val intent = Intent(Intent.ACTION_VIEW).apply {
        data = geoLocation
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

public void showMap(Uri geoLocation) {
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setData(geoLocation);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

Пример фильтра намерений:

<activity ...>
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <data android:scheme="geo" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

Музыка или видео

Ниже перечислены распространенные действия для музыкальных и видеоприложений, включая информацию, необходимую для создания фильтра намерений, который будет рекламировать возможность вашего приложения выполнять каждое из этих действий.

Воспроизвести медиафайл

Для воспроизведения музыкального файла используйте действие ACTION_VIEW и укажите URI-адрес файла в данных намерения.

Действие
ACTION_VIEW
Схема URI данных
file: <URI>
content: <URI>
http: <URL>
Тип MIME
"audio/*"
"application/ogg"
"application/x-ogg"
"application/itunes"
Или любой другой, необходимый вашему приложению.

Пример намерения:

Котлин

fun playMedia(file: Uri) {
    val intent = Intent(Intent.ACTION_VIEW).apply {
        data = file
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

public void playMedia(Uri file) {
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setData(file);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

Пример фильтра намерений:

<activity ...>
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <data android:type="audio/*" />
        <data android:type="application/ogg" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

Воспроизводить музыку на основе поискового запроса.

Google Голосовые действия

  • "play michael jackson billie jean"

Для воспроизведения музыки на основе поискового запроса используйте интент INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH . Приложение может запускать этот интент в ответ на голосовую команду пользователя на воспроизведение музыки. Принимающее приложение выполняет поиск в своем инвентаре, чтобы сопоставить существующий контент с заданным запросом, и начинает воспроизведение этого контента.

В этом параметре следует указать дополнительную строку EXTRA_MEDIA_FOCUS , которая определяет предполагаемый режим поиска. Например, режим поиска может указывать, осуществляется ли поиск по имени исполнителя или по названию песни.

Действие
INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH
Схема URI данных
Никто
Тип MIME
Никто
Дополнительные материалы
MediaStore.EXTRA_MEDIA_FOCUS (обязательно)

Указывает режим поиска: ищет ли пользователь конкретного исполнителя, альбом, песню или плейлист. Большинство режимов поиска допускают дополнительные параметры. Например, если пользователь заинтересован в прослушивании конкретной песни, намерение может содержать три дополнительных параметра: название песни, исполнителя и альбом. Это намерение поддерживает следующие режимы поиска для каждого значения EXTRA_MEDIA_FOCUS :

Any - "vnd.android.cursor.item/*"

Воспроизводите любую музыку. Принимающее приложение воспроизводит музыку на основе интеллектуального выбора, например, последнего плейлиста, который слушал пользователь.

Дополнительные опции:

  • QUERY (обязательно): пустая строка. Этот дополнительный параметр всегда предоставляется для обратной совместимости. Существующие приложения, которые не знают о режимах поиска, могут обрабатывать это намерение как неструктурированный поиск.

Неструктурированный - "vnd.android.cursor.item/*"

Воспроизвести конкретную песню, альбом или жанр из неструктурированного поискового запроса. Приложения могут генерировать намерение в этом режиме поиска, когда не могут определить тип контента, который хочет прослушать пользователь. По возможности используйте более конкретные режимы поиска.

Дополнительные опции:

  • QUERY (обязательно): строка, содержащая любую комбинацию имени исполнителя, названия альбома, названия песни или жанра.

Жанр - Audio.Genres.ENTRY_CONTENT_TYPE

Воспроизводите музыку определённого жанра.

Дополнительные опции:

  • "android.intent.extra.genre" (обязательно) - Жанр.
  • QUERY (обязательно): жанр. Этот дополнительный параметр всегда предоставляется для обратной совместимости. Существующие приложения, которые не знают о режимах поиска, могут обрабатывать это намерение как неструктурированный поиск.

Исполнитель - Audio.Artists.ENTRY_CONTENT_TYPE

Воспроизвести музыку конкретного исполнителя.

Дополнительные опции:

  • EXTRA_MEDIA_ARTIST (обязательно): имя художника.
  • "android.intent.extra.genre" : жанр.
  • QUERY (обязательно): строка, содержащая любое сочетание имени исполнителя или жанра. Этот дополнительный параметр всегда предоставляется для обратной совместимости. Существующие приложения, которые не знают о режимах поиска, могут обрабатывать это намерение как неструктурированный поиск.

Альбом - Audio.Albums.ENTRY_CONTENT_TYPE

Воспроизвести музыку из определённого альбома.

Дополнительные опции:

  • EXTRA_MEDIA_ALBUM (обязательно): альбом.
  • EXTRA_MEDIA_ARTIST : художник.
  • "android.intent.extra.genre" : жанр.
  • QUERY (обязательно): строка, содержащая любую комбинацию названия альбома или исполнителя. Этот дополнительный параметр всегда предоставляется для обеспечения обратной совместимости. Существующие приложения, которые не знают о режимах поиска, могут обрабатывать это намерение как неструктурированный поиск.

Песня - "vnd.android.cursor.item/audio"

Воспроизведите определённую песню.

Дополнительные опции:

  • EXTRA_MEDIA_ALBUM : альбом.
  • EXTRA_MEDIA_ARTIST : художник.
  • "android.intent.extra.genre" : жанр.
  • EXTRA_MEDIA_TITLE (обязательно): название песни.
  • QUERY (обязательно): строка, содержащая любую комбинацию названия альбома, исполнителя, жанра или названия. Этот дополнительный параметр всегда предоставляется для обратной совместимости. Существующие приложения, которые не знают о режимах поиска, могут обрабатывать это намерение как неструктурированный поиск.

Плейлист - Audio.Playlists.ENTRY_CONTENT_TYPE

Воспроизвести определенный плейлист или плейлист, соответствующий некоторым критериям, заданным в дополнительных настройках.

Дополнительные опции:

  • EXTRA_MEDIA_ALBUM : альбом.
  • EXTRA_MEDIA_ARTIST : художник.
  • "android.intent.extra.genre" : жанр.
  • "android.intent.extra.playlist" : плейлист.
  • EXTRA_MEDIA_TITLE : название песни, на основе которой создан плейлист.
  • QUERY (обязательно): строка, содержащая любую комбинацию названия альбома, исполнителя, жанра, плейлиста или названия. Этот дополнительный параметр всегда предоставляется для обратной совместимости. Существующие приложения, которые не знают о режимах поиска, могут обрабатывать это намерение как неструктурированный поиск.

Пример намерения:

Если пользователь хочет послушать музыку определённого исполнителя, поисковое приложение может сгенерировать следующий запрос:

Котлин

fun playSearchArtist(artist: String) {
    val intent = Intent(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH).apply {
        putExtra(MediaStore.EXTRA_MEDIA_FOCUS, MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE)
        putExtra(MediaStore.EXTRA_MEDIA_ARTIST, artist)
        putExtra(SearchManager.QUERY, artist)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

public void playSearchArtist(String artist) {
    Intent intent = new Intent(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH);
    intent.putExtra(MediaStore.EXTRA_MEDIA_FOCUS,
                    MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE);
    intent.putExtra(MediaStore.EXTRA_MEDIA_ARTIST, artist);
    intent.putExtra(SearchManager.QUERY, artist);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

Пример фильтра намерений:

<activity ...>
    <intent-filter>
        <action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

При обработке этого интента в вашей активности проверьте значение дополнительного параметра EXTRA_MEDIA_FOCUS во входящем Intent , чтобы определить режим поиска. После того, как ваша активность определит режим поиска, считайте значения дополнительных параметров для этого конкретного режима поиска. Имея эту информацию, ваше приложение сможет выполнить поиск в своем инвентаре, чтобы воспроизвести контент, соответствующий поисковому запросу. Это показано в следующем примере.

Котлин

override fun onCreate(savedInstanceState: Bundle?) {
    ...
    if (intent.action.compareTo(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH) == 0) {

        val mediaFocus: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_FOCUS)
        val query: String? = intent.getStringExtra(SearchManager.QUERY)

        // Some of these extras might not be available depending on the search mode.
        val album: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ALBUM)
        val artist: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ARTIST)
        val genre: String? = intent.getStringExtra("android.intent.extra.genre")
        val playlist: String? = intent.getStringExtra("android.intent.extra.playlist")
        val title: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_TITLE)

        // Determine the search mode and use the corresponding extras.
        when {
            mediaFocus == null -> {
                // 'Unstructured' search mode (backward compatible)
                playUnstructuredSearch(query)
            }
            mediaFocus.compareTo("vnd.android.cursor.item/*") == 0 -> {
                if (query?.isNotEmpty() == true) {
                    // 'Unstructured' search mode.
                    playUnstructuredSearch(query)
                } else {
                    // 'Any' search mode.
                    playResumeLastPlaylist()
                }
            }
            mediaFocus.compareTo(MediaStore.Audio.Genres.ENTRY_CONTENT_TYPE) == 0 -> {
                // 'Genre' search mode.
                playGenre(genre)
            }
            mediaFocus.compareTo(MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE) == 0 -> {
                // 'Artist' search mode.
                playArtist(artist, genre)
            }
            mediaFocus.compareTo(MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE) == 0 -> {
                // 'Album' search mode.
                playAlbum(album, artist)
            }
            mediaFocus.compareTo("vnd.android.cursor.item/audio") == 0 -> {
                // 'Song' search mode.
                playSong(album, artist, genre, title)
            }
            mediaFocus.compareTo(MediaStore.Audio.Playlists.ENTRY_CONTENT_TYPE) == 0 -> {
                // 'Playlist' search mode.
                playPlaylist(album, artist, genre, playlist, title)
            }
        }
    }
}

Java

protected void onCreate(Bundle savedInstanceState) {
    //...
    Intent intent = this.getIntent();
    if (intent.getAction().compareTo(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH) == 0) {

        String mediaFocus = intent.getStringExtra(MediaStore.EXTRA_MEDIA_FOCUS);
        String query = intent.getStringExtra(SearchManager.QUERY);

        // Some of these extras might not be available depending on the search mode.
        String album = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ALBUM);
        String artist = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ARTIST);
        String genre = intent.getStringExtra("android.intent.extra.genre");
        String playlist = intent.getStringExtra("android.intent.extra.playlist");
        String title = intent.getStringExtra(MediaStore.EXTRA_MEDIA_TITLE);

        // Determine the search mode and use the corresponding extras.
        if (mediaFocus == null) {
            // 'Unstructured' search mode (backward compatible).
            playUnstructuredSearch(query);

        } else if (mediaFocus.compareTo("vnd.android.cursor.item/*") == 0) {
            if (query.isEmpty()) {
                // 'Any' search mode.
                playResumeLastPlaylist();
            } else {
                // 'Unstructured' search mode.
                playUnstructuredSearch(query);
            }

        } else if (mediaFocus.compareTo(MediaStore.Audio.Genres.ENTRY_CONTENT_TYPE) == 0) {
            // 'Genre' search mode.
            playGenre(genre);

        } else if (mediaFocus.compareTo(MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE) == 0) {
            // 'Artist' search mode.
            playArtist(artist, genre);

        } else if (mediaFocus.compareTo(MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE) == 0) {
            // 'Album' search mode.
            playAlbum(album, artist);

        } else if (mediaFocus.compareTo("vnd.android.cursor.item/audio") == 0) {
            // 'Song' search mode.
            playSong(album, artist, genre, title);

        } else if (mediaFocus.compareTo(MediaStore.Audio.Playlists.ENTRY_CONTENT_TYPE) == 0) {
            // 'Playlist' search mode.
            playPlaylist(album, artist, genre, playlist, title);
        }
    }
}

Новая заметка

Создание заметки — распространенное действие для приложений, предназначенных для ведения заметок. Используйте информацию из следующего раздела, чтобы создать фильтр намерений, который будет рекламировать возможность вашего приложения выполнять это действие.

Создать заметку

Для создания новой заметки используйте действие ACTION_CREATE_NOTE и укажите сведения о заметке, такие как тема и текст, используя следующие дополнительные параметры.

Примечание: Перед выполнением этого действия приложение должно запросить подтверждение у пользователя.

Действие
ACTION_CREATE_NOTE
Схема URI данных
Никто
Тип MIME
PLAIN_TEXT_TYPE
"*/*"
Дополнительные материалы
EXTRA_NAME
Строка, указывающая на заголовок или тему заметки.
EXTRA_TEXT
Строка, указывающая текст заметки.

Пример намерения:

Котлин

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 Голосовые действия

  • "Позвоните по номеру 555-5555"
  • "Позвони Бобу"
  • "Позвонить на автоответчик"

Для совершения телефонного звонка напрямую используйте действие ACTION_CALL и укажите номер телефона, используя следующую схему URI. После открытия приложения телефон начнется телефонный звонок. Пользователю не нужно нажимать кнопку «Вызов» .

Для выполнения действия ACTION_CALL необходимо добавить разрешение CALL_PHONE в файл манифеста:

<uses-permission android:name="android.permission.CALL_PHONE" />
Действие
  • ACTION_DIAL - Открывает номеронабиратель или телефонное приложение.
  • ACTION_CALL — Совершает телефонный звонок (требуется разрешение CALL_PHONE )
Схема URI данных
  • tel:<phone-number>
  • voicemail:<phone-number>
Тип MIME
Никто

Допустимыми номерами телефонов являются номера, определенные в стандарте IETF RFC 3966. Примеры допустимых номеров включают следующие:

  • tel:2125551212
  • tel:(212) 555 1212

Встроенный в приложение «Телефон» номеронабиратель хорошо справляется со стандартизацией схем, например, телефонных номеров. Поэтому описанная схема не является строго обязательной в методе Uri.parse() . Однако, если вы не пробовали какую-либо схему или не уверены, можно ли её обработать, используйте вместо неё метод Uri.fromParts() .

Пример намерения:

Котлин

fun dialPhoneNumber(phoneNumber: String) {
    val intent = Intent(Intent.ACTION_DIAL).apply {
        data = Uri.parse("tel:$phoneNumber")
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

public void dialPhoneNumber(String phoneNumber) {
    Intent intent = new Intent(Intent.ACTION_DIAL);
    intent.setData(Uri.parse("tel:" + phoneNumber));
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

Ниже перечислены типичные действия для поисковых приложений, включая информацию, необходимую для создания фильтра намерений, который будет рекламировать возможность вашего приложения выполнять каждое из этих действий.

Поиск с помощью конкретного приложения

Google Голосовые действия

  • "Найти видео с кошками в приложении myvideoapp"

Для поддержки поиска в контексте вашего приложения объявите в приложении фильтр намерений с действием SEARCH_ACTION , как показано в следующем примере фильтра намерений.

Примечание: Мы не рекомендуем использовать SEARCH_ACTION для поиска в приложении. Вместо этого используйте действие GET_THING , чтобы задействовать встроенную поддержку поиска в приложении Google Assistant. Для получения дополнительной информации см. документацию по действиям приложений Google Assistant.

Действие
"com.google.android.gms.actions.SEARCH_ACTION"
Поддерживается поисковый запрос из Google Voice Actions.
Дополнительные материалы
QUERY
Строка, содержащая поисковый запрос.

Пример фильтра намерений:

<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 .

Действие
ACTION_WEB_SEARCH
Схема URI данных
Никто
Тип MIME
Никто
Дополнительные материалы
SearchManager.QUERY
Поисковая строка.

Пример намерения:

Котлин

fun searchWeb(query: String) {
    val intent = Intent(Intent.ACTION_WEB_SEARCH).apply {
        putExtra(SearchManager.QUERY, query)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

public void searchWeb(String query) {
    Intent intent = new Intent(Intent.ACTION_WEB_SEARCH);
    intent.putExtra(SearchManager.QUERY, query);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

Настройки

Чтобы открыть экран в системных настройках, когда ваше приложение требует от пользователя внесения изменений, используйте одно из следующих действий Intent:

Действие
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
Никто

Пример намерения:

Котлин

fun openWifiSettings() {
    val intent = Intent(Settings.ACTION_WIFI_SETTINGS)
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

public void openWifiSettings() {
    Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

Текстовые сообщения

Создание SMS/MMS-сообщения с вложением — распространённое действие для приложений обмена текстовыми сообщениями. Создайте фильтр намерений, чтобы рекламировать возможность вашего приложения выполнять это действие, используя информацию из следующего раздела.

Составьте SMS/MMS-сообщение с вложением.

Для отправки SMS или MMS сообщения используйте одно из следующих действий Intent и укажите подробности сообщения, такие как номер телефона, тема и текст сообщения, используя следующие дополнительные клавиши.

Действие
ACTION_SENDTO или
ACTION_SEND или
ACTION_SEND_MULTIPLE
Схема URI данных
sms: <phone_number>
smsto: <phone_number>
mms: <phone_number>
mmsto: <phone_number>

Все эти схемы обрабатываются одинаково.

Тип MIME
"text/plain"
"image/*"
"video/*"
Дополнительные материалы
"subject"
Строка для темы сообщения (обычно только для MMS).
"sms_body"
Строка для текстового сообщения.
EXTRA_STREAM
Uri , указывающий на изображение или видео для прикрепления. При использовании действия ACTION_SEND_MULTIPLE этот дополнительный параметр представляет собой ArrayList объектов Uri , указывающих на изображения или видео для прикрепления.

Пример намерения:

Котлин

fun composeMmsMessage(message: String, attachment: Uri) {
    val intent = Intent(Intent.ACTION_SENDTO).apply {
        type = HTTP.PLAIN_TEXT_TYPE
        putExtra("sms_body", message)
        putExtra(Intent.EXTRA_STREAM, attachment)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

public void composeMmsMessage(String message, Uri attachment) {
    Intent intent = new Intent(Intent.ACTION_SENDTO);
    intent.setType(HTTP.PLAIN_TEXT_TYPE);
    intent.putExtra("sms_body", message);
    intent.putExtra(Intent.EXTRA_STREAM, attachment);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

Если вы хотите убедиться, что ваше намерение будет обработано только приложением для обмена текстовыми сообщениями, а не другими почтовыми или социальными приложениями, используйте действие ACTION_SENDTO и укажите схему данных "smsto:" , как показано в следующем примере:

Котлин

fun composeMmsMessage(message: String, attachment: Uri) {
    val intent = Intent(Intent.ACTION_SEND).apply {
        data = Uri.parse("smsto:")  // Only SMS apps respond to this.
        putExtra("sms_body", message)
        putExtra(Intent.EXTRA_STREAM, attachment)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

public void composeMmsMessage(String message, Uri attachment) {
    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.setData(Uri.parse("smsto:"));  // Only SMS apps respond to this.
    intent.putExtra("sms_body", message);
    intent.putExtra(Intent.EXTRA_STREAM, attachment);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

Пример фильтра намерений:

<activity ...>
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <data android:type="text/plain" />
        <data android:type="image/*" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

Примечание: Если вы разрабатываете приложение для обмена SMS/MMS-сообщениями, вам необходимо реализовать фильтры намерений для нескольких дополнительных действий, чтобы оно было доступно в качестве приложения SMS по умолчанию на Android 4.4 и выше. Для получения дополнительной информации см. документацию по Telephony .

Веб-браузер

Загрузка веб-адреса — распространённое действие для веб-приложений. Создайте фильтр намерений, чтобы сообщить о возможности вашего приложения выполнять это действие, используя информацию из следующего раздела.

Загрузить веб-адрес

Google Голосовые действия

  • "открыть example.com"

Для открытия веб-страницы используйте действие ACTION_VIEW и укажите URL-адрес веб-страницы в данных намерения.

Действие
ACTION_VIEW
Схема URI данных
http: <URL>
https: <URL>
Тип MIME
"text/plain"
"text/html"
"application/xhtml+xml"
"application/vnd.wap.xhtml+xml"

Пример намерения:

Котлин

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 для запуска определенных интентов, выполнив следующие действия:

  1. Настройте устройство Android для разработки или используйте виртуальное устройство .
  2. Установите версию вашего приложения, которая обрабатывает необходимые вам интенты.
  3. Запустите интент с помощью 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
    
  4. Если вы определили необходимые фильтры намерений, обработайте намерение.

For more information, see Issue shell commands .