Android разработка прием sms

Отправка и получение SMS сообщений в Android

Как это ни удивительно, SMS сообщений сегодня остаются одним из самых востребованных сервисов, что вполне объясняет интерес, проявляемый Android разработчики к этой тема. Из данного урока Вы узнаете, как программно отправлять и получать SMS сообщения. Будет показано, как провести тестирование приложения на эмуляторе.

Отправка SMS сообщений в Android

Создайте в Eclipse новый проект со следующими параметрами:

  • Project Name: SMSMessaging
  • Package name: net.learn2develop.SMSMessaging
  • Activity Name: SMS
  • Application Name: SMS App

Для того, чтобы наше прилоение могло работать с SMS, ему необходимо дать соответствующие разрешения: SEND_SMS для отправки и RECEIVE_SMS — для получения. Откройте файл AndroidManifest.xml и приведите его к виду:

Настроим шаблон дизайна приложения. Откройте файл res/layout/main.xml и приведите его к виду

В результате у Вас должен получиться следующий шаблон:

Перейдем к редактированию кода. В SMS activity напишем обработчик нажатия на кнопку. После щелчка мы должны проверить введен ли номер телефона и текстовое сообщение. Если все в порядке, мы вызываем функцию sendSMS(), которая отправляет сообщение.

Напишем реализацию функции sendSMS()

Для отправки SMS сообщения в Android используется класс SmsManager. в отличии от друих классов, мы не можем получить экземпляр SmsManager напрямую. Для решения этой задачи необходимо вызвать статический метод getDefault(), который возвращает требуемый объект класса SmsManager. Метод sendTextMessage() отправляет sms сообщение с помощью PendingIntent. Объект PendingIntent используется для определения activity, которая будет вызвана после отправки сообщения. В приведенном выше коде объект pi ссылается на ту же activity из которой он вызывается, то есть после отправки SMS сообщения activity не поменяется.

Если Вы хотите отслеживать состояние процесса отправки сообщения, вам понадобится два объекта PendingIntent и два объекта BroadcastReceiver

В приведенном выше листинге объект sentPI используется для отслеживания процесса отправки. Когда SMS сообщение отправлено, генерируется первое событие onReceive для BroadcastReceiver. Именно здесь можно проверить статус процесса отправки. Объект PendingIntent (deliveredPI) используется для мониторинга доставки. Когда сообщение успешно доставлено, генерируется еще одно событие onReceive для BroadcastReceiver.

Теперь можно провести тесстирование приложения. При отладке на компьютере можно посылать сообщения от одного эмулятора другому. Для этого просто запустите два эмулятора (в папке android SDK зайдите в каталог Tools Emulator.exe). В качестве номера, куда вы отправляете SMS, нужно указать номер порта эмулятора. Его можно увидеть в загаловке окна эмулятора в круглых скобках. На рисунке показан пример отправки сообщения с эмултора 5554 на эмулятор 5556.

После успешной отправки SMS пользователю будет показано сообщение «SMS sent». После того, как сообщение будет принято на другом устройстве, пользователь увидит «SMS delivered». К сожалению, в случае тестирования на эмуляторе Вы не увидите этого сообщения. Возможность проверять успешность доставки доступна только на реальных устройствах.

Если Вы не хотите разбираться в тонкостях отправки SMS сообщений, то можете воспользоваться встроенным в Android стандартным приложением, дав ему задание через интент.

Получение SMS сообщений в Android

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

Чтобы Ваше приложение могло перехватывать SMS-ки, нужно в файле AndroidManifest.xml добавить элемент . В приведенном ниже примере для получения сообщений будет использоваться класс SmsReceiver.

Теперь нужно добавить в проект новый класс SmsReceiver.java, который является наследником BroadcastReceiver. Внутри SmsReceiver нужно написать собственную реализацию метода onReceive()

При получении SMS сообщения вызывается метод onReceive. SMS сообщение упаковывается и присоединяется к объекту intent (второй параметр метода onReceive). SMS сохраняется в массиве Object в PDU формате. Чтобы распаковать SMS сообщение нужно воспользоваться методом createFromPdu() класса SmsMessage. После этого можно отобразить сообщения с помощью класса Toast

