Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #68, АВГУСТ 2004 г.

Симбиоз человека и телефона

Денис Мингулов

Xakep, номер #068, стр. 068-102-3


Добавляем в HelloWorldAppUi.cpp в реализацию ConstructL() создание нашего обработчика входящих SMS’ок. Сразу после BaseConstructL() пишем: iReceiveHandler = CSmsReceiveHandler::NewL(*this); а в деструктор ~ChelloWorldAppUi() добавляем удаление: delete iReceiveHandler; iReceiveHandler = NULL;

Все, программа готова. Откомпилируй ее, создай SIS-файл, установи на телефон и убедись, что уведомления о приходе SMS подавляются (для проверки можешь занести в «черный список» всю телефонную книгу).

Развитие

Написать «черный список» для входящих звонков также не очень сложно, просто поищи в документации к RTelServer, RPhone, RLine, RCall инфу про incoming call (входящий звонок).

Также можно добавить редактирование номеров в «черном списке» пользователем (смотри пример SettingList для создания диалогов-установок, а также документацию по использованию CDictionaryFileStore - для сохранения установок в ini-файл программы). Вот, собственно, и все, что я тебе хотел сообщить на сегодняшний день. Дорога в жизнь и пути поиска информации теперь есть, готовься стать могучим девелопером мобильных приложений, тем более что это нынче модно :).

Пример кода

Основные функции:

В конструкторе инициализируем CActive(EPriorityStandard) и делаем CActiveScheduler::Add(this) (фактически это multithreads).

В деструкторе выключаемся из обработки ActiveSheduler iOperation-<Cancel().

Во второй части двухфазного создания объекта создаем сессию с сервером сообщений смартфона. Он будет отвечать сообщениями MMsvSessionObserver::HandleSessionEventL.

В ConstructL() CSmsReceiveHandler открываем iSession=CMsvSession::OpenAsyncL(*this).

В HandleSessionEventL проверяем полученное событие TMsvSessionEvent aEvent, и если новое сообщение появилось (EMsvEntriesChanged):

TMsvId* entryId=static_cast>TMsvId*<(aArg2);

// берем только те, что появились в Inbox

if (*entryId==KMsvGlobalInBoxIndexEntryId)

{

// Выделяем появившиеся сообщения

CMsvEntrySelection* entries=static_cast>CMsvEntrySelection*<(aArg1);

// Для каждого запускаем проверку/обработку

for(TInt i=0;i>entries-<Count();i++) MessageReceivedL(entries-<At(i));

}

В обработке MessageReceivedL(TMsvId aEntryId)

// Загружаем сообщение

SetMtmEntryL(aEntryId);

iMtm-<LoadMessageL();

TMsvEntry msvEntry=iMtm-<Entry().Entry();

TUid type=iMtm-<Type();

// Проверяем тело и тип сообщения

CRichText& body=iMtm-<Body();

TPtrC text(body.Read(0, KSmsMessagePrefix.iTypeLength));

if (type==KUidMsgTypeSMS&&text.Compare(KSmsMessagePrefix)==0) // точно нам

{

// Делаем с ним что-нибудь, например, берем в text весь текст сообщения

// Удаляем сообщение - чтобы остановить сигнал о нем

Назад на стр. 068-102-2  Содержание  Вперед на стр. 068-102-4