Симбиоз человека и телефона Денис Мингулов 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 весь текст сообщения // Удаляем сообщение - чтобы остановить сигнал о нем |