Вот, собственно, и все! Можете запускать эмуляторы и тестировать приложение. На приведенном ниже рисунке с помощью класса Toast показано полученное сообщение.

Заключение

В этой небольшой статье было показано, как можно отправлять и получать SMS сообщения в Android. Это очень интересная и нужная возможность. Например, вы можете написать приложение, которое будет отслеживать положение телефона. Вы можете отправлять зашифрованные SMS сообщения этому приложению, и оно будет отправлять вам ответ с координатами аппарата.

Исходный код примера можно скачатьздесь.

Читайте также:  Процесс com android systemui был остановлен

Источник

Android разработка прием sms

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

Создаем новый проект, минимальную версию Android выставляем 2.3. Создаем пустую активность Empty Activity.

Нашему будущему приложению нужно получить 3 разрешения в файле манифеста:

RECEIVE_SMS – для приема смс сообщений;

READ_SMS – для чтения смс сообщений;

READ_CONTACTS – для отображения имени того, чье сообщение пришло.

Добавим в AndroidManifest.xml следующие строки:

Наше приложение будет иметь только портретную ориентацию, поэтому объявим об этом в теге :

На этом работа с файлом AndroidManifest . xml закончена.

Теперь отредактируем файл strings.xml, добавив туда следующие строки:

Теперь возьмемся за настройку внешнего вида нашего приложения. Открываем файл интерфейса activity_main.xml. Нам нужно добавить элементы:

TextView — для отображения имени того, чья последняя смс-ка к нам прилетела;

TextView — для отображения содержимого последней смс;

ToggleButton — переключатель для включения и выключения чтения сообщений.

После добавления необходимых элементов наш layout файл имеет вид:

Теперь создадим новый класс для настройки нашего говоруна. Создаем новый java класс Speaker.java. Он будет использоваться для того, чтобы избежать запуска TTS API вместе с основным Activity. Этот класс будет осуществлять OnInitListener интерфейс, который будет сообщать, что TTS готов к использованию. Мы запишем этот показатель готовности к работе как логическую переменную с именем ready. Также зададим еще одну логическую переменную allowed, которая принимает значение true когда пользователь разрешил TTS проговаривать сообщения. Также мы создадим методы для получения и настройки значений этих переменных. Итак, если все сказанное ввести в наш класс, он примет вот такой вид:

Интерфейс OnInitListener имеет всего один метод – onInit. Этот метод выполняется когда TTS инициализирован. Параметр Status позволяет нам узнать, как прошла инициализация. Когда подтверждается, что инициализация прошла успешно, мы должны настроить нужный язык для работы TTS. Поэтому добавляем этот метод:

Далее мы добавляем метод speak, который и будет читать сообщения, когда это возможно. Перед тем, как начать чтение, метод проверяет значения введенных нами переменных allowed и ready, имеют ли они значение true. Генерируемая речь размещается в потоковом уведомлении:

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

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

Теперь отредактируем файл MainActivity.java. Нам нужно объявить здесь о созданных в layout элементах (TextView и ToggleView), объявить две целых величины LONG_DURATION и SHORT_DURATION, они будут использоваться в методе pause класса Speaker.java. Также объявляем целую величину CHECK_CODE, ее значение не важно, она будет использоваться в методе startActivityforResult для определения результата. Также объявляем объекты Speaker и BroadcastReceiver. На данный момент MainActivity . java имеет вид:

Добавим метод, который будет проверять, установлен ли на устройстве TTS. Проверка выполняется использованием результата из класса Speaker . java .

Когда результат из startActivityForResult получен, вызывается метод onActivityResult. В этом методе, если мы получаем положительный результат проверки, мы инициализируем объект Speaker, если результат отрицательный — предлагаем пользователю установить TTS.

Теперь, чтобы установить связь с входящими сообщениями, создаем объект BroadcastReceiver. Каждый раз, когда приходит новое сообщение, вызывается метод onReceive этого объекта. Далее, используя класс SmsMessage, выполняется анализ сообщения. После этого, мы используем методы getDisplayMessageBody и getOriginatingAddress для извлечения из проведенного анализа нужной нам информации.

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

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

Читайте также:  Русские квесты с кешем андроид

Перед использованием BroadcastReceiver его нужно зарегистрировать. Создаем фильтр для входящих текстовых сообщений IntentFilter и регистрируем smsReceiver:

