Основываясь на ответах на мой вопрос, публикую данный топик. «Антиспам» — несколько громкое название для сделанного приложения, так как на данном этапе оно представляет собой лишь черный список отправителей. Однако в будущем я планирую сделать действительно антиспам с автоматической фильтрацией. Материал, расположенный ниже, рассчитан на тех, кто хоть чуточку знаком с разработкой под Android и делал хоть какие-то шаги для разработки своего собственного приложения, так как я не буду рассказывать про создание всего приложения с нуля, а расскажу только о наиболее интересных и важных моментах. Кому интересно, добро пожаловать под кат.
Ты помнишь, как все начиналось?
Небольшое лирическое отступление. Началось все с того, что я где-то слил номер своего мобильного телефона. Я даже подозреваю где именно, так как моим друзьям, которые регистрировались на том же сайте, что и я, приходят те же спам сообщения в одно и то же время. Но сейчас не об этом.
По пятницам мне стали приходит рекламы различных клубов и с каждой неделей поток сообщений только увеличивался. Поскольку я стал обладателем телефона на базе ОС Android, то я решил сделать приложение, которое будет бороться с этим безобразием. Программисты никогда не ищут легких путей – к мобильному оператору я обращаться не хотел, да и к тому же я давно хотел начать разрабатывать под Android.
Дима Масленников проверяет услуги по ремонту кондиционеров // Чёрный список
Архитектура и схема работы приложения
- Собственно фильтр, принимающий и фильтрующий смс сообщения;
- База данных, которая хранит черный список отправителей и сообщения, полученные от них;
- Пользовательский интерфейс.
Первый прототип
Сказано сделано. Однако реализация первого прототипа не прожила и дня. Дело в том, что я пытался ловить событие о получении текстового сообщения, и в обработчике этого события удалять из папки «Входящие» все сообщения, отправители которых находились в черном списке.
Проблема заключается в том, что владелец телефона все равно слышал бы сигнал, информирующий о получении СМС, а при открытии папки с входящими ничего нового бы там не видел! И это как-то не хорошо. Поэтому я начал искать способ перехватить сообщение, еще до того, как оно попадет в папку «Входящие».
Перехват сообщений
- Создать свой класс, унаследованный от BroadcastReceiver и перегрузить метод onReceive;
- Зарегистрировать его в системе и указать, какие типы рассылок мы хотим получать.
Создание слушателя
Метод onReceive срабатывает каждый раз, когда на телефон приходит СМС сообщение. Из параметра intent можно извлечь всю необходимую информацию. Внимание, согласно документации, класс, унаследованный от BroadcastReceiver, актуален только во время выполнения метода onReceive. Это значит, что система может уничтожить экземпляр класса как только закончиться выполнение указанного метода. Также это значит, что не стоит хранить какую либо информацию в нестатических полях класса.
В первых двух строках мы извлекаем информацию о PDU. Грубо говоря, это СМС в «сыром» виде. После проверки на пустоту мы пытаемся извлечь информацию о сообщении с помощью статического метода fromPdus() в самописном классе Sms, который будет описан позднее.
Java. Обращение односвязного списка.
Затем мы с помощью класса Filter проверяем, не находится ли отправитель только что полученного СМС сообщения в черном списке. Если находится, что мы сохраняем сообщение в БД и с помощью метода abortBroadcast() прерываем рассылку. Это значит, что все получатели с более низким приоритетом, зарегистрированные на получение уведомления о СМС, даже не узнают, что такое событие имело место быть. Нашему получателю мы установим самый высокий приоритет (даже выше получателя, который издает звуки и вибрирует устройством), чтобы не беспокоить пользователя в случае получения спам-сообщения. О приоритетах читайте чуть ниже.
В предыдущей версии приложения, в методе onReceive соединение с БД открывалось дважды: первый раз в классе Filter при проверке сообщения, а второй раз непосредственно при записи смс в БД. Однако я отказался от такого подхода и сделал код «чуть более неправильным» с точки зрения «красивости» кода, так как время выполнения метода onReceive ограничено 10ю секундами и открывать два соединения подряд не имеет смысла. Ведь если наш метод не уложиться в отведенное время, то Android вызовет метод следующего получателя и тогда пользователь будет проинформирован о получении смс.
Регистрация слушателя
- Программно при помощи метода registerReceiver(). В этом случае получатель будет жить только пока жив компонент, который его зарегистрировал (как правило, это Activity);
- При помощи AndroidManifest. В этом случае получатель будет жить, даже если приложение будет закрыто, и более того, даже если телефон будет перезагружен!
Очевидно, что 2й вариант является более приемлемым. Давайте посмотрим, как его можно реализовать:
Здесь все предельно просто. Указываем имя класса получателя (android:name), а затем с помощью тега intent-filter указываем приоритет (android:priority, 1000 – максимальное значение; у стандартного получателя, который вибрирует и издает звуки, приоритет 999) и на какие события мы подписываемся (android.provider.Telephony.SMS_RECEIVED).
Включение и выключение слушателя
Следует сказать, что получатель по умолчанию выключен. Отсюда вытекает то, что пользователь имеет возможность включать и выключать фильтр, путем активации и деактивации получателя СМС. В классе Filter для этого имеются соответствующие методы on(), off() и enabled().
Класс Filter, кстати говоря, является классом одиночкой (singleton), так как у нас должен быть один фильтр на все приложение, несмотря на то, что он зависит от контекста (Context). В классе SMSReceiver вы могли видеть как происходит доступ к экземпляру фильтра через статический метод filter(), который принимает экземпляр класса Context в качестве параметра.
private static Filter _filter; public static Filter filter(Context context) < if (_filter == null || !_filter._context.equals(context)) < _filter = new Filter(context); >return _filter; >
Я ни в коем случае не утверждаю, что такая реализация единственно верная. Если вы можете предложить более удачное решение, то я с удовольствием его рассмотрю.
В конструкторе класса Filter следует инициализировать необходимые для работы данные:
private final ComponentName componentName; private final PackageManager packageManager; private Context _context; private Filter(Context context)
componentName – это полное имя компонента приложения, в данном случае получателя, которое включает в себя название пакета и имя класса (SMSReceiver).
packageManager – из названия ясно, что это класс для управления компонентами приложения.
Рассмотрим метод, который включает фильтр:
public void on() < if (!enabled()) < packageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); >else < Util.showMessage(_context.getString(R.string.alreadyStarted), _context); >>
Тут все просто. Если компонент уже включен (enabled() – самописный метод, рассмотрим его чуть позже), то сообщаем пользователю об этом, если же выключен – включаем. Статический класс Util является самописным и включает в себя различные вспомогательные функции. В данном случае метод showMessage использует стандартный класс Toast для отображения сообщений на экран.
Метод off(), отключающий фильтр, полностью аналогичен методу on() за исключением того, что используется флаг PackageManager.COMPONENT_ENABLED_STATE_DISABLED, а в случае, если фильтр уже выключен, выводится соответствующее сообщение.
Метод, проверяющий состояние фильтра, выглядит еще проще:
public boolean enabled()
Проверка на вшивость
В классе Filter остался еще один метод, который не был описан. Это метод isSpam(), который, собственно, и выполняет основную задачу приложения. Метод крайне прост.
Он извлекает из смс сообщения его отправителя и пытается найти его в БД. Если таковой имеется, то сообщение считается спамом.
public boolean isSpam(Sms sms, SmsDatabase db)
Класс Sms
Класс Sms упоминался уже дважды. Надо бы рассказать про него несколько подробнее. Этот класс служит представлением СМС сообщений в приложении. Он содержит следующие поля:
private String _body; private Sender _sender; private long _timestamp;
где _body – тело сообщения, _sender – отправитель сообщения _timestamp – время получения сообщения в виде UNIX’ового timestamp’а.
Класс Sender не является стандартным для Android. Он написан руками и умеет хранить телефон отправителя, а также по необходимости извлекать имя отправителя из телефонной книги. Подробно мы не будем его рассматривать.
Как убрать, добавить, занести телефон в черный список
Черный список на телефон. Для чего нужен черный список в телефоне? В первую очередь, для того что бы заблокировать не желательные смс сообщения. А так же звонки с рекламными предложениями от банков и интернет магазинов.
Найдя нужный пункт в меню, туда можно занести номера нежелательных людей .
Некоторые модели телефонов не поддерживают создание черного списка. Или черный список есть, но как его найти и пользоваться им не понятно. Подробнее об этом далее.
Что такое Черный Список на телефоне и как его активировать.
В целом этот сервис удобен и востребован. Он бывает двух или трех типов. Заблокировать входящий звонок можно на телефоне, отфильтровав его по черному списку. Или заблокировать его на сервере оператора связи. В последнем случае услуга будет платная.
Звонящему абоненту скажут: «На этот номер не возможно дозвониться, он не доступен.» Еще один плюс такого решения: если переставить сим-карту в другой телефон, блокирование звонков сохранится, на новом телефоне ничего настраивать не придется.
Для современных телефонов — смартфонов всегда можно подобрать из каталога программу черный список на телефон. Это актуально для телефонов на базе Android, iOS, Windows Mobile и iPhone. На сегодняшний день выбор программ очень большой, подробнее об этом, читайте далее.
Если современный телефон Если у вас телефон на базе ОС Андроид версии 5 и выше, то следуйте этой инструкции.
1. Создайте контакт с номером телефона.
2. Зайдите в этот контакт.
3. Нажмите три точки (вверху справа).
4. И выберите нужный пункт. Это может быть: черный список, только голосовая почта, блокировка входящего вызова и т.п. (в зависимости от версии ОС).
Если устаревший телефон Назначьте на контакт вместо мелодии, звук ТИШИНЫ. В каждом телефоне можно создать группу контактов. Например: семья, работа, друзья. На каждую группу можно установить мелодию. Создайте на телефоне группу «ЧС». Запишите файл звука длиной 1 минута — тишины.
Назначьте этот файл в качестве мелодии на группу «ЧС». И теперь добавьте нежелательный контакт в группу «ЧС». Теперь когда позвонит человек из списка «ЧС», звук звонка вы не услышите.
Как заблокировать входящий звонок на Java и Symbian телефоне.
Для простых телефонов на базе Java, Symbian программ для перехвата звонков и блокирование их через черный список не найдено. Почему? Об этом то же написано здесь.
Но решение проблемы для телефонов на базе ОС Java и Symbian есть. Это создание черного списка на сайте Вашего оператора связи.
Инструкции о том как создать черный список в личном кабинете и занести нежелательные номера для абонентов теле2, мтс, билайн, мегафон размещены ниже.
Как занести и убрать номер телефона из Черного Списка.
Черный список — возможность телефона не принимать или не показывать звонки от нежелательных людей. Практически любой современный телефон оснащен функцией черный список в телефоне. Владельцу сотового телефона необходимо найти ее и пользоваться ей.
Добавить телефон в черный список можно через меню мобильного телефона или из раздела входящие звонки, нажав кнопку «опции» выбранного номера входящего звонка. Примерный путь до черного списка может быть такой: «Контакты» или «Телефонная книга», затем в выпавшем меню выберите «Занести телефон в черный список» и подтвердите выбор.
Убрать телефон из черного списка можно только перейдя в меню в соответствующий раздел мобильника. Вот конкретный путь в меню моего кнопочного телефона Samsung E1150i (не совсем логичный): Настройки — Приложение — Вызовы — Все Вызовы — Черный Список. Данный путь в меню телефона взят от модели Samsung E1150i. В других моделях путь до черного списка в телефоне может отличаться.
В некоторых устаревших моделях телефона опции черный список вообще нет. Но избавиться от нежелательных звонков все же можно. Решить эту проблему можно или установив соответствующую программу на смартфон или подключив услугу черный список у Вашего оператора связи. Подробнее о том как это сделать написано ниже.
Программа «Черный список». Принцип работы такой программы прост. Установив приложение «Черный список» (или ее аналоги), вы указывает список номеров, вызовы от которых не хотите слышать, с этого момента все звонящие люди с этих номеров, вместо гудков ожидания, услышат сигнал «занято», а вы в свою очередь, просто не получаете никаких уведомлений на ваш телефон. Но у вас есть возможность просмотреть историю отклоненных вызовов, и если вам это необходимо, то это то же можно убрать из списка блокировки — черного списка.
Еще в настройках приложения черный список на телефоне, можно заблокировать все входящие звонки, со всех незнакомых номеров, то есть номеров которых нет в книге контактов Вашего телефона. Необходимо помнить, что если вы переставите сим-карту в другой телефон, настройку в меню телефона придется повторить.
Скачать бесплатно программу Черный Список на телефон.
Где найти и скачать программу черный список? Для разных моделей телефонов и разных производителей имеются разные программы для создания черных списков на телефоне. Проще всего найти программу для Смартфона базе Android или iOS. Скачать и становить программу на такие телефоны можно через Google Market и App Store нажав на соответствующие кнопочки в Вашем телефоне.
Для смартфонов Nokia на OS Symbian S60 третьей версии существует соответствующее приложение в магазине Приложений Нокиа.
Для телефонов Сименс существуют специальные патчи, после перепрошивки функция черного списка появляется в меню телефона.
А вот для платформы Java или устаревших телефонов Нокия и Самсунг и прочих на ОС Symbian программа черного списка нет. Дело в том, что ОС Symbian закрытая система, в ней можно запускать только программы JAVA с урезанным функционалом, а ПО Java не работает с телефонными вызовами и книгой контактов.
Данная мини WiFi станция работает в формате 802.11n что позволяет передавать сигнал без помех на достаточно большие расстояния. подробнее.
Показать ещё
Информация взята с форума:
— А на Java есть что нибудь подобное?
— вряд ли. Иначе все бы давно уже этим пользовались!
— Постоянно врубленное приложение на Java — это тупой прожор батарейки, никто бы не пользовался.
— Java не имеет доступа к специальным функциям телефона
Программу «Черный список» на платформе Java технически сделать не возможно, в этом случае остается только одна возможность: создать черный список в личном кабинете на сайте Вашего оператора связи, подключив соответственно услугу «Черный Список». Или если повезет, найти данный функционал в меню операционной системы, в разделе «Приложение» или «Вызовы».
Если данного функционала нет, есть один оригинальный способ блокирования неизвестных номеров. Занесите все номера вашей записной книжки в группы «Семья», «Друзья» или «Работа». Назначьте на каждую группу свою мелодию. А на входящие вызовы — беззвучный MP3 файл. Беззвучный файл, то есть тишину можно записать на самом телефоне или на компьютере.
Когда неизвестный номер будет звонить, телефон будет проигрывать MP3 файл. Этот звонок вы не услышите и обнаружите его потом во «Входящих». А если позвонит известный номер из раздела «Семья», «Друзья» или «Работа», заиграет другая громкая мелодия, ее вы услышите и ответите на вызов.
И еще один оригинальный способ блокирования всех входящих номеров. Любой оператор связи позволяет переадресовывать звонки с одной сим-карты на другую. Услуга эта бесплатная, оплачиваются только время разговора. Можно переадресовать все входящие вызовы на выключенный телефон, а с основного совершать звонки. Подробнее об этом способе смотрите далее.
Программа — Черный Список на телефон.
Приложение — Blacklist на телефон Android.
Программа — черный список в телефоне
play.google.com — Черный список — программа, которая позволяет блокировать нежелательные звонки, сообщения смс и ммс. В черный список номера можно добавлять различными способами: прямой ввод номера, выбор номера из контактов,недавние звонки, смс или ммс.
Программа поддерживает, а так же «не числовые — буквенные» телефонные номера, которые используются при рассылке рекламных сообщений в смс. В программе можно сделать блокировку на все входящие звонки, звонки со скрытых номеров кроме номеров из «Белого списка» или книги контактов. Если в книге контактов много нежелательных на данный момент времени номеров, то Вы можете создать белые списки на разные случаи жизни и в нужное время подключать их, отклоняя все вызовы и ссмки с других номеров. Приложение может блокировать вызовы по времени суток или по расписанию. Номера черного списка можно сохранить и перенести, загрузить на новый телефон.
Приложение — Call Blocker для платформы Android.
Программа — Call Blocker в Google Play
play.google.com Call Blocker — Android и iOS приложение для перехвата звонков и смс поступающих на телефон, с дальнейшей блокировкой или разрешением их по белому или черному листу. Программа эффективно блокирует нежелательные звонки и сообщения смс, причем поддерживаются даже буквенные номера. Интерфейс программы позволяет заблокировать все входящие звонки и смс и дает возможность постепенно создавать пользователю белый и черный список. Все сделано удобно и грамотно, программа на русском языке, все эти функции имеются в бесплатной версии. Приложение имеет свою собственную базу телефонных номеров и в некоторых случаях выводит подробную информацию о звонящем абоненте.
Источник: sms-mms-free.ru