感觉好久没有写我的BLOG了,这几天到处跑在火车上也呆了一整天。休息再到新的地方逛逛。
呵呵,感觉还是不错的。今天正式开工,把今天研究的东西和大家共享一下。
今天研究了一下创建本地短信的问题。在SYMBIAN平台创建短信经常会遇到以下二个问题。
1.创建完短信后不能回复。呵呵
2.创建完短信后,短信详情的时间不对。通常在模拟器上会早8个小时,在真机上会晚8个小时。
我们今天主要讨论第一个问题。呵呵。
首先我做了如下的实验来验证为什么会晚8个小时,我把真机上的时区改成伦敦时区。再
创建短信后。时间是对的。我晕。估计是因为我真机上的北京时间和伦敦相差8个小时的原因。
即然我们差不多得到了错误的原因。把时差加上不就OVER了吗?好让我们来看看如何处理吧。
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(KMsvGlobalInBoxIndexEntr
yId); //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(KMsvSendStateNotApplicab
le);
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->SetServiceCenterTimeStam
p(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手机上测试通过。
呵呵,感觉还是不错的。今天正式开工,把今天研究的东西和大家共享一下。
今天研究了一下创建本地短信的问题。在SYMBIAN平台创建短信经常会遇到以下二个问题。
1.创建完短信后不能回复。呵呵
2.创建完短信后,短信详情的时间不对。通常在模拟器上会早8个小时,在真机上会晚8个小时。
我们今天主要讨论第一个问题。呵呵。
首先我做了如下的实验来验证为什么会晚8个小时,我把真机上的时区改成伦敦时区。再
创建短信后。时间是对的。我晕。估计是因为我真机上的北京时间和伦敦相差8个小时的原因。
即然我们差不多得到了错误的原因。把时差加上不就OVER了吗?好让我们来看看如何处理吧。
void CtestCAtive::CreateNewMessageL(const TDesC& aAddr, const TDesC& aContent)
{
}
OK以上代码重要的地方我都标记了,代码可以直接使用。已经在N73,6120手机上测试通过。