【问题标题】:BB10 - Sending SMS from cascades appBB10 - 从级联应用发送短信
【发布时间】:2013-09-01 17:03:49
【问题描述】:

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

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 中创建一个新线程。我想知道是否有一种方法可以将新消息添加到已经存在的线程中,该线程将发送到它要发送到的号码?

谢谢!

【问题讨论】:

  • 尝试在消息视图中选择消息。选择应该触发一些带有conversation_idonSelected 插槽,您可以使用它来附加消息。这是正确的圆顶,但听起来不错。研究并告诉我

标签: c++ qml blackberry-10 blackberry-cascades


【解决方案1】:

导致此错误的代码方面是

// 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 创建一个新的对话,而不管 Hub 中以前的现有对话如何。

为解决此问题,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);
}

编辑

尽管原来的Source 说了什么,我觉得它有点错误。如果您完全按照它所说的那样使用它,如果没有与联系人作为唯一参与者的对话,您将始终以新的对话结束。我尝试在我的 STL100-3 上的 BlackBerry Hub 中使用联系人的电话号码进行搜索,结果我发现许多消息都在同一个对话中。但这意味着如果您按MessageFilter::Participants 过滤,则可能会返回许多对话。最好使用MessageFilter::ContactId 进行过滤。

p.s:我将代码块命名为命名空间,因此bb::pim::messages:: 不会重复。

【讨论】:

  • 喂!我偶然发现了这个答案,通读并想+1。然后我意识到我是那个回答它的人(._.)
猜你喜欢
  • 2016-07-03
  • 2012-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多