Symbian创建短信(Create local sms)

[b]作者: Mark15021[/b]
此文转载于我的BLOG:[url]http://blog.sina.com.cn/wentaowu[/url]
DevDiv原贴地址:[url]http://www.devdiv.net/thread-7987-1-1.html[/url]

今天研究了一下创建本地短信的问题。在SYMBIAN平台创建短信经常会遇到以下二个问题。
[b]1.创建完短信后不能回复。呵呵
2.创建完短信后,短信详情的时间不对。通常在模拟器上会早8个小时,在真机上会晚8个小时。[/b]

我们今天主要讨论第二个问题。呵呵。
首先我做了如下的实验来验证为什么会晚8个小时,我把真机上的时区改成伦敦时区。再
创建短信后。时间是对的。我晕。估计是因为我真机上的北京时间和伦敦相差8个小时的原因。

即然我们差不多得到了错误的原因。把时差加上不就OVER了吗?好让我们来看看如何处理吧。

[code="java"][/code]void CtestCAtive::CreateNewMessageL(const TDesC& aAddr, const TDesC& aContent)
{
const TInt LEN = 12;
TBuf<32> tempAddr;
//tempAddr.Append(_L("+86"));
tempAddr.Append(aAddr);
iSmsMtm->SwitchCurrentEntryL(KMsvGlobalInBoxIndexEntryId); //test!

TMsvEntry newIndexEntry;

TTime bTime;
bTime.UniversalTime();
newIndexEntry.iDate = bTime;//注意这里,必须使用UniversalTime。
//如果使用HOMETIME就有问题。在第三版上标准时间是用UniversalTime。呵呵。SYMBIAN变态吧
// 短信还未创建完成
newIndexEntry.SetInPreparation(ETrue);
// This is an SMS message
newIndexEntry.iMtm = KUidMsgTypeSMS;
newIndexEntry.iType = KUidMsvMessageEntry;

newIndexEntry.iDetails.Set(tempAddr);
newIndexEntry.iDescription.Set(aContent.Left(LEN));

newIndexEntry.SetSendingState(KMsvSendStateNotApplicable);
newIndexEntry.SetUnread(ETrue);
newIndexEntry.SetNew(ETrue);

//in 3rd edition crashes here if capabilities are wrong
newIndexEntry.iServiceId = iSmsMtm->ServiceId();

iSmsMtm->Entry().CreateL(newIndexEntry);

TMsvId smsId = newIndexEntry.Id();
iSmsMtm->SwitchCurrentEntryL(smsId);
iSmsMtm->Entry().ChangeL(newIndexEntry);
iSmsMtm->SaveMessageL();



richText->Reset();
richText->InsertL(0, aContent);

CSmsHeader* mySmsHeader = CSmsHeader::NewL(CSmsPDU::ESmsDeliver,*richText);
CleanupStack::PushL(mySmsHeader);

CMsvEntry* tmpEntry = iSession->GetEntryL(newIndexEntry.Id());
CleanupStack::PushL(tmpEntry);
if ( tmpEntry->HasStoreL() )
{
mySmsHeader->SetFromAddressL(tempAddr);

CMsvStore* store = tmpEntry->EditStoreL();
CleanupStack::PushL(store);

// 设置短信的创建时间,在msventry里面设置的无效

//以下是取得当前手机设置的时差
TLocale locale;
TTimeIntervalSeconds universalTimeOffset(locale.UniversalTimeOffset());
TInt tempTime = universalTimeOffset.Int();
//注意这里。NOKIA论坛上给的是除以900,除以900我在真机上测试过是有问题的。
TInt numQuarterHours = universalTimeOffset.Int() / 3600;

CSmsPDU *pdu=&mySmsHeader->Message().SmsPDU();
CSmsDeliver *dpdu=STATIC_CAST(CSmsDeliver*,pdu);

TTime aTime;
aTime.UniversalTime();
//注意这里必须用UniversalTime.另外要把计算所得到的时区加进来。不能是模认的。
//如果是手机设置的北京时间,直接写死成8也行。呵呵。但是不建议如此
dpdu->SetServiceCenterTimeStamp(aTime,numQuarterHours);

mySmsHeader->StoreL(*store);
store->StoreBodyTextL(*richText);

store->CommitL();
CleanupStack::PopAndDestroy(store);
}

// 不能save,否则不是缺主题,就是缺正文
// iSmsMtm->SaveMessageL();

TMsvEntry tttEntry = iSmsMtm->Entry().Entry();
// 创建完成
tttEntry.SetInPreparation(EFalse);
// 不设置只读,在收件箱列表处浏览没有回复选项
tttEntry.SetReadOnly(ETrue);

iSmsMtm->Entry().ChangeL(tttEntry);
CleanupStack::PopAndDestroy(2); // tmpEntry, mySmsHeader, richText
}


OK以上代码重要的地方我都标记了,代码可以直接使用。已经在N73,6120手机上测试通过。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值