Разработка под Android в .NET MAUI. Отправка SMS

Отправка SMS, с учётом развития различных приложений для отправки сообщений типа WhatsApp и Telegram, не столь важна для коммуникации, однако, в .NET MAUI предусмотрена и такая возможность. Поэтому в этой части мы, опираясь на уже созданное приложение по работе с контактами и набору телефонного номера, разберемся с тем как в приложениях .NET MAUI организовать отправку сообщений абонентам.

Исходный код приложения с которым мы сейчас будем работать можно скопировать из этой части

Интерфейс ISms

Как и интерфейс IPhoneDialer, интерфейс ISms предназначен для открытия приложения по умолчанию для отправки сообщений с уже набранным текстом сообщения и номерами получателей.

Этот интерфейс предоставляет нам одно свойство:

public bool IsComposeSupported { get; }

определяющее доступна ли отправка SMS с этого устройства и один метод:

public Task ComposeAsync(SmsMessage? message);

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

Свойство Тип Описание
Body string? Текст сообщения
Recipients List<String> Получатели сообщения (номера телефонов)

 

Таким образом, для отправки сообщения, мы должны сформировать объект типа SmsMessage и вызвать метод ComposeAsync(). Реализация интерфейса ISms по умолчанию содержится в свойстве Default статического класса Sms. Доработаем наше приложения для того, чтобы по выбранному номеру абонента можно было отправлять SMS.

Отправка SMS в .NET MAUI

Изменение манифеста приложения

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

<?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>
    </queries>
</manifest>

Изменим файл следующим образом:

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

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

<intent>
    <action android:name="android.intent.action.VIEW" />
    <data android:scheme="smsto"/>
</intent>

Теперь воспользуемся реализацией интерфейса ISms по умолчанию для отправки сообщений.

Команда для отправки SMS абоненту

Изменим модель представления ContactsViewModel, добавив в немм новую команду для отправки SMS абоненту:

public class ContactsViewModel: INotifyPropertyChanged
{
    ...

    public ICommand SendSmsCommand { get; set; }

    public ContactsViewModel() 
    {
        
        SendSmsCommand = new Command(async()=>
        {
            if ((Sms.Default.IsComposeSupported) && (SelectedPhone != null))
            {
                var message = await AppShell.Current.CurrentPage.DisplayPromptAsync("Текст SMS", "Введите текст сообщения");
                SmsMessage sms = new SmsMessage(message,SelectedPhone.PhoneNumber);
                await Sms.Default.ComposeAsync(sms);
            }
            
        });

        ...
    }

  ...

}

Здесь мы проверяем возможность отправки SMS с устройства и выбран ли какой-либо телефон для отправки. После чего, используя метод DisplayPromptAsync() класса Page, просим пользователя ввести сообщение. Так как метод ComposeAsync() допускает null в тексте сообщения, то дополнительную проверку текста сообщения мы не производим, а сразу открываем клиент для отправки сообщений.

Теперь добавим на страницу MainPage новую кнопку:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:MauiPhone.ViewModels"
             xmlns:model="clr-namespace:Microsoft.Maui.ApplicationModel.Communication;assembly=Microsoft.Maui.Essentials"
             x:Class="MauiPhone.MainPage"
             x:DataType="local:ContactsViewModel">

    <ScrollView>
        <VerticalStackLayout
            Padding="30,0"
            Spacing="25">

            ...

            <Button Text="Отправить сообщение" Command="{Binding SendSmsCommand}" />

        </VerticalStackLayout>
    </ScrollView>

</ContentPage>

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

Отправка SMSНабрав текст сообщения и нажав кнопку «OK» вы увидите список приложений для отправки SMS, установленных на устройстве

Отправка SMSПосле выбора клиента для отправки сообщений откроет его окно с уже набранным текстом SMS и адресатом:

Отправка SMS

Итого

Для отправки SMS абонентам в .NET MAUI используется интерфейс ISms реализация которого по умолчанию содержится в свойстве Default статического класса Sms. Отправка SMS осуществляется с использованием одного из клиентов, установленных на устройстве.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии