獲取手機短信和彩信號碼的方法
短信號碼的提取
之前寫了一篇Symbian端彩信讀取初探,將過多的期望放在了未知的CMmsHeaders
上面,最近需要將系統收件箱、發件箱和草稿箱內部的數據統統備份出來,突然遇到瓶頸了。最后問題得以解決之后發現其實系統已經提供了豐富的API,以下就是羅列了一種獲取系統收件箱、發件箱和草稿箱里面短信和彩信號碼的方法。
我們先看一段短信讀取號碼的代碼
TMsvSelectionOrdering sort;
MTm vMtTime;
sort.SetShowInvisibleEntries(ETrue);
sort.SetSorting(EMsvSortByDate);
CMsvEntry* entry = NULL;
entry = CMsvEntry::NewL(*iSession, aId, sort);
CleanupStack::PushL(entry);
CMsvEntrySelection* entries = entry->ChildrenWithMtmL(KUidMsgTypeSMS);
CleanupStack::PushL(entries);
TInt vNums = entries->Count();
//TDateTime vSearchDateTime;
TInt i = 0;
//
循環對照時間 時間對了,做號碼和內容匹配
for(TInt vJ = 0 ; vJ < vNums; vJ++)
{
TMsvId vEntryId = entries->At(vJ);
TTime vTime = entry->ChildDataL(vEntryId).iDate;
iSmsMtmR->SwitchCurrentEntryL(vEntryId);
TInt error = KErrNone;
TRAP(error, iSmsMtmR->LoadMessageL());
if (error != KErrNone) // something is still busy with this entry
還有可能是彩信
{
continue;
}
CSmsHeader& header = iSmsMtmR->SmsHeader();
TPtrC vFrom = header.FromAddress();
......
}
CleanupStack::PopAndDestroy(2);//entry entries
代碼中的FromAddress函數儼然看其代碼實現貌似可以實現收件人的號碼,具體代碼如下
inline TPtrC CSmsHeader::FromAddress() const
{
switch(Type())
{
case(CSmsPDU::ESmsSubmit):
return Submit().ToFromAddress();
case(CSmsPDU::ESmsDeliver):
return Deliver().ToFromAddress();
default:
return TPtrC(0,0);
}
}
但是實際上,草稿箱內的短信其收件人號碼能夠獲取到,但是發件箱的短信使用如上方法是獲取不到號碼的。而且加入草稿箱中的短信有多個號碼接收人的時候,采用這種方法,也僅僅只能夠獲取到一個收件人的號碼。
后來在論壇上找到一種方法說是可以通過CSmsHeader::Recipients來獲取發件箱短信的收件人號碼,支持多個收件人號碼,而且此方法也適用于草稿箱。通過這個方法雖然很好地解決了短信號碼的問題,但是對于彩信還是一籌莫展啊。
彩信號碼的提取
經過搜索后來發現收件箱的彩信發件人號碼可以通過CMmsClientMtm::Sender()來獲取,但是在草稿箱和發件箱中的彩信的收件人號碼該怎么獲取呢?雖然有一個CDesCArray& CMmsHeaders::TypedAddresseeList( TMmsRecipients aType )函數,但是CMmsClientMtm內只有一個protected的CMmsHeaders* iMmsHeaders成員變量,沒有其它public變量或方法來從CMmsClientMtm獲取CMmsHeaders,所以也就無法使用CMmsHeaders來獲取收件人的號碼。
最后在nokia論壇上看到有人說可以通過CMsvRecipientList& CMmsClientMtm:: AddresseeList()方法來獲取收件人號碼,查看mmsclient.h中的CMmsClientMtm類發現如下注釋的函數聲明
/**
* New recipient list function is not virtual, and the base MTM
* implementation must always be used.
* The function is shown here for reference only:
*
* const CMsvRecipientList& AddresseeList() const;
*/
不過以此為線索,可以找到在基類CBaseMtm中有一個AddresseeList()成員函數可以獲得收件人的號碼。
通過以上這種方法,我們就可以獲取收件箱、發件箱和草稿箱中的手機號碼,具體的彩信示例代碼實現如下:
TMsvSelectionOrdering sort;
MTm vMtTime;
sort.SetShowInvisibleEntries(ETrue);
sort.SetSorting(EMsvSortByDate);
CMsvEntry* entry = NULL;
entry = CMsvEntry::NewL(*iSession, aId, sort);
CleanupStack::PushL(entry);
CMsvEntrySelection* entries = entry->ChildrenWithMtmL(KUidMsgTypeMultimedia);
CleanupStack::PushL(entries);
TInt vNums = entries->Count();
TInt i = 0;
for(TInt vJ = 0 ; vJ < vNums; vJ++)
{
TMsvId vEntryId = entries->At(vJ);
iMmsMtmR->SwitchCurrentEntryL(vEntryId);
TInt error = KErrNone;
TRAP(error, iMmsMtmR->LoadMessageL());
if (error != KErrNone) // something is still busy with this entry
{
continue;
}
if(KMsvGlobalInBoxIndexEntryId == aId)
{//
收件箱
TPtrC vFrom = iMmsMtmR->Sender();
.......//
對發件人號碼處理
}
else
{
const CMsvRecipientList& vRecipientList = iMmsMtmR->AddresseeList();
TInt vNumCount = vRecipientList.Count();
TInt vPhoneLength = 0;
CPtrC16Array* vPhoneArray = NULL;
if(vNumCount > 0)
{
vPhoneArray = new CPtrC16Array(vNumCount);
CleanupStack::PushL(vPhoneArray);
for(TInt vNumi = 0; vNumi < vNumCount; vNumi++)
{
//
由于在這里取得是純號碼,而AddresseeList得到的是
//
形如"XXX<135********>"的字串,為此采用如下方法
TInt vPrePos = 0;
TInt vEndPos = 0;
TFileName vTempPhone1Buf;
TFileName vTempPhone2Buf;
vTempPhone1Buf.Copy(vRecipientList[vNumi]);
vPrePos = vTempPhone1Buf.Locate(TChar('<'));
vEndPos = vTempPhone1Buf.LocateReverse(TChar('>'));
if((vPrePos >= 0) &&(vEndPos >= 0))
{
vTempPhone2Buf.Copy(vTempPhone1Buf.Left(vEndPos));
vTempPhone1Buf.Copy(vTempPhone2Buf.Right(vTempPhone2Buf.Length() - vPrePos -1));
vPhoneArray->AppendL(vTempPhone1Buf);
vPhoneLength += vTempPhone1Buf.Length() + 1;
}
else
{
vPhoneArray->AppendL(vRecipientList[vNumi]);
vPhoneLength += vRecipientList[vNumi].Length() + 1;
}
}
......//
從vPhoneArray中處理收件人純號碼
CleanupStack::PopAndDestroy(vPhoneArray);
}
else
{
//
沒有號碼
}
}
}
CleanupStack::PopAndDestroy(2);//entry entries
當然由于采用的是CBaseMtm基類的AddresseeList()成員函數,為此不僅在彩信中可以使用,在短信中也可以采用同樣的方法,撇棄使用之前提到的CSmsHeader::Recipients方法來獲取收件箱和草稿箱短信收件人號碼的方法,使用CBaseMtm::AddresseeList()通用方法來實現。
小結
在收件箱中,由于使用通用方法TMsvEntry::iDetails獲取號碼時只能獲取通訊錄中不存在的號碼,否則就是通訊錄中的姓名,為此收件箱中的號碼不能使用通用方法,短信使用CSmsHeader::FromAddress()方法,而彩信使用CMmsClientMtm::Sender()的方法;
在發件箱和草稿箱中,則可以使用通用的CBaseMtm::AddresseeList()來獲取收件人的號碼。
posted on 2010-09-25 17:44
frank.sunny 閱讀(3466)
評論(3) 編輯 收藏 引用 所屬分類:
symbian 開發