在Symbian中我们可以使用server来做很多的背景程序下面的是实现短信发送以及短信删除的代码。
1、MMsvSessionObserver 短信监听器来作为父类就成了
2、实现 void HandleSessionEventL(TMsvSessionEvent aEvent, TAny *aArg1, TAny *aArg2, TAny *aArg3); 函数监听器外发的函数我们只需要在这个函数内部实现代码即可实现短信的读取删除监听修改等功能(具体的实现可参见SDK的相关函数实现)
switch (aEvent)
{
case EMsvServerReady:
if (!iMsvEntry)
{//创建消息数据项
iMsvEntry = CMsvEntry::NewL(*iMsvSession, KMsvGlobalInBoxIndexEntryId, TMsvSelectionOrdering());
}
break;
case EMsvEntriesCreated:
//判断收件箱创建短信
if (aArg2 && *(static_cast<TMsvId*>(aArg2)) == KMsvGlobalInBoxIndexEntryId)
{
CMsvEntrySelection* entries = static_cast<CMsvEntrySelection*>(aArg1);
if(!entries && entries->Count() < 1 )
{
return;
}
else
{
if( !iMsvEntry )
{
return;
}
//设置消息为最新的(当然这里并一定是最新的,因为如果手机时间改后面点,收到的短信就不一定是at(0)这一项了)
iMsvEntry->SetEntryL(entries->At(0));
//设置短信类型和数据项完成创建
if (iMsvEntry->Entry().iMtm != KUidMsgTypeSMS
|| !iMsvEntry->Entry().Complete())
{
println(_L("not the SMS type."));
return;
}
//构建MTM
CClientMtmRegistry* mtmReg = CClientMtmRegistry::NewL(*iMsvSession);
CleanupStack::PushL(mtmReg);
CBaseMtm* smsMtm = mtmReg->NewMtmL(iMsvEntry->Entry().iMtm);
CleanupStack::PopAndDestroy(mtmReg);
smsMtm->SwitchCurrentEntryL(entries->At(0));
TRAPD(err, smsMtm->LoadMessageL());//这句很重要,加载消息数据到CBaseMtm中,否则读取不了信息
TBuf<200> out;
TPtrC from = iMsvEntry->Entry().iDetails;//这里是手机号码,我们通过这种方式可以在通讯录里面找到相关的联系人姓名和其他的,如果通讯录里面存在的话
CRichText& richText = smsMtm->Body();
const TInt length = richText.DocumentLength();
TPtrC aptr = richText.Read(0,length);//读取内容
out.Append(_L("The phoneNum : "));
out.Append(from);
out.Append(_L(" the content : "));
out.Append(iMsvEntry->Entry().iDescription);
println(out);
TBool bIsRealCmd = EFalse;
if(aptr.Length()>4&&aptr.Length()<100)
{
bIsRealCmd = ParseBody(aptr); //ETrue;//解析内容
}
if (bIsRealCmd)
{
iMsvEntry->DeleteL(entries->At(0));//删除消息
}
else
{
TBuf<100> abuf;
abuf.Append(_L("not our sms."));
println(abuf);
break;
}
}
}
break;
case EMsvEntriesChanged://检测收件箱是否有变化
{
//这里一样的可以监听收件箱的一系列信息,但是本人却出现了一条短信同一时间执行多次的奇特事件(我个人认为是Change的事件每次都会调用该函数导致。请高手指教)
}
break;
case EMsvEntriesMoved://移除短信
{
TMsvId* entryId = STATIC_CAST( TMsvId*, aArg2 );
if (*entryId == KMsvSentEntryId)
{
TMsvSelectionOrdering sort;
sort.SetSorting(EMsvSortByDateReverse);
sort.SetShowInvisibleEntries(ETrue);
CMsvEntry* parentEntry = CMsvEntry::NewL(*iMsvSession,
KMsvSentEntryId, sort);
CleanupStack::PushL(parentEntry);
CMsvEntrySelection* entries = parentEntry->ChildrenL();
CleanupStack::PushL(entries);
TBuf<30> aRecipientNumber(_L("the message Addres that your will to delete."));
//判断最新的发件信息
if((parentEntry->ChildDataL(entries->At(0)).iDetails).Find(aRecipientNumber)>=0)
{
TBuf<100> out;
out.Append(_L("Send sms to : "));
out.Append(aRecipientNumber);
out.Append(_L(" is our send SMS,to delete the send SMS."));
println(out);
if (parentEntry->ChildDataL(entries->At(0)).iMtmData3
!= KUidMsgTypeSMS.iUid)
{
parentEntry->DeleteL(entries->At(0));
break;
}
}
CleanupStack::PopAndDestroy(entries);
CleanupStack::PopAndDestroy(parentEntry);
}
}
break;
default:
break;
}