Discussion Board

Results 1 to 8 of 8
  1. #1
    Registered User Alekzandr's Avatar
    Join Date
    Nov 2009
    Posts
    41
    Подскажите пожалуйста наиболее рациональный вариант.
    Когда на телефон приходит смс, то телефон находит для этого номера - имя в контактах.
    Если я правильно понял, то функция MatchPhoneNumberL просто находит совпадения по заданному количеству цифр справа. То есть, например, если в контактах записан номер +79991112233, а входящий номер будет 2233, и будет выполнен поиск с параметром 4, то для номера 2233 определится имя контакта с номером +79991112233.
    Есть ли какая-нибудь функция для точно такого же поиска соответствия номер-имя, как делает телефон?
    Или нужно писать свою функцию подобного поиска?

  2. #2
    Nokia Developer Moderator truf's Avatar
    Join Date
    Jun 2007
    Location
    Moscow, Russia
    Posts
    1,355
    Нужно писать свою функцию. Только не для поиска, а для формирования необходимой строки из полей контакта. Т.к. сам контакт искать не нужно - его id можно получить из MatchPhoneNumberL().

  3. #3
    Registered User Alekzandr's Avatar
    Join Date
    Nov 2009
    Posts
    41
    Сформировать сформировал, проблема с MatchPhoneNumberL. Например, такая:
    Если я правильно понял, то функция MatchPhoneNumberL просто находит совпадения по заданному количеству цифр справа. То есть, например, если в контактах записан номер +79991112233, а входящий номер будет 2233, и будет выполнен поиск с параметром 4, то для номера 2233 определится имя контакта с номером +79991112233.
    Как это можно исправить?
    Проблема эта возникла из-за того, что пользователь, например, может записать номер как +79991112233, а может как 89991112233, следовательно писать нужно MatchPhoneNumberL(aNumber,10), где aNumber это +79991112233, или я не правильно понял как работает MatchPhoneNumberL?

  4. #4
    Registered User Alekzandr's Avatar
    Join Date
    Nov 2009
    Posts
    41
    И есть ещё проблема:
    Due to the way numbers are stored in the database, it is recommended that at least 7 match digits are specified even when matching a number containing fewer digits. Failure to follow this guideline may (depending on the database contents) mean that the function will not return the expected Contacts Id set.

    Что делать если номер менее 7 цифр?
    Пройти по массиву, который вернула MatchPhoneNumberL, и проверить количество цифр у каждого номера?
    Last edited by Alekzandr; 2010-02-11 at 13:56.

  5. #5
    Nokia Developer Moderator truf's Avatar
    Join Date
    Jun 2007
    Location
    Moscow, Russia
    Posts
    1,355
    На самом деле все чуть сложнее. В справке по MatchPhoneNumberL() указано следующее:

    Additionally, if the contacts model phone parser (CNTPHONE.DLL) is available, then any DTMF digits are also excluded from the comparision.
    Такая dll есть на всех устройствах и, скорее всего (лень проверить), в эмуляторе. Она чуть выправляет телефонный номер. То как она делает можно прочитать в комментариях к ее исходникам в свеже открытых сорсах платформы.

    Технически, со стороны ОС, создать базу всех междунородных кодов еще можно (+7 - код России), но вот разбираться с тем, что используется для выхода на международную связь (8) внутри страны - уже перебор. Тем более что у нас 8 все мечтают заменить на 00.

    Я порылся в исходниках, и нашел, как мне кажется, реализацю этого поиска тут. Он очень хитрый, поэтому легче провести эксперимент.
    Last edited by truf; 2010-02-11 at 15:10.

  6. #6
    Nokia Developer Moderator truf's Avatar
    Join Date
    Jun 2007
    Location
    Moscow, Russia
    Posts
    1,355
    Quote Originally Posted by Alekzandr View Post
    И есть ещё проблема:
    Due to the way numbers are stored in the database, it is recommended that at least 7 match digits are specified even when matching a number containing fewer digits. Failure to follow this guideline may (depending on the database contents) mean that the function will not return the expected Contacts Id set.

    Что делать если номер менее 7 цифр?
    Пройти по массиву, который вернула MatchPhoneNumberL, и проверить количество цифр у каждого номера?
    Там написано что делать. Даже если номер короче - пишите 7. Если загляните в реализацию, то увидите, что он делит номер на 2 части (первые 7 цифр и все остальное). И хранит это в числовом виде в качестве хеша. И судя по всему, если вы передадите параметр меньше семи 7 и номер будет коротким - он будет добит справа 0 до нужной длины, чтобы получить первый хеш.

    UPD: видимо в любом случае добивается нулем до 7 цифр и храниться как хеш к контакту.
    Возможно он результат полученный по хешу SQL запросом потом еще раз проходит.

    У вас действительно есть эта проблема с номерами или вы просто думаете, что она может быть?
    Last edited by truf; 2010-02-11 at 15:11.

  7. #7
    Registered User SiNoptik's Avatar
    Join Date
    Dec 2005
    Posts
    93
    Quote Originally Posted by truf View Post
    Нужно писать свою функцию. Только не для поиска, а для формирования необходимой строки из полей контакта. Т.к. сам контакт искать не нужно - его id можно получить из MatchPhoneNumberL().
    На самом деле, все гораздо проще. Есть такой класс: CPbkContactEngine. Он, по сути, является враппером над CContactDatabase. У него тоже есть метод MatchPhoneNumberL(). Получаете список id контактов, у которых найден нужный телефон. Открываете контакт через CPbkContactEngine::OpenContactL и далее используете замечательный метод CPbkContactEngine::GetContactTitleL. Возвращает полное имя контакта в соответствии с заданным на телефоне порядком следования имени и фамилии.

  8. #8
    Registered User Alekzandr's Avatar
    Join Date
    Nov 2009
    Posts
    41
    truf, спасибо за полезные ссылки в исходники.
    но вот разбираться с тем, что используется для выхода на международную связь (8) внутри страны - уже перебор.
    Да, это будет нелегкая задача.
    У вас действительно есть эта проблема с номерами или вы просто думаете, что она может быть?
    Проблема, как в первом моем сообщении, есть. С номерами менее 7 цифр я пока не тестировал. Но думаю проведу подробный эксперимент и напишу на форум результаты.

    SiNoptik, спасибо за полезную функцию GetContactTitleL.
    Что касается CPbkContactEngine::MatchPhoneNumberL, как я понял она работает также.

    Я надеялся на то, что ведь когда смс приходит, то телефон успешно подписывает смс в инбоксе соответствующим именем из контактов, и думал, что у разработчика должна быть готовая функция для подобного поиска имени по номеру с которого пришла смс. Но такой функции получается нет. Значит нужно или делать свою базу кодов и свой поиск, или экспериментировать с MatchPhoneNumberL и дописывать её. Буду рад любым идеям.
    Last edited by Alekzandr; 2010-02-11 at 16:27.

Similar Threads

  1. Несколько вопросов по Symbian 9.x
    By yrok_x in forum Russian Developer Forum - Форум Российских разработчиков
    Replies: 5
    Last Post: 2010-02-08, 09:33
  2. Несколько вопросов по Carbide
    By privatejoker in forum Russian Developer Forum - Форум Российских разработчиков
    Replies: 3
    Last Post: 2009-09-27, 17:48
  3. Блок под пароль, а также поиск в справочнике по имени и фамилии
    By Memfis09 in forum Russian Developer Forum - Форум Российских разработчиков
    Replies: 1
    Last Post: 2009-09-13, 12:49

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
Nokia Developer aims to help you create apps and publish them so you can connect with users around the world.

京ICP备05048969号  © Copyright Nokia 2013 All rights reserved