在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;
}