Android – это мощная операционная система с богатым набором встроенных возможностей для разработчиков. В этой статье мы подробно рассмотрим, как использовать различные типы Intent-ов, чтобы создавать удивительные приложения для Android без особых усилий.
Intent-ы – это механизм, позволяющий Activity в Android взаимодействовать между собой и с системой. Давайте рассмотрим несколько наиболее распространенных типов Intent-ов и как их использовать. Все строки кода, указанные в этой статье, нужно прописывать внутри методов класса вашей Activity.
Отправить смс
Для открытия встроенного в Android сервиса, отвечающего в текущей версии Android за отправку сообщений, нужно написать следующий код:
1 2 3 4 |
Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setData(Uri.parse("smsto:" + phoneNumber)); intent.putExtra("sms_body", messageText); startActivity(intent); |
Важно учитывать, что этот Java-код не отправляет сообщение. Он лишь открывает стандартное приложение Android для отправки указанного сообщения указанному номеру. Для совершения этих действий выдавать дополнительных разрешений приложению не нужно.
Далее пользователь решает самостоятельно, стоит ли отправлять такой текст.
Позвонить
Чтобы открыть встроенный сервис звонков, напишите этот код:
1 2 3 |
Intent intent = new Intent(Intent.ACTION_DIAL); intent.setData(Uri.parse("tel:" + phoneNumber)); startActivity(intent); |
Код позволяет открыть приложение телефонной книги, выставив указанный номер. Сам звонок пока не происходит – для совершения звонка пользователю ещё нужно нажать на зелёную кнопку с трубкой.
Но что, если вы хотите позвонить напрямую? Выход есть. Но для этого придётся попросить у пользователя выдать разрешения приложению. В самой логике открытия Intent-а изменений будет немного: заменить Intent.ACTION_DIAL на Intent.ACTION_CALL.
1 2 3 |
Intent intent = new Intent(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:" + phoneNumber)); startActivity(intent); |
Но в других частях изменений будет достаточно. Во-первых, нужно записать одну строчку в файл AndroidManifest.xml. Я выделю её – она позволит указать в базовом описании приложения, что ему может понадобиться разрешение на звонки. Откроем файл AndroidManifest.xml и внесём туда соответствующую строку:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.intent.example"> <uses-permission android:name="android.permission.CALL_PHONE" /> <application ... <activity ... </activity> </application> </manifest> |
Это ещё цветочки. В самой Activity (в коде на Java) нужно будет написать обработку случаев, когда разрешение выдано и не выдано, и если не выдано – просить разрешения. Вот какой у меня получился код в классе MainActivity, чтобы запросить и получить разрешение на звонки из Android-приложения:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
public class MainActivity extends AppCompatActivity { private static final int PERMISSION_REQUEST_CODE = 1; private static final String CALL_PHONE_PERMISSION = Manifest.permission.CALL_PHONE; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (isCallPermissionGranted()) { launchCallIntent(); } else { requestCallPermission(); } } /** * запуск самой функциональности приложения * (выполнить звонок) */ private void launchCallIntent() { String phoneNumber = "тут я написала номер телефона своего брата"; Intent intent = new Intent(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:" + phoneNumber)); startActivity(intent); } /** * проверка наличия разрешения на звонки */ private boolean isCallPermissionGranted() { int permissionResult = ActivityCompat.checkSelfPermission(this, CALL_PHONE_PERMISSION); return permissionResult == PackageManager.PERMISSION_GRANTED; } /** * запросить разрешение на звонки */ private void requestCallPermission() { String[] PERMISSIONS = {CALL_PHONE_PERMISSION}; ActivityCompat.requestPermissions(this, PERMISSIONS, PERMISSION_REQUEST_CODE); } /** * метод-обработчик события, когда пользователь нажимает * в диалоговом окне выдачи прав "разрешить" или "запретить" */ @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { if (isPermissionForCallsGranted(requestCode, permissions, grantResults)) { launchCallIntent(); } else { Toast.makeText(this, "Вы не выдали разрешение", Toast.LENGTH_SHORT).show(); } super.onRequestPermissionsResult(requestCode, permissions, grantResults); } /** * проверить, выдано ли было разрешение на звонки */ private boolean isPermissionForCallsGranted(int requestCode, String[] permissions, int[] grantResults) { if (requestCode != PERMISSION_REQUEST_CODE) { return false; } if (permissions.length != 1 || grantResults.length != 1) { return false; } if (!permissions[0].equals(CALL_PHONE_PERMISSION)) { return false; } return grantResults[0] == PackageManager.PERMISSION_GRANTED; } } |
Статическая переменная int PERMISSION_REQUEST_CODE нужна нам, чтобы определять, на тот ли запрос разрешений, который мы послали, был получен ответ. В данном случае можно установить ей любое значение, не только 1.
При запуске приложения, если заранее не было выдано разрешение на звонки, такое разрешение запрашивается у пользователя, и затем происходит непосредственно звонок на указанный в программе номер телефона.
Открыть URL
Из приложения Android можно открыть ссылку во встроенном браузере телефона без каких-либо разрешений. Это делается при помощи Intent-а с типом ACTION_VIEW.
1 2 3 |
String url = "https://beauty-of-java.com"; Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity(intent); |
При запуске приложения сразу же открывается браузер и осуществляется переход на указанный в коде сайт.
Браузер сам сможет отследить подозрительные сайты или те ресурсы, у которых не https, а http.
Поэтому разрешения тут также не нужны.
Поделиться в соцсетях
В приложении можно задать текст, которым пользователь сможет поделиться в различных сторонних приложениях: вк, телеграм, инстаграм, другие соцсети и просто скопировать в буфер обмена.
1 2 3 4 |
Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_TEXT, "Заходите все на сайт Beauty of Java!!!"); startActivity(Intent.createChooser(intent, "Поделиться через")); |
Запустив приложение, вы столкнётесь с панелькой для выбора, каким способом вы предпочитаете поделиться заданной в программе информацией. После выбора, к примеру, телеграма, откроется этот мессенджер и при подтверждении отправки выбранному человеку вы сможете увидеть, чем поделились.
Карты
Вы можете открывать сервис карт из своего приложения. Для этого нужно указать ширину, долготу и уровень приближения к месту действий.
1 2 3 4 5 6 7 |
int latitude = 20; int longitude = 100; int zoomValue = 5; //варьируется от 0 до 23 String uri = "geo:" + latitude + "," + longitude + "?z=" + zoomValue; Intent mapIntent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse(uri)); startActivity(mapIntent); |
При запуске такого приложения открывается сервис карт и передвигается на нужное место с заданным “зумом”. Величина приближения варьируется от 0 до 23.
Камера
Для того, чтобы сделать фото с камеры, много усилий не нужно. Также не нужно и разрешений, так как вы используете не какой-то скрытый способ фотографирования на устройстве, а самую обычную встроенную камеру.
1 2 |
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(cameraIntent, CAMERA_RESULT); |
CAMERA_RESULT – это ваша собственная константа, чтобы идентифицировать результат после завершения начатой Activity с камерой. Она может быть равна 10, 20, 19654 и так далее. Выбирайте сами. Чтобы получить результат фотографирования, нужно переопределить метод onActivityResult():
1 2 3 4 5 6 7 8 9 |
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == CAMERA_RESULT) { Bitmap thumbnail = (Bitmap) data.getExtras().get("data"); ImageView ivCamera = findViewById(R.id.someImageView); ivCamera.setImageBitmap(thumbnail); } super.onActivityResult(requestCode, resultCode, data); } |
Конкретно здесь идёт передача сделанной фотографии в ImageView в интерфейсе приложения. Обращение к графическому компоненту идёт через Java-код. Сделанную фотографию можно использовать по-разному. Можно отобразить её в приложении, сохранить на устройстве, поделиться в социальных сетях и так далее.
В приложении открывается стандартная камера устройства, а затем, если вы делаете там фотографию, то результат возвращается в программу, которая может его уже каким-либо способом использовать.
Распознать речь
Вы можете встроить в своё приложение сервис Speech To Text, чтобы распознавать речь и получать список вариантов, на какие слова сказанное пользователем было похоже. Здесь, как и в случае с камерой, необходимо запустить Activity с результатом выполнения, чтобы затем обработать то, что получится.
1 2 3 4 5 |
Intent speechIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); speechIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); speechIntent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Говорите, пожалуйста"); startActivityForResult(speechIntent, RESULT_SPEECH_TO_TEXT); |
Обработать результат сказанного можно следующим кодом:
1 2 3 4 5 6 7 8 9 10 |
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == RESULT_SPEECH_TO_TEXT && resultCode == RESULT_OK) { ArrayList<String> matches = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); for (String match : matches) { Toast.makeText(this, match, Toast.LENGTH_LONG).show(); } } super.onActivityResult(requestCode, resultCode, data); } |
Все совпадения сохраняются в список ArrayList<String> matches. В итоге при запуске приложения отображается преобразователь устной речи в текст. Если сказать “Большой розовый пони”, то он, как сумеет, так распознает. Затем распознаватель выдаст несколько вариантов распознанных фраз.
Контакты
Чтобы предоставить пользователю выбор контакта и получить результат выбора, нужно в первую очередь занести соответствующее разрешение в AndroidManifest.xml.
1 |
<uses-permission android:name="android.permission.READ_CONTACTS" /> |
Затем нужно написать код запуска Intent-а, позволяющего открыть телефонную книгу, и запустить Activity с последующим результатом. SELECTION_RESULT – задаваемая лично вами константа. Она нужна, чтобы потом определить, к какому действию относится пришедший результат.
1 2 3 |
Intent selectContactIntent = new Intent(Intent.ACTION_PICK, android.provider.ContactsContract.Contacts.CONTENT_URI); startActivityForResult(selectContactIntent, SELECTION_RESULT); |
Чтобы обработать результат выбора контакта из телефонной книги, напишите следующий код. Затем добавьте функционал, определяющий, что с этим Uri контакта делать:
1 2 3 4 5 6 7 8 |
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == SELECTION_RESULT && resultCode == RESULT_OK) { Uri uri = data.getData(); ... } super.onActivityResult(requestCode, resultCode, data); } |
Как и нужно, при запуске приложения открывается телефонная книга с контактами. В ней можно выбрать один контакт из списка.
Почта
Вы можете открыть сервис отправки почты из своего проекта. Там можно указать тему и содержимое письма, а также не один адрес для отправки. Этот код не будет отправлять письмо, а откроет соответствующий сервис с заполненными соответствующими полями. Поэтому разрешений ему также не требуется.
1 2 3 4 5 6 7 8 |
String[] emails = { "custom_email@gmail.com" }; Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setData(Uri.parse("mailto:")); intent.putExtra(Intent.EXTRA_EMAIL, emails); intent.putExtra(Intent.EXTRA_SUBJECT, "Здравствуйте!"); intent.putExtra(Intent.EXTRA_TEXT, "До свидания!"); startActivity(intent); |
После запуска приложения предлагается выбрать, с помощью какого почтового сервиса обработать запрос. Затем открывается почта с заданными параметрами письма. Письмо ещё не отправлено – пользователь сам подумает о целесообразности такой корреспонденции.
Используя эти возможности Intent-ов, вы можете создавать богатые и функциональные приложения для Android. Они смогут взаимодействовать с различными аспектами устройства и операционной системы. Не нужно писать столько полезных функций своими ручками – они уже были созданы до вас. Используйте это с умом. Лучше тратьте время на разработку уникального функционала, пользуясь готовыми решениями для шаблонных функций.