摘要:上节我们了解了Symbian OS中对SMS的主要操作,比如新建、修改以及删除等等,这篇文章我们主要认识一下有关SMS的发送。
发送SMS也许我们大多数人都操作过,简单说来就是编辑一段文本,然后选择一个或多个目标号码,点击发送一切ok。其实在程序中实现的步骤也是如此,只不过需要我们了解更多的知识。
老方法,我们先来了解一些必须的类:
CSmsSettings
设置sms服务的属性类
CSmsHeader
sms头信息,主要有关消息的各种参数,当然与上面的CSmsSettings密切相关
其他有关sms的类在上一节我们都大致介绍了,这里不重复说明,接下来我们会用一些具体的源码加以分析。
首先,我们需要新建一个sms而且得到接受方的号码,这两步可以参照上一节的内容,里边详细介绍了如何新建一条sms。
然后就是要设定发送前的一些参数信息,并选择做一些相应的操作。
---------------------------------------------------------------------------------------------------
//iMtm是在新建sms阶段设定
TMsvEntry msvEntry = iMtm->Entry().Entry();
// 得到sms内容
CRichText& mtmBody = iMtm->Body();
mtmBody.Reset();
mtmBody.InsertL(0, KGDSMSTag); //插入我们的短信标示
//重新设定TMsvEntry
msvEntry.iDetails.Set(iRecipient->Des()); // set recipient info in details
msvEntry.SetInPreparation(EFalse); // set inPreparation to false
msvEntry.SetSendingState(KMsvSendStateWaiting); // set the sending state (immediately)
msvEntry.iDate.HomeTime(); // set time to Home Time
// 使用CSmsClientMtm类处理sms
CSmsClientMtm* smsMtm = STATIC_CAST(CSmsClientMtm*, iMtm);
smsMtm->RestoreServiceAndSettingsL();
// CSmsHeader封装sms消息的参数,像服务中心号码和发送设定
CSmsHeader& header = smsMtm->SmsHeader();
//CSmsSettings类用来详细设定sms Header
CSmsSettings* sendOptions = CSmsSettings::NewL();
CleanupStack::PushL(sendOptions);
sendOptions->CopyL(smsMtm->ServiceSettings());
sendOptions->SetDelivery(ESmsDeliveryImmediately);//设定立即发送
header.SetSmsSettingsL(*sendOptions);
//检查服务中心号码有效性
if (header.Message().ServiceCenterAddress().Length() == 0)
{
// 如果没有设定,则查找默认中心号码
CSmsSettings* serviceSettings = &(smsMtm->ServiceSettings());
// 中心号码列表为空
if (!serviceSettings->NumSCAddresses())
{
// 错误消息
iEikonEnv->InfoWinL(_L("No service center number"),_L("cannot send this one."));
}
else
{
// 设定为默认服务中心号码
CSmsNumber* sc = 0;
sc = &(serviceSettings->SCAddress(serviceSettings->DefaultSC()));
header.Message().SetServiceCenterAddressL(sc->Address());
}
}
CleanupStack::PopAndDestroy();
... ...
CMsvEntrySelection* selection = new (ELeave) CMsvEntrySelection;
CleanupStack::PushL(selection);
selection->AppendL(movedId); // 添加我们要发送的sms,movedId在省略部分有定义,是TMsvId型变量
// 调用的这个函数是用于发送的,具体的代码后面介绍
SetScheduledSendingStateL(selection);
CleanupStack::PopAndDestroy(); // selection
return ETrue; // 到这里sms已被发送
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
void ...::SetScheduledSendingStateL(CMsvEntrySelection* aSelection)
{
CBaseMtm* smsMtm = iMtm;
// 添加entry到任务列表
TBuf8<1> dummyParams;
CCommandAbsorbingControl::NewLC();
CMsvOperationWait* waiter = CMsvOperationWait::NewLC();
waiter->Start();
// 这个函数是关键
CMsvOperation* op= smsMtm->InvokeAsyncFunctionL(
ESmsMtmCommandScheduleCopy,
*aSelection,
dummyParams,
waiter->iStatus);
CleanupStack::PushL(op);
CActiveScheduler::Start(); //开始时间表中任务
CleanupStack::PopAndDestroy(3); // waiter, op, CCommandAbsorbingControl
}
---------------------------------------------------------------------------------------------------
需要我们注意的是:在发送sms的过程中大部分的操作都是用于设定发送sms时的参数,所以东西比较琐碎;如果您想自己实现这部分工作,给您的建议就是尽量采用一个比较通用的方法,无需设定一些让人捉摸不定的信息。在发送sms中起主要作用的还是CBaseMtm类,这个类以及从它继承的类负责sms的具体发送,所以整个过程的结束点一定是使用这些类的函数来实现发送的动作,犹如上述的InvokeAsyncFunctionL函数。
源码下载请点击此处>>>