获取手机短信和彩信号码的方法
短信号码的提取
之前写了一篇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 阅读(3445)
评论(3) 编辑 收藏 引用 所属分类:
symbian 开发