Пришло время поработать над методом onCreate. Здесь мы инициализируем все объявленные объекты. Также инициализируем toggleListener для настройки значения allowed из класса Speaker.java.

После инициализации вызываем методы checkTTS, initializeSMSReceiver, registerSMSReceiver:

Ну и под конец, используем метод onDestroy для отключения нашего TTS, чтобы он не занимал попусту ресурсы, когда мы его не используем:

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

Также предлагаю ознакомиться с уроком по реализации преобразования голоса в текст. Удачи!

Источник

XMPP-SMS шлюз на Android

Введение

Причиной написания данной статьи послужила необходимость создания программы для системы Android, с помощью которой можно отправлять данные заказа в виде SMS сообщений владельцам интернет магазинов о том, что был совершен заказ товаров или услуг. Ранее мною использовалась система включающая GSM-модем и программу написанную на языке С++, использовавшая AT-команды для общения с модемом и библиотеку gloox для получения сообщений по протоколу XMPP, на стороне web-сайта использовалась библиотека xmpphp, для отправки данных заказа. При такой схеме приходилось держать включенным компьютер постоянно, так как система приема заказов работала круглосуточно, соответственно отсюда дополнительный расход электроэнергии, шум от вентиляторов ночью и постоянный контроль интернет соединения.

Основной задачей программы, которую мы будем создавать на протяжении статьи, является получение сообщения определенного формата, по протоколу XMPP и последующая передача полученных данных через SMS. Средой разработки будет являться Eclipse с установленным плагином ADT и необходимыми SDK. Для взаимодействия по протоколу XMPP будет использоваться библиотека SMACK для Android устройств.

1. Отправка SMS сообщения

Сначала создадим каркас нашего приложения, который в последующем будем наращивать необходимым функционалом. Для этого создадим в Eclipse, Android Project (Ctrl+N – Android – Android Project) со следующими данными:

После создания нового проекта, добавим необходимое разрешение (Permission) в файле AndroidManifest.xml для возможности отправки SMS сообщений. Для этого в среде разработки Eclipse открываем файл AndroidManifest.xml, переходим на вкладку Permissions, нажимаем кнопку «Add…», в появившемся окне выбираем пункт «Uses Permission», нажимаем кнопку «OK», далее появиться возможность выбора разрешения, в списке находим и выбираем пункт android.permission.SEND_SMS, сохраняем наши действия. После всех манипуляций вкладка Permissions будет выглядеть следующим образом:

Теперь, для примера рассмотрим самый простой способ отправки SMS сообщения, протестировать который можно в обычном эмуляторе Android. Для этого создадим два новых виртуальных устройства, с помощью менеджера виртуальных устройств Android (Window – AVD Manager) со следующими параметрами:

В созданном нами проекте, в методе onCreate добавим следующий код:

Далее запускаем оба эмулятора Android, каждый из которых будет иметь собственный номер для проверки отправки и приема SMS сообщений, когда завершиться запуск и инициализации эмуляторов, нужно запустить наше приложение на эмуляторе с номером 5554, после запуска приложения, эмулятор с номером 5556 получит наше SMS сообщение.

Отправка SMS сообщения осуществлялась с помощью класс SmsManager, который позволяет в системе Android производить необходимые действия с SMS сообщениям. Для инициализации объекта данного класса, использовался статический метод SmsManager.getDefault(). Отправка SMS сообщения производится при помощи метода sendTextMessage, где параметрами метода являются:

destinationAddress – Номер, на который отправляется сообщение;
scAddress – Номер SMS-центра вашего оператора сотовой связи, через который происходит передача сообщения, если данный параметр имеет нулевое значение, тогда используется номер по умолчанию;
text – Текст SMS сообщения;
sentIntent – Если не нулевое значение, то в данный параметр передается объект PendingIntent, для получения сообщений о результате отправки сообщения;
deliveryIntent – Если не нулевое значение, то в данный параметр передается объект PendingIntent, для получения сообщений о результате доставки сообщения.

