ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Symbian创建短信(Create local sms)

Symbian创建短信(Create local sms)

原创 Linux操作系统 作者:c00lsun 时间:2009-04-14 10:12:53 0 删除 编辑
      研究了一下创建本地短信的问题。在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(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手机上测试通过。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9059159/viewspace-588934/,如需转载,请注明出处,否则将追究法律责任。

上一篇: mobpub宣传样例
请登录后发表评论 登录
全部评论

注册时间:2009-03-23

  • 博文量
    31
  • 访问量
    47331