Содержание
Приложение Blazor Hybrid может открывать приложение для звонков с уже набранным номером абонента, а также формировать SMS и также открывать готовое сообщение в приложении по умолчанию на вашем устройстве под управлением Android. Для этих целей используются интерфейсы IPhoneDialer
и ISms
.
Подготовка манифеста приложения
Для того, чтобы наше приложение могло использовать «звонилку» и приложение для отправки SMS в Android 11 и более поздних версиях, необходимо внести изменения в файл манифеста приложения.
Создадим новое приложение Blazor Hybrid. Теперь кликнем правой кнопкой мыши на файле Platforms/Android/AndroidManifest.xml и выберем в меню пункт «Открыть с помощью…»:
В появившемся окне выберем пункт «Редактор (текстовый) XML» и нажмем «Ок»:
Откроется обычный редактор XML, содержащий манифест нашего приложения. Изменим содержимое файла следующим образом:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"> <application android:allowBackup="true" android:icon="@mipmap/appicon" android:roundIcon="@mipmap/appicon_round" android:supportsRtl="true"></application> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <queries> <intent> <action android:name="android.intent.action.DIAL" /> <data android:scheme="tel"/> </intent> <intent> <action android:name="android.intent.action.VIEW" /> <data android:scheme="smsto"/> </intent> </queries> </manifest>
Нашему приложению для работы требуется запросить два приложения пользователя — звонилку и приложение для отправки сообщений. Но, при этом мы не знаем какие именно приложения используются на устройстве пользователя. В этой ситуации мы перечисляем сигнатуры фильтра намерений в элементе <queries>
.
Первый элемент:
<intent> <action android:name="android.intent.action.DIAL" /> <data android:scheme="tel"/> </intent>
Используется для запроса приложения для набора номера. Второй
<intent> <action android:name="android.intent.action.VIEW" /> <data android:scheme="smsto"/> </intent>
для отправки SMS. Теперь наше приложение сможет запрашивать необходимые приложения для работы. При этом, если у пользователя установлено, например, три приложения для отправки сообщений, то наше приложение будет давать выбор — какое именно стороннее приложение использовать.
Набор телефонного номера (IPhoneDialer)
Интерфейс IPhoneDialer
предоставляет нам свойство
public bool IsSupported { get; }
которое проверяет поддерживается ли функция набора номера на устройстве. И один метод:
public static void Open (string number);
который открывает средство набора номера с введенным номер телефона.
Перепишем код компонента Home
в нашем приложении следующим образом:
@page "/" @using Microsoft.Maui.ApplicationModel.Communication <h1>Hello, world!</h1> <button @onclick="Call">Позвонить</button> @code{ private void Call() { if (PhoneDialer.Default.IsSupported) PhoneDialer.Default.Open("000-000-0000"); } }
Здесь в метода Call()
строка «000-000-0000» — телефонный номер, который необходимо набрать. Теперь, если запустить приложение и нажать кнопку «Позвонить», то мы увидим
Отправка SMS (ISms)
Интерфейс ISms также предоставляет нам свойство
public bool IsComposeSupported { get; }
указывающее, поддерживает ли устройство создание SMS. А также метод:
public Task ComposeAsync (SmsMessage? message);
для создания сообщения и открытия sms-клиента на устройстве пользователя. При этом, класс SmsMessage
содержит следующие свойства
Свойство | Тип | Описание |
Body |
string |
Текст сообщения. |
Recipients |
List<string> |
Получатели сообщения (телефонные номера). |
В классе Sms определена перегруженная версия метода ComposeAsync()
без параметров, которая просто открывает sms-клиент на устройстве пользователя. Добавим в наше приложение возможность отправки SMS. Изменим код компонента следующим образом:
@page "/" @using Microsoft.Maui.ApplicationModel.Communication <h1>Hello, world!</h1> <button @onclick="Call">Позвонить</button> <button @onclick="SendSms">Отправить SMS</button> @code{ private void Call() { if (PhoneDialer.Default.IsSupported) PhoneDialer.Default.Open("000-000-0000"); } private async void SendSms() { if (Sms.Default.IsComposeSupported) { string[] recipients = new[] { "000-000-0000", "111-111-1111" }; string text = "Привет! Это сообщение от Blazor Hybrid"; var message = new SmsMessage(text, recipients); await Sms.Default.ComposeAsync(message); } } }
Здесь мы добавили новую кнопку:
<button @onclick="SendSms">Отправить SMS</button>
при клике по которой выполняется метод:
private async void SendSms() { if (Sms.Default.IsComposeSupported) { string[] recipients = new[] { "000-000-0000", "111-111-1111" }; string text = "Привет! Это сообщение от Blazor Hybrid"; var message = new SmsMessage(text, recipients); await Sms.Default.ComposeAsync(message); } }
здесь проверяем возможность создания sms на устройстве, а затем формируем сообщение, используя список телефонных номеров получателей сообщения:
string[] recipients = new[] { "000-000-0000", "111-111-1111" };
и его текст
string text = "Привет! Это сообщение от Blazor Hybrid";
Теперь запустим приложение и проверим его работу. Главная страница нашего приложения:
После того, как вы нажмете кнопку «Отправить SMS», появится окно выбора приложения для отправки. Например, я выбрал в качестве sms-клиента стандартное приложение Xiaomi «Сообщения». В итоге у меня на устройстве открылся клиент со следующим содержимым:
Некоторые клиенты не могут отправлять сообщения на произвольные номера. Например, если вы выберите WhatsApp, то увидите следующее сообщение:
Но, в любом случае, наше приложение корректно обрабатывает наши запросы — пытается открыть выбранный клиент для отправки сообщения.
Итого
Для набора номера и обмена SMS в Android используются интерфейсы IPhoneDialer
и ISms
. Эти интерфейсы используются для того, чтобы открыть стороннее приложение, установленное на устройстве пользователя для выполнения определенных действий. Поэтому, если мы используем Android 11 или более позднюю версию, то мы должны обязательно добавить в манифест приложения фильтр намерений для того, чтобы наше приложение могло запускать другие приложения.