BB10-从级联应用程序发送短信

BB10 - Sending SMS from cascades app

本文关键字:应用程序 级联 BB10-      更新时间:2023-10-16

我正在使用以下代码从我的应用程序发送短信;

void App::sendSms(const QString &messageText, const QStringList &phoneNumbers) {
bb::pim::account::AccountService accountService;
bb::pim::message::MessageService messageService;
QList<Account> accountListy = accountService.accounts(bb::pim::account::Service::Messages,"sms-mms");
bb::pim::account::AccountKey smsAccountId = 0;
if(!accountListy.isEmpty()) {
    smsAccountId = accountListy.first().id();
    qDebug() << "SMS-MMS account ID:" << smsAccountId;
}
else {
    qWarning() << "Could not find SMS account";
    return;
}

QList<bb::pim::message::MessageContact> participants;
foreach(const QString &phoneNumber, phoneNumbers) {
    bb::pim::message::MessageContact recipient = bb::pim::message::MessageContact(
        -1, bb::pim::message::MessageContact::To,
        phoneNumber, phoneNumber);
    participants.append(recipient);
}
bb::pim::message::ConversationBuilder *conversationBuilder =
    bb::pim::message::ConversationBuilder::create();
conversationBuilder->accountId(smsAccountId);
conversationBuilder->participants(participants);
bb::pim::message::Conversation conversation = *conversationBuilder;
bb::pim::message::ConversationKey conversationId = messageService.save(smsAccountId, conversation);
bb::pim::message::MessageBuilder *builder =
    bb::pim::message::MessageBuilder::create(smsAccountId);
builder->conversationId(conversationId);
builder->addAttachment(bb::pim::message::Attachment("text/plain", "", messageText.toUtf8()));
foreach(const bb::pim::message::MessageContact recipient, participants) {
    builder->addRecipient(recipient);
}
bb::pim::message::Message message = *builder;
messageService.send(smsAccountId, message);
delete builder;
delete conversationBuilder;

}

然而,每当它发送新的短信时,它都会在短信UI中创建一个新的线程。我想知道是否有一种方法可以将新消息添加到它要发送到的号码已经存在的线程中?

谢谢!

导致此错误的代码方面是

// at top of file
using namespace bb::pim::messages;
ConversationBuilder *conversationBuilder = ConversationBuilder::create();
conversationBuilder->accountId(smsAccountId);
conversationBuilder->participants(participants);
Conversation conversation = *conversationBuilder;
ConversationKey conversationId = messageService.save(smsAccountId, conversation);

这篇文章——按照前面的几行,将为participants创建一个新的对话,而不考虑集线器中以前的现有对话。

为了解决这个问题,BlackBerry Cascades PIM MessageService提供了一个MessageSearchFilter,您可以使用它来过滤任何SearchFilterCriteria的对话。这样使用它…

//Setup a filter
MessageFilter filter;
//Set our filter to filter conversations with id of the contact
filter.insert(MessageFilter::ContactId, contactId);
//Run filter
filterdConvosKeys = messageService.conversationKeys(smsAccountId, filter);
ConversationKey conversation_id;
//Vars for conversation builder
conversationBuilder->accountId(smsAccountId);
conversationBuilder->participants(participants);
//Get conversation ID for existing conversation, else create new
if (filterdConvosKeys.count() > 1) {
    // go through all conversations for this contact and choose
    // the conversation in which this contact is the sole participant
else if (filterdConvosKeys.count() == 1) {
    conversation_id = filterdConvosKeys[0].toAscii();
} else {
    conversation_id =  messageService.save(smsAccountId, conversation);
}

编辑

不管最初的来源怎么说,我觉得它有点bug。如果你完全按照它说的那样使用它,那么如果没有与作为唯一参与者的联系人进行对话,你总是会以新的对话结束。我试着在我的STL100-3上的BlackBerry Hub中用一个联系人的电话号码进行搜索,结果我收到了许多在同一对话中的消息。但这意味着,如果按MessageFilter::Participants进行筛选,则可能会返回许多对话。最好使用MessageFilter::ContactId进行过滤。

p.s:我为代码块命名了名称,这样bb::pim::messages::就不会重复了。