最近在学习MTM,看到在收件箱里创建一条新的未读短信挺好玩的,可以自己指定发件人的号码和姓名,时间等,尝试做了一下,主要碰到下面问题,记录一下:
1、开始创建成功了,但是通过收件箱里信息详情查看的时候显示的是收件人,而不是发件人,这样一看就是假的,后来查资料和请教别人,还需要对CSmsHeader进行处理,用CSmsHeader里的SetFromAddressL添加发送人的号码就可以了。
2 、发送时间问题。
开始测试的时候老是发现在模拟器里正常,而在真机里显示发送时间比设置的时候晚了八个小时,想着应该是时区的问题,后来仔细跟踪程序后发现TTime的HomeTime()函数在模拟器上得到的是UTC时间,而不是模拟器里显示的时间,而在真机上得到的是当前的本地时间,而MTM里数据包里的时间都是UTC时间,需要对当前取得的时间进行转换后,再放到数据包里就正常了。
主要代码如下:
- _LIT(KAddress,"13500135000");
- _LIT(KName,"Stone");
- CClientMtmRegistry* iClientMtmRegistry=CClientMtmRegistry::NewL(*iSession);
- CleanupStack::PushL(iClientMtmRegistry);
- CSmsClientMtm* iSmsClientMtm=(CSmsClientMtm *)iClientMtmRegistry->NewMtmL(KUidMsgTypeSMS);
- CleanupStack::PushL(iSmsClientMtm);
- iSmsClientMtm->SwitchCurrentEntryL(KMsvGlobalInBoxIndexEntryId);
- TMsvEntry indexEntry;
- indexEntry.SetInPreparation(EFalse);
- indexEntry.iMtm = KUidMsgTypeSMS;
- indexEntry.iType = KUidMsvMessageEntry;
- indexEntry.iServiceId = iSmsClientMtm->ServiceId();
- TTime nowTime;
- nowTime.HomeTime();
- //将当前时间转换为UTC时间
- TTsTime ts(nowTime,EFalse);
- nowTime=ts.GetUtcTime();
- //设置收到的时间
- indexEntry.iDate=nowTime;
- //设置发件人姓名
- indexEntry.iDetails.Set(KName);
- _LIT(KSMSBody,"MY first sms!");
- indexEntry.iDescription.Set(KSMSBody);
- indexEntry.SetUnread(ETrue);
- indexEntry.SetVisible(ETrue);
- iSmsClientMtm->Entry().CreateL(indexEntry);
- TMsvId iSmsId = indexEntry.Id();
- iSmsClientMtm->SwitchCurrentEntryL(iSmsId);
- CRichText& body = iSmsClientMtm->Body();
- body.Reset();
- body.InsertL(0, KSMSBody);
- // iSmsClientMtm->AddAddresseeL(KAddress,KName);
- iSmsClientMtm->SaveMessageL();
- CMsvStore* messageStore = iSmsClientMtm->Entry().EditStoreL();
- CleanupStack::PushL( messageStore );
- CSmsHeader* hdr = CSmsHeader::NewL( CSmsPDU::ESmsDeliver, body );
- CleanupStack::PushL( hdr );
- hdr->SetFromAddressL(KAddress);
- hdr->Deliver().SetServiceCenterTimeStamp(nowTime);
- hdr->StoreL(*messageStore);
- messageStore->CommitL();
- CleanupStack::PopAndDestroy(hdr);
- CleanupStack::PopAndDestroy(messageStore);
- // 修改当前消息索引为只读,这样收件箱列表处浏览会有回复选项
- //但是如果在之前就设置ReadOnly就会导致SaveMessageL出错
- indexEntry.SetReadOnly(ETrue);
- //消息索引提交更改
- iSmsClientMtm->Entry().ChangeL(indexEntry);
- CleanupStack::PopAndDestroy(2);