Эмулятор Android прекрасно справляется с возложенными на него задачами, но имеет ряд ограничений, например, проверить результат доставки сообщения на нем не возможно, для этого придется использовать реальное устройство, что и будет сделано в дальнейшем. Так же при отправке сообщения с помощью метода sendTextMessage, длина его не может превышать 160 символов. Для более длинных сообщений необходимо использовать метод sendMultipartTextMessage, который в свою очередь так же позволяет отправлять сообщения длиной менее 160 символов.
В приведенном выше примере, мы не получаем уведомлений об отправке SMS сообщения и его доставки получателю, поэтому расширим функционал приложения добавив необходимые обработки. Для этого в приложении необходимо зарегистрировать два приемника широковещательных намерений, которые будут обрабатывать необходимые намерения и выводит на экран соответствующие текстовые сообщения.

Читайте также:  Recovery для андроид zte

В редакторе ресурсов добавим к нашему основному окну приложения виджет TextView, для вывода информации на экран.

Код приложения после внесения изменений примет следующий вид:

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

2. Создание службы для работы по протоколу XMPP

Теперь необходимо добавим к нашему приложению возможность взаимодействия по протоколу XMPP. Для этих целей создадим службу (Service) которая будет работать в фоновом режиме. Служба при помощи библиотеки SMACK, будет принимать и обрабатывать сообщения. Далее с помощью широковещательных намерений данные из полученного сообщения буду передаваться в основной класс приложения, для вывода на экран и последующей передаче через SMS.

Для того чтобы добавить службу в наше приложение, необходимо определить для нее класс реализации, для этого в среде разработки Eclipse, необходимо нажать правой кнопки мыши по имени пакета проекта, в появившемся меню выбрать пункт New и Class, как показано на рисунке:

В появившемся окне заполняем необходимые пункты, указанные на изображении и нажимаем кнопку «Finish»:

После этих действий в проекте появиться реализация класса, далее необходимо зарегистрировать класс службы в файле AndroidManifest.xml, для этого открываем файл в среде разработки Eclipse, переходим на вкладку Application и в разделе Application Nodes нажимаем кнопку «Add», в появившемся окне выбираем пункт Service и нажимаем кнопку «OK». После необходимо указать имя класса службы, после всех манипуляций вкладка Application будет выглядеть следующим образом:

Теперь добавим еще одно разрешение для приложения, чтобы оно могло выходить в Интернет, для этого проделайте те же действия что и выше для разрешения по отправке SMS сообщения, только в этот раз выберите android.permission.INTERNET.

Следующим шагом будет добавление библиотеки SMACK к приложению, скачайте ее по адресу http://code.google.com/p/asmack/ сохраните в папке проекта, далее откройте свойства проекта, для этого нажмите правой кнопкой мыши на имени проекта в среде разработки Eclipse, в появившемся меню выберите пункт Properties. В появившемся окне настроек проекта, выберите в левом списке, пункт Java Build Path, после нажмите кнопку «Add External JARs…», найдите ранее сохраненную библиотеку в папке проекта и добавьте ее. После добавления внешней библиотеки окно настроек примет следующий вид:

Ниже приведен исходный код службы, как видно в методе onCreate создается отдельный поток, в котором происходит основная работа по взаимодействию по протоколу XMPP при помощи библиотеки SMACK. Полученные сообщения, а так же иные состояние службы передаются при помощи отправки широковещательных намерений.

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

Как видно из приведенного кода, для отправки SMS, обрабатываются сообщения, которые имеют тип номер_телефон@текст_сообщения, например:

Для запуска службы, в основном классе приложения в метод onCreate, добавим строку:

Для остановки службы, в основном классе приложения в методе onDestroy, добавим строку:

Теперь попробуем запустить приложение в эмуляторе и через любой IM-клиент отправим сообщение определенного типа. Результат показан на изображении:

Заключение

Данная статья является ознакомительной и рассчитана на начинающих программистов, коим являюсь сам. Созданное приложение имеет ряд недостатков и ограничений, например отправка SMS сообщения будет осуществляться только когда главное окно приложения активно. Отсутствует проверка на наличие доступа в Интернет, так же если выход в Интернет осуществляется только через WI-FI, то когда устройство переходит в спящий режим, происходит отключение WI-FI, для экономии заряда батареи. Данную проблему можно избежать при помощи приложения Wi-Fi Keep Alive либо добавив данный функционал к приложению самостоятельно. Отсутствует ведение журнала принятых и отправленных сообщений.

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

Источник

Оцените статью