最近在學習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);