30 April, 2011

QContact asynchronous API

Есть в Qt Mobility такая штука как  QtContacts, эта библиотека позволяет работать с различными контактами и предоставляет доступ к адресной книге. Так вот если приглядется к документации, то самым очевидным путем получения нужного  контакта по идентификатору будет конструкция:

    QContactManager *manager = new QContactManager();
    QContact contact = manager->contact(contactLocalId);

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

В debug версии такого приложения вы даже получите ATTENTION, о том что не рекомендуется использользовать этот метод. В замен Qt Mobility предлагает Contacts Asynchronous API, который позволяет вытянуть контакты никому не мешая отфильтровав их по нужным критериям. Все классы используемые в этом API являются наследниками QContactAbstractRequest

Соответсвенно, если вы хотите получить контакт по его идентификатору "православным" методом, код нужно переписать примерно следущим образом:

    QContactManager *manager = new QContactManager();
    QContactFetchByIdRequest *request = new QContactFetchByIdRequest();
    QList<QContactLocalId> localIds;
    localIds.append(contactLocalId);
    request->setLocalIds(localIds);
    connect(request, SIGNAL(resultsAvailable()), this, SLOT(contactReceived()));
    request->start();
... ... ...
void AsyncApiExampleClass::contactReceived()
{
    QContactFetchByIdRequest *senderRequest = qobject_cast<QContactFetchByIdRequest *>(sender())
    QList<QContact> results = senderRequest->contacts();
    //...
}

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

1 comment:

  1. А почему manager в "правильном" методе не используется явно?

    ReplyDelete