Освой Android играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Общее
Явные намерения
Неявные намерения
ACTION_PICK
ACTION_SEND
ACTION_GET_CONTENT
Android 12
Примеры использования намерений
Намерение (Intent) - это механизм для описания одной операции - выбрать фотографию, отправить письмо, сделать звонок, запустить браузер и перейти по указанному адресу. В Android-приложениях многие операции работают через намерения.
Наиболее распространённый сценарий использования намерения - запуск другой активности в своём приложении. Об этом можно почитать в соответствующем уроке.
Но это не единственный вариант использования намерения. Также можно использовать для объявления о запуске активности или сервиса, направленных на выполнение каких-либо действий (как правило, речь о работе с определенной частью данных) или для передачи уведомлений о том, что произошло некое событие (или действие).
Намерения могут применяться для трансляции сообщений по системе. Любое приложение способно зарегистрировать широковещательный приёмник и отслеживать эти намерения с возможностью на них реагировать. Это позволяет создавать приложения, использующие событийную модель, в основе которой лежат внутренние, системные или сторонние события, передаваемые внешними программами.
Android транслирует намерения для объявления о системных событиях, например об изменениях в состоянии сетевого подключения или в уровне заряда батареи. Системные приложения в Android, такие как программы дозвона или управления SMS, регистрируют компоненты, отслеживающие заданные намерения, например входящий звонок или получено новое SMS-сообщение, и соответствующим образом реагируют на них.
Вспомним код для перехода на вторую активность в своём приложении:
Intent intent = new Intent(HelloWorld.this, AboutActivity.class);
startActivity(intent);
В намерении мы явно указали имя класса активности во втором параметре. Данный класс у нас прописан в манифесте, и система, просматривая манифест, запустит нужную активность. Вот почему у нас сначала программа завершалась с ошибкой. Когда мы создали класс, но не прописали его в манифесте, то система не понимала, чего от неё хотят.
Первый параметр – это Context. Активность является подклассом Context, поэтому мы можем использовать её как HelloWorld.this, или укороченную запись this.
Таким образом, ваше приложение может иметь десять активностей, и вы можете вызвать любую из них, зная её имя класса. Это явный вызов, где вы явно указываете имя класса для запуска.
После вызова метода создастся новая активность, которая запустится или возобновит свою работу, переместившись на вершину стека активностей.
Также при переходе на другую активность мы можем указать какие-то данные, а принимающая активность должна уметь обработать их. Для этих целей существуют методы типа putXXX(). Например, для передачи списка файлов из одной активности в другую:
// У первой активности
ArrayList<File> fileList = new ArrayList<File>();
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra("FILES_LIST", fileList);
startActivity(intent);
// У второй активности
ArrayList<File> filelist =
(ArrayList<File>)getIntent().getSerializableExtra("FILES_LIST");
По похожему сценарию можно передать простые типы и строки.
При работе с действиями, возвращающими данные, нельзя использовать метод startActivity(), поскольку он не возвращает результат. Если вы хотите вернуть данные, то можете использовать метод startActivityForResult(), приспособленный для работы с обратными вызовами.
Существует также неявный вызов активности. В этом случае при создании намерения мы используем не имя класса, а указываем параметры action, data, category с определёнными значениями. Система анализирует, что мы тут такого понаписали и начинает подбирать подходящий вариант для запуска. Например, если указали в параметрах адрес веб-страницы, то скорее всего хотим запустить браузер и почитать новость, что Кот Ларри уволен с поста "главного мышелова" резиденции британского премьера (нехороший премьер-министр, пусть только в Москву сунется).
Впрочем, мы отвлеклись. Комбинация значений в параметрах определяют цель, которую мы хотим достичь. Это может быть открытие ссылки, отправка письма, набор телефонного номера и т.п.
К слову сказать, мы тоже можем прописать в своей активности в фильтрах намерений (Intent Filter) набор тех же параметров: action, data, category. И тогда у пользователя может запуститься не только стандартный браузер, но и наша программа (Кот Матроскин в таких случаях говорил: Подумаешь, я еще и вышивать могу... и на машинке тоже..).
Иными словами, если параметры намерения совпадают с условиями нашего фильтра, то наше приложение (активность) будет вызвано. Система сканирует активности всех установленных приложений, и если находится несколько подходящих активностей, то Android предоставляет пользователю выбор, какой именно программой следует воспользоваться. Если найдётся только одна подходящая активность, то, естественно, никакого диалога для выбора не будет, и активность запустится автоматически.
Неявные намерения — это механизм, позволяющий запрашивать анонимные компоненты приложений с помощью действий. Вы можете попросить систему запустить активность, выполняющую заданное действие, не зная ничего ни о самой активности, ни о её приложении. Например, мы указываем телефонный номер, но понятия не имеем, как программой дозвона пользуется пользователь на своём телефоне. Но это уже не наша проблема, пусть пользователь сам выбирает, как ему звонить по номеру, который мы можем ему предоставить.
Создавая новое неявное намерение для передачи в метод startActivity(), необходимо назначить действие, которое должно выполниться, а также при желании указать вспомогательный путь URI к тем данным, что нужно обработать. Вы также можете передать дополнительные данные в другую активность, используя параметр намерения extras.
При применении этого намерения для запуска активности система во время работы приложения сама найдёт класс компонента, который лучше всего подходит для заданного действия, учитывая указанный тип данных. Это значит, что вы можете создавать проекты, используя возможности других приложений и не зная при этом, как они называются и какую функциональность предоставляют.
Простой пример создания намерения с предопределённым действием ACTION_VIEW для запуска браузера и перехода на нужный адрес:
Uri address = Uri.parse("http://developer.alexanderklimov.ru");
Intent openLinkIntent = new Intent(Intent.ACTION_VIEW, address);
if (openLinkIntent.resolveActivity(getPackageManager()) != null) {
startActivity(openlinkIntent);
} else {
Log.d("Intent", "Не получается обработать намерение!");
}
В данном случае действие ACTION_VIEW означает просмотр чего-либо. Мы указали нужные данные (адрес), и происходит запуск новой активности (браузера). При этом исходная активность приостанавливается и переходит в фоновый режим. Когда пользователь нажимает на кнопку Back, то он возвращается к исходной активности. Обратите внимание, что мы нигде не указываем конкретную программу-браузер типа Chrome, Opera и т.п.
В каждом случае Android находит соответствующую активность, чтобы ответить на намерение, инициализируя её в случае необходимости.
Приложения могут также создавать свои собственные типы намерений и позволять другим приложениям вызывать.
Раньше я писал код без условия if и это было рабочим решением. Но следует помнить, что нет никакой гарантии, что приложение, способное обработать ваше намерение, будет установлено и доступно на устройстве. Конечно, вероятность того, что у пользователя не будет звонилки, достаточна низка. А если приложение установлено на планшете без телефонного модуля? А если появятся холодильники или стиральные машины с Android на борту? Чтобы узнать, будет ли запущена активность для вашего намерения, можно отправить запрос Менеджеру пакетов при помощи метода resolveActivity(). Поэтому в примере выше пришлось поставить дополнительную проверку. Желательно делать такую проверку во всех примерах, где-то я мог просто пропустить старый код.
Объект Intent содержит информацию, представляющую интерес для компонента, который получает намерение, и данные, которые передаются этому компоненту. Кроме того, объект Intent содержит информацию, представляющую интерес для системы Android, — имя компонента, который должен обработать намерение и набор параметров запуска этого компонента. Как правило, объект Intent может содержать следующие поля:
Система и приложения, которые идут в комплекте с платформой, также используют объекты Intent для активизации определённых системой компонентов (например, различных приложений и служб при загрузке системы).
Для работы с категориями в классе Intent определена группа методов:
Если намерение запрашивает выполнение какого-либо действия с определённым набором данных, то системе нужно уметь выбрать приложение (или компонент) для обслуживания этого запроса. На помощь приходят фильтры намерений, которые используются для регистрации активностей, сервисов и широковещательных приёмников в качестве компонентов, способных выполнять заданные действия с конкретным видом данных. С помощью этих фильтров также регистрируются широковещательные приёмники, настроенные на трансляцию намерением заданного действия или события.
Задействуя фильтры намерений, приложения объявляют, что они могут отвечать на действия, запрашиваемые любой другой программой, установленной на устройстве. Чтобы зарегистрировать компонент приложения в качестве потенциального обработчика намерений, нужно добавить тег <intent-filter> в узел компонента в манифесте.
В фильтре намерений декларируется только три составляющих объекта Intent: действие, данные, категория. Дополнения и флаги не играют никакой роли в принятии решения, какой компонент получает намерение.
Например, в любом приложении есть главная активность, которая устанавливается как точка входа для задания:
<activity
android:name=".HelloWorldActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN"
<category android:name="android.intent.category.LAUNCHER"
</intent-filter>
</activity>
Фильтр такого вида в элементе <action> помечает активность, как запускаемую по умолчанию. Элемент <category> заставляет значок и метку для деятельности отображаться на панели Application Launcher, давая пользователям возможность запускать задание и возвращаться к этому заданию в любое время после того, как оно было запущено.
Внутри узла Фильтра намерений можно использовать такие теги (и соответствующие атрибуты).
При использовании метода startActivity() передаваемое неявное намерение, как правило, доходит лишь до одной активности. Если для выполнения заданного действия с указанными данными годятся сразу несколько активностей, пользователю предоставляется список выбора. Процесс, когда решается, какую активность лучше запустить, называется Утверждением намерений. Его цель — найти наиболее подходящий фильтр намерений. В целом весь алгоритм работает следующим образом.
Когда программный компонент запускается с помощью неявного намерения, он должен найти действие, которое необходимо осуществить, и данные для него.
Используйте метод getIntent() (как правило, внутри метода onCreate()), чтобы извлечь намерение, с помощью которого компонент запущен.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Intent intent = getIntent();
}
Применяйте методы getAction() и getData(), чтобы найти действие и данные, связанные с намерением. Для извлечения дополнительной информации, хранящейся в параметре extras, используйте типизированные методы get<тип>Extra.
String action = intent.getAction();
Uri data = intent.getData();
Задействуйте метод startNextMatchingActivity() для делегирования ответственности за обработку действия следующему компоненту, который лучше всего для этого подходит.
Intent intent = getIntent();
if (isDuringBreak)
startNextMatchingActivity(intent);
Это позволяет добавлять дополнительные условия для компонентов, которые ограничат сферу их применения рамками утверждения Намерений. В некоторых случаях ваш компонент может выполнить некоторые операции или предложить пользователю выбор, прежде чем передать Намерение другому компоненту.
До сих пор мы в основном рассматривали намерения или действия, которые обычно активируют другую активность, не ожидая получить в ответ на это результат. Теперь рассмотрим более сложное действие, которое возвращает значение после того, как будет активировано. ACTION_PICK - это обобщённое название для таких действий.
Принцип ACTION_PICK заключается в том, чтобы запустить активность, отображающую список элементов. После этого активность должна предоставлять пользователю возможность выбора элемента из этого списка. Когда пользователь выберет элемент, активность возвратит URI выбранного элемента вызывающей стороне. Таким образом, можно многократно использовать функцию UI для выбора нескольких элементов определённого типа.
Следующий код выведет диалоговое окно со списком всех возможных программ, которые могут запустить активность с данными, так как мы не указываем конкретный тип (setType("*/*")):
// Показываем все программы для запуска
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("*/*");
startActivityForResult(intent, 1);
Если мы укажем конкретный тип данных, которые нас интересует, то список программ существенно сузится. Например, если указать intent.setType("image/*");, то можем увидеть только системную программу Галерея для просмотра картинок (у пользователя могут быть установлены программы, которые также предназначены для просмотра картинок, поэтому список может отличаться).
Очень распространённое намерение. Используйте метод setType(), чтобы указать тип MIME для передаваемых данных. Эти данные должны храниться в параметре намерения extras с ключами EXTRA_TEXT или EXTRA_STREAM, в зависимости от типа. В случае с электронной почтой стандартное приложение в Android также принимает дополнительные параметры по ключам EXTRA_EMAIL, EXTRA_CC, EXTRA_BCC и EXTRA_SUBJECT.
Если есть установленное приложение с фильтром, который соответствует ACTION_SEND и MIME-типу text/plain, система Android запустит его, а если будет найдено более одного приложения, то система отобразит диалог выбора, который позволяет пользователю выбрать приложение.
Если ваша активность хочет обрабатывать подобные намерения, то она должна содержать следующие данные:
<activity android:name="ShareActivity">
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain"/>
<data android:mimeType="image/*"/>
</intent-filter>
</activity>
Имя сообщает Android, что активность может обрабатывать ACTION_SEND.
Фильтр должен включать категорию DEFAULT, в противном случае он не сможет получать неявные намерения.
Указываем типы данных, которые могут обрабатываться активностью.
Если вы не хотите писать собственный менеджер файлов, а готовы использовать готовые приложения для выбора файла, то можете использовать следующий код:
public class PickFileActivity extends Activity {
TextView textView;
private static final int PICKFILE_RESULT_CODE = 1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button buttonPick = findViewById(R.id.buttonpick);
textView = findViewById(R.id.textView);
buttonPick.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View arg0) {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("file/*");
startActivityForResult(intent,PICKFILE_RESULT_CODE);
}});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch(requestCode){
case PICKFILE_RESULT_CODE:
if(resultCode == RESULT_OK){
String FilePath = data.getData().getPath();
textView.setText(FilePath);
}
break;
}
}
}
Только вы должны быть уверены, что у пользователя есть программа, способная работать с файлами.
В коде мы получаем полный путь к файлу через метод getPath(). Если вам нужно получить раздельно имя каталога и имя файла, то потребуется небольшая модификация:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch(requestCode){
case PICKFILE_RESULT_CODE:
if(resultCode == RESULT_OK){
String FilePath = data.getData().getPath();
String FileName = data.getData().getLastPathSegment();
int lastPos = FilePath.length() - FileName.length();
String Folder = FilePath.substring(0, lastPos);
textFile.setText("Full Path: \n" + FilePath + "\n");
textFolder.setText("Folder: \n" + Folder + "\n");
textFileName.setText("File Name: \n" + FileName + "\n");
}
break;
}
}
При выборе из списка программ пользователь может выбрать программу по умолчанию, которая будет автоматически запускаться при выбранном намерении. В этом случае диалоговое окно выводиться не будет. Но можно принудительно выводить диалоговое окно при помощи метода createChooser() и пользователю придётся каждый раз выбирать нужную активность:
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, messageText);
Intent chosenIntent = Intent.createChooser(intent, "Заголовок в диалоговом окне");
startActivity(chosenIntent);
Если на устройстве не будет подходящих активностей для запуска, то createChooser() обработает данную ситуацию и выведет соответствующее сообщение. В этом заключается его преимущество. Если передать методу startActivity() намерение, для которого не найдётся подходящей активности, то возникнет исключение ActivityNotFoundException. И вам придётся перехватывать его в блоке try/catch, чтобы избежать аварийного завершения приложения.
В Android 12 немного изменились правила для фильтров к намерениями. Если их игнорировать, то можно получить ошибку в запуске приложения. Основное изменение - нужно явно указать атрибут androd:exported со значениями true или false у <activity>, <activity-alias>, <service>, <receiver>, которые имеют в своём составе intent-filter.
Не нужно всем подряд давать значение true. Это оправдано для основной активности с блоком <category android:name="android.intent.category.LAUNCHER" />, чтобы стандартный лаунчер мог запустить ваше приложение.
Также допустимо использовать true, если ваша активность использует <action android:name="android.intent.action.VIEW" />, чтобы другие приложения могли открыть ваше программу. Аналогично справедливо для случаев <action android:name="android.intent.action.SEND" /> и <action android:name="android.intent.action.SEND_MULTIPLE" />.
Запустить другую активность вашего приложения можно не только стандартным способом, о котором говорится в первом курсе, но и другим немного странным способом. Прописываем в манифесте у второй активности мета-данные:
<activity
android:name=".SecondActivity"
android:label="@string/title_activity_second"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="ru.alexanderklimov.helloworld.second.SECOND" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
Запускаем активность по щелчку кнопки.
Intent intent = new Intent("ru.alexanderklimov.helloworld.second.SECOND");
// intent.putExtra("something", 2); // по желанию
startActivity(intent);
Другие примеры.
Получить электронный адрес или номер телефона из Контактов (ACTION_PICK)
Добавление нового контакта (ContactsContract.Intents.SHOW_OR_CREATE_CONTACT)
Выбрать MP3-файл (ACTION_GET_CONTENT)
Выбрать видеофайл (ACTION_GET_CONTENT)
Выбрать картинку из Галереи (ACTION_GET_CONTENT)
Загрузить изображения в ImageView из галереи
Запускаем приложение Галерея и выбираем картинку
Запускаем приложение Загрузки (DownloadManager.ACTION_VIEW_DOWNLOADS)
Включить Bluetooth (BluetoothAdapter.ACTION_REQUEST_ENABLE)
Управление настройками Wi-Fi-соединениями (ACTION_WIFI_SETTINGS, ACTION_WIFI_IP_SETTINGS, ACTION_WIRELESS_SETTINGS)
Управление настройками NFC и Android Beam (Settings.ACTION_NFC_SETTINGS, Settings.ACTION_NFCSHARING_SETTINGS)
Сообщить системе о включении/выключении автономного режима (Airplane Mode) (ACTION_AIRPLANE_MODE_CHANGED)
Открываем окно настроек для автономного режима (Airplane Mode) (ACTION_AIRPLANE_MODE_SETTINGS)
Запуск приложения Батарея (ACTION_POWER_USAGE_SUMMARY)
Отслеживание изменения заряда батареи (ACTION_BATTERY_CHANGED)
Отслеживание низкого уровня заряда батареи (ACTION_BATTERY_LOW и ACTION_BATTERY_OKAY)
Окно настроек Battery saver (API 22) (Settings.ACTION_BATTERY_SAVER_SETTINGS)
Настройки | Программы | Экономия заряда батареи (Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS)
Диалоговое окно для включения приложения в белый список без экономии заряда батареи (Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)
Открыть окно «Моё местоположение» из системного приложения Настройки - пример, ещё пример (ACTION_LOCATION_SOURCE_SETTINGS)
Программное включение/выключение GPS (GPS_ENABLED_CHANGE)
Открыть окно «Экран» из системного приложения Настройки (Settings.ACTION_DISPLAY_SETTINGS)
Отправить SMS через намерение ACTION_VIEW
Отправить SMS через намерение ACTION_SENDTO
Выбрать мелодию (action.RINGTONE_PICKER)
Запустить установку приложения (ACTION_INSTALL_PACKAGE)
Удалить программу (ACTION_DELETE и ACTION_UNINSTALL_PACKAGE)
Отправить письмо (ACTION_SEND)
Открыть страницу приложения в Google Play (ACTION_VIEW)
Открыть Календарь (ACTION_VIEW)
Добавляем события в Календарь (ACTION_INSERT)
Свернуть приложение или Показать Домашний экран (ACTION_MAIN CATEGORY_HOME)
Запустить заставку (DayDream) (ACTION_MAIN)
Окно настроек DayDream (API 18) (Settings.ACTION_DREAM_SETTINGS)
Определить момент окончания перезагрузки устройства (BOOT_COMPLETED)
Автозапуск приложения при загрузке (BOOT_COMPLETED)
Периодическое срабатывание каждую минуту (TIME_TICK)
Отключение устройства от питания (ACTION_POWER_DISCONNECTED)
Открываем документ (выбираем картинку) Android 4.4 (Kitkat) (ACTION_OPEN_DOCUMENT)
Создание нового документа Android 4.4 (Kitkat) (ACTION_CREATE_DOCUMENT)
Просмотр папок и файлов в файловых хранилищах - ACTION_OPEN_DOCUMENT_TREE (Android 5.0)
Запускаем встроенный диктофон (MediaStore.Audio.Media.RECORD_SOUND_ACTION)
Запустить приложение Настройки с экранами Приложения и О приложении и другие окна настроек (ACTION_MANAGE_APPLICATIONS_SETTINGS и ACTION_APPLICATION_DETAILS_SETTINGS, Settings.ACTION_MANAGE_ALL_APPLICATIONS_SETTINGS, Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, Settings.ACTION_MANAGE_WRITE_SETTINGS)
Подключаемся к док-станции (ACTION_DOCK_EVENT)
Запускаем приложение YouTube (com.google.android.youtube.player.YouTubeIntents)
Распознавание речи (RecognizerIntent.ACTION_RECOGNIZE_SPEECH)
Показать окно установки Живых обоев (WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER)
Добавить закладку в браузер (ACTION_INSERT)
Запустить активность для установки администратора устройства (ACTION_ADD_DEVICE_ADMIN)
Запустить экран Настройки | Безопасность (Settings.ACTION_SECURITY_SETTINGS)
Запустить экран Настройки | Безопасность | Доступ к уведомлениям (ACTION_NOTIFICATION_LISTENER_SETTINGS)
Запустить экран Настройки даты и времени (ACTION_DATE_SETTINGS)
Окно настроек клавиатур (Settings.ACTION_INPUT_METHOD_SETTINGS, Settings.ACTION_HARD_KEYBOARD_SETTINGS)
Приложение Clock/Часы (AlarmClock.ACTION_SET_ALARM, AlarmClock.ACTION_SET_TIMER)
Добавляем ярлык на Домашний экран (INSTALL_SHORTCUT, UNINSTALL_SHORTCUT)
Запустить стандартную звонилку без набора номера (ACTION_DIAL) (также есть пример для Compose, ссылка внизу)
Позвонить на указанный номер (ACTION_CALL)
Uri address = Uri.parse("http://developer.alexanderklimov.ru/android");
Intent openlink = new Intent(Intent.ACTION_VIEW, address);
startActivity(openlink);
Данный код запустит браузер с указанной ссылкой. Если ссылка ведёт на YouTube, то откроется стандартное приложение для YouTube. Также можно открыть стандартный клиент Android Market с ссылкой на какое-либо приложение. Для этого необходимо в параметр URI передать ссылку вида market://search?q=search query, где search query необходимо заменить соответствующим поисковым запросом.
Открыть настройки WebView (Settings.ACTION_WEBVIEW_SETTINGS)
Можно запустить конкретно приложение YouTube
// constant value of package & class name of YouTube app
public static final String YOUTUBE_PACKAGE_NAME = "com.google.android.youtube";
public static final String YOUTUBE_CLASS_NAME = "com.google.android.youtube.WatchActivity";
//Launch Youtube to watch an URL
public static void launchYoutube(Context context, String url) {
Intent intent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse(url));
intent.setClassName(YOUTUBE_PACKAGE_NAME, YOUTUBE_CLASS_NAME);
context.startActivity(intent);
}
Можно отправить поисковый запрос в Гугл:
String q = "котёнок";
Intent intent = new Intent(Intent.ACTION_WEB_SEARCH);
intent.putExtra(SearchManager.QUERY, q);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
Программное включение приложения Камера (ACTION_CAMERA_BUTTON)
Программно включить приложение Камера, сделать снимок и получить результат (MediaStore.ACTION_IMAGE_CAPTURE)
Запуск камеры в нужном режиме (MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA, MediaStore.INTENT_ACTION_VIDEO_CAMERA)
Запустить приложение Камера в режиме видеозаписи и получить результат
Вызвать такси (наверное, только в США).
fun callCar() {
val intent = Intent(ReserveIntents.ACTION_RESERVE_TAXI_RESERVATION)
if (intent.resolveActivity(packageManager) != null) {
startActivity(intent)
}
}
Создать заметку (не проверял).
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)
}
}
Я не проверял.
Intent intent = new Intent(Intent.ACTION_VOICE_COMMAND);
startActivity(intent);
Twitter можно запустить через намерение. Если на устройстве установлено родное приложение, то запустится оно, иначе запустится веб-версия:
try {
startActivity(new Intent(
Intent.ACTION_VIEW,
Uri.parse("twitter://user?screen_name=" + twitter_user_name)));
} catch (Exception e) {
startActivity(new Intent(Intent.ACTION_VIEW,
Uri.parse("https://twitter.com/#!/" + twitter_user_name)));
}
Вместо переменной twitter_user_name необходимо подставить нужный аккаунт.
// файл выбирается из списка
@Override
protected void onListItemClick(ListView l, View v,
int position, long id) {
//super.onListItemClick(l, v, position, id);
String uriString = l.getItemAtPosition(position).toString();
Uri intentUri = Uri.parse(uriString);
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(intentUri, "video/mp4");
startActivity(intent);
}
Запускаем программу Музыка:
if (android.os.Build.VERSION.SDK_INT >= 15) {
Intent intent = Intent.makeMainSelectorActivity(Intent.ACTION_MAIN,
Intent.CATEGORY_APP_MUSIC);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);// Min SDK 15
startActivity(intent);
} else {
Intent intent = new Intent(MediaStore.INTENT_ACTION_MUSIC_PLAYER); //"android.intent.action.MUSIC_PLAYER"
startActivity(intent);
}
До версии API 15 использовался код из блока else. В новых версиях нужно использовать более сложную конструкцию.
Выше были показаны несколько примеров, которые открывают различные экраны из приложения "Настройки". Вот ещё несколько примеров.
String intent1 = Settings.ACTION_APPLICATION_SETTINGS; // Приложения. Вкладка Сторонние приложения
String intent2 = Settings.ACTION_WIRELESS_SETTINGS; // Беспроводные сети
String intent3 = Settings.ACTION_SETTINGS; // Основное окно приложения Настройки
String intent4 = Settings.ACTION_DATA_ROAMING_SETTINGS; // роуминг
String intent5 = Settings.ACTION_LOCALE_SETTINGS; // настройки локали
String intent6 = Settings.ACTION_INTERNAL_STORAGE_SETTINGS; // настройки внутреннего хранилища
String intent7 = Settings.ACTION_MEMORY_CARD_SETTINGS; // настройка карты-памяти
String intent8 = Settings.ACTION_FINGERPRINT_ENROLL; // настройка Fingerprint
String intent9 = Settings.ACTION_HOME_SETTINGS; // настройка Default apps API 21
String intentX = Settings.ACTION_NETWORK_OPERATOR_SETTINGS; // настройка Mobile network
String intentX = Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS; // настройка уведомлений Do Not Disturb access API 23
String intentX = Settings.ACTION_USAGE_ACCESS_SETTINGS; Apps with usage access API 21
String intentX = Settings.ACTION_PRINT_SETTINGS; // Printing
String intentX = Settings.ACTION_PRIVACY_SETTINGS; // Backup
String intentX = Settings.ACTION_SOUND_SETTINGS; // Sound
String intentX = Settings.ACTION_USER_DICTIONARY_SETTINGS; // Personal dictionary
String intentX = Settings.ACTION_VOICE_INPUT_SETTINGS; // Assist & voice input API 21
String intentX = Settings.ACTION_VPN_SETTINGS; // VPN API 24
String intentX = Settings.ACTION_VR_LISTENER_SETTINGS; // VR helper services API 24
String intentX = Settings.ACTION_ZEN_MODE_PRIORITY_SETTINGS; // Priority only allows API 26
// Подставьте нужную строку
Intent intent = new Intent(Settings.ACTION_DATA_ROAMING_SETTINGS);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intentX);
}
Страница документации по основным намерениям. Есть смысл иногда заглядывать за новинками.
В API 14 появилась встроенная возможность вызвать диалоговое окно для отправки отзыва. На устройстве должен быть установлен Play Services.
Intent intent = new Intent(Intent.ACTION_APP_ERROR);
startActivity(intent);
Могу ли запустить намерение для загрузки приложения
Android Intents with Chrome - Google Chrome