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

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

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

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

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

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

Чтобы узнать, как активировать намерения, перечисленные на этой странице, с хоста разработки, см. раздел «Проверка намерений с помощью 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
Логическое значение, указывающее, должно ли отвечающее приложение пропускать свой пользовательский интерфейс при установке будильника. Если это правда, приложение должно обойти любой пользовательский интерфейс подтверждения и установить указанный сигнал тревоги.

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

Котлин

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

Ява

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

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

<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
Логическое значение, указывающее, должно ли отвечающее приложение пропускать свой пользовательский интерфейс при установке таймера. Если это правда, приложение должно обойти любой пользовательский интерфейс подтверждения и запустить указанный таймер.

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

Котлин

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

Ява

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

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

<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)
    }
}

Ява

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

Ява

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

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

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

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

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

Котлин

val REQUEST_IMAGE_CAPTURE = 1

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

Ява

static final int REQUEST_IMAGE_CAPTURE = 1;

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

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

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

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

Ява

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)
    }
}

Ява

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() содержит content: URI, указывающий на выбранный контакт. Ответ предоставляет вашему приложению временные разрешения на чтение этого контакта с помощью API поставщика контактов , даже если ваше приложение не включает разрешение READ_CONTACTS .

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

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

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

Котлин

const val REQUEST_SELECT_CONTACT = 1

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

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

Ява

static final int REQUEST_SELECT_CONTACT = 1;

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

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

Сведения о том, как получить контактные данные после получения URI контакта, см. в разделе Получение сведений о контакте .

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

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

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

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

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

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

Действие
ACTION_PICK
Схема URI данных
Никто
MIME-тип
CommonDataKinds.Phone.CONTENT_TYPE
Выбирайте из контактов с номером телефона.
CommonDataKinds.Email.CONTENT_TYPE
Выберите из контактов с адресом электронной почты.
CommonDataKinds.StructuredPostal.CONTENT_TYPE
Выбирайте из контактов с почтовым адресом.

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

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

Котлин

const val REQUEST_SELECT_PHONE_NUMBER = 1

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

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
    if (requestCode == REQUEST_SELECT_PHONE_NUMBER && resultCode == Activity.RESULT_OK) {
        // Get the URI and query the content provider for the phone number.
        val contactUri: Uri = data.data
        val projection: Array<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.
                ...
            }
        }
    }
}

Ява

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)
    }
}

Ява

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)
    }
}

Ява

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

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

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

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

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

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

Котлин

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

Ява

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

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

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

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

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

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

Действие
ACTION_SENDTO (без вложений) или
ACTION_SEND (для одного вложения) или
ACTION_SEND_MULTIPLE (для нескольких вложений)
Схема URI данных
Никто
MIME-тип
"text/plain"
"*/*"
Дополнительно
Intent.EXTRA_EMAIL
Строковый массив всех адресов электронной почты получателей «Кому».
Intent.EXTRA_CC
Массив строк всех адресов электронной почты получателей «CC».
Intent.EXTRA_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)
    }
}

Ява

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)
    }
}

Ява

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) и более поздних версиях вы также можете разрешить пользователю выбирать несколько файлов, добавив EXTRA_ALLOW_MULTIPLE к намерению, для которого установлено true . Затем вы можете получить доступ к каждому из выбранных файлов в объекте ClipData , возвращенном getClipData() .

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

Пример намерения получить фотографию:

Котлин

const val REQUEST_IMAGE_GET = 1

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

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

Ява

static final int REQUEST_IMAGE_GET = 1;

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

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

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

<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 особенно полезно, когда вы хотите прочитать существующий файл без копирования в приложение или когда вы хотите открыть и отредактировать файл на месте.

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

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

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

Пример намерения получить фотографию:

Котлин

const val REQUEST_IMAGE_OPEN = 1

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

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

Ява

static final int REQUEST_IMAGE_OPEN = 1;

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

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

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

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

<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)
    }
}

Ява

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 показывает всю Землю с центром в заданной широте , 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"

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

MIME-тип
Никто

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

Котлин

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

Ява

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

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

<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)
    }
}

Ява

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

  • «сыграй Майкла Джексона, Билли Джин»

Для воспроизведения музыки на основе поискового запроса используйте намерение 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 (обязательно): строка, содержащая любую комбинацию исполнителя, альбома, названия песни или жанра.

Жанр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)
    }
}

Ява

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)
            }
        }
    }
}

Ява

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)
    }
}

Ява

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)
    }
}

Ява

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)
    }
}

Ява

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);
    }
}

Настройки

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

Действие
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)
    }
}

Ява

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

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

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

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

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

Действие
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)
    }
}

Ява

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

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

Котлин

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

Ява

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

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

<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

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

Ява

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. Если вы определите необходимые фильтры намерения, обработайте намерение.

Для получения дополнительной информации см. Команды выпуска Shell .