franksunny的个人技术空间
获得人生中的成功需要的专注与坚持不懈多过天才与机会。 ——C.W. Wendte

 

获取手机短信和彩信号码的方法

短信号码的提取

之前写了一篇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内只有一个protectedCMmsHeaders*  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 阅读(3313) 评论(3)  编辑 收藏 引用 所属分类: symbian 开发

FeedBack:
# re: 获取手机短信和彩信号码的方法
2010-09-26 05:00 | 哆来咪群发
不错  回复  更多评论
  
# re: 获取手机短信和彩信号码的方法
2010-11-28 18:52 | Skill
经典,楼主问下,可以获取什么机型?谢谢  回复  更多评论
  
# re: 获取手机短信和彩信号码的方法
2010-11-29 10:42 | frank.sunny
@Skill
不知道什么意思啊,该方法适用于S60 3rd以后的机型,2nd机型我没有试过,不过照理应该也可以,毕竟mtm在S60中变化不大  回复  更多评论
  

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理



常用链接

留言簿(13)

随笔分类

个人其它博客

基础知识链接

最新评论

阅读排行榜

评论排行榜