symbian 短信3

 感觉好久没有写我的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手机上测试通过。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值