Nokia论坛技术资料Symbian解决方案-中文版(3)-转载

如何在RHTTPSession上使用RConnection初始化的连接?

说明:
下列代码演示了如何在RHTTPSession对象上增加一个由RConnection生成的连接:

Code:
RConnection connection;
RSocketServ socketServ;
RHTTPSession session;

User::LeaveIfError(socketServ.Connect());
User::LeaveIfError(connection.Open( socketServ ));

User::LeaveIfError(onnection.Start())

session.OpenL();

RHTTPConnectionInfo connInfo = iSession.ConnectionInfo();
RStringPool pool = iSession.StringPool();

connInfo.SetPropertyL(pool.StringF(HTTP::EHttpSocketServ,
RHTTPSession::GetTable()), THTTPHdrVal(iSocketServ.Handle()));
connInfo.SetPropertyL(pool.StringF(HTTP::EHttpSocketConnection,
RHTTPSession::GetTable()), HTTPHdrVal(iConnect.SubSessionHandle()));

session.OpenTransactionL(...);
如何在.pkg中定义条件判断60系列平台的版本?
说明:
详细描述

现在有这样几个文件需要安装,其中六个基本文件适合所有平台,有一个是可选择安装的文件,它只能安装在Nokia7610上,或平台版本大于7610平台版本的手机上,请问如何在安装时对平台版本进行判断呢?
解决方案
pkg中大部分都可以被条件语句所包含。可是下列内容可能无法这样使用:languages, package-header, package signature, requisites, 和capabilities.
不幸的是,平台版本号正是做为“ requisites"所定义的,因此无法被条件语句所包含。不过好在Nokia所有设备上都有这样一个目录”z:\system\install" ,其中有一个sis文件"Series60vx.x.sis" 。
这样一来,Nokia7610所需安装部件就可写为:
Code:
IF exists("z:\system\install\Series60v2.1.sis")

; 7610 dependent component

ELSEIF exists("z:\system\install\Series60v2.6.sis")

; Series 60 Platform 2.6 dependent component

ELSE

; Series 60 1.x dependent component

ENDIF
如何不经提示对话框而生成一个internet连接
说明:
下列代码演示了如何不经提示对话框而生成一个连接。你需要知道具体接入点的IAP ID。
Code:
RSocketServ socketServ;

RConnection connection;

User::LeaveIfError(socketServ.Connect());

User::LeaveIfError(connect.Open(socketServ));

TCommDbConnPref 

pref;pref.SetIapId(4); // IAP ID for connection to be used

pref.SetDialogPreference( ECommDbDialogPrefDoNotPrompt );

pref.SetDirection( ECommDbConnectionDirectionOutgoing );

connection.Start(pref);

如何保证主要程序在多个开发平台上都可使用。

开发者开发的跨平台程序可能融合了各平台不同的方法及属性,因此需要小心对待这样的情况。如需将程序设计为适应多平台特性,则需要做一些额外的工作。此外代码重用也是我们必须达到的目标之一。
我们可以通过标准预处理宏来解决跨平台的问题,这样我们即可为每个发行版本来分别编译了。

Code:
  #ifdef __SERIES60_20__
    // call new supported method in Series 60 Developer Platform 2nd Edition
  #else
    // call old supported method in Series 60 Developer Platform 1.0
  #endif

在9200系列通信器中怎样可以在程序中调用安装管理器?

说明:
完成这个功能可以使用下面的代码

Code:
CApaCommandLine* cmdLine;
cmdLine=CApaCommandLine::NewLC();
cmdLine->SetLibraryNameL(
    _L("z:\\System\\apps\\instapp\\instapp.app"));
cmdLine->SetDocumentNameL(_L("FileNameToInstall.sis"));
cmdLine->SetCommandL(EApaCommandRun);
EikDll::StartAppL(*cmdLine);
CleanupStack::PopAndDestroy(); // cmdLine

我怎样才能知道某一种消息类型(MTM)是否已经连接了呢?

解决方案
首先,连接到消息服务器,打开一个客户端进程:

Code:
CMsvSession* session = CMsvSession::OpenAsyncL(*this);

创建一个CClientMtmRegistry类的对象:

Code:
CClientMtmRegistry* mtmReg;
mtmReg = CClientMtmRegistry::NewL(*session);
/* list of known MTM Uid
KUidMsgTypeSMS
KUidMsgTypeMultimedia
KUidMsgTypePOP3
KUidMsgTypeIMAP4
KUidMsgTypeSMTP
*/
if (mtmReg->IsPresent(KUidMsgTypePOP3))
{
 // POP3 MTM is present
}
if (mtmReg->IsInUse(KUidMsgTypePOP3))
{
// POP3 MTM is in use
}

如果某一个MTM的UID是未知的,可以用下面的裚环来获取。

Code:
TInt mtmCount = mtmReg->NumRegisteredMtmDlls();

for (TInt i=0; i<mtmCount; i++)

    {

    TUid mtmUid = mtmReg->MtmTypeUid(i);

    const CMtmDllInfo* mtmInfo;

    mtmInfo = &(iMtmReg->RegisteredMtmDllInfo(mtmUid));

    TBuf8<256> info;

    info.Copy(mtmInfo->HumanReadableName());

    }

如何发现可用的音频设备

解决方案
检测音频设备并没有直接的方法。但是可以尝试播放一段测试音
乐(频率 20 KHz, 优先级 = EMdaPriorityMin, 长度 = 0 ms).
如果返回的值是KErrInUse,那么这说明音频服务器正在使用中.

注意:有些情况下其他的多媒体客户端程序有可能一直保留对音
频设备的占用。

播放声音的示例代码在Series 60 SDK的Sound example中有演示
如何在一个单独类中使用线程局部存储(TLS)

下列代码演示了一个单独的对象,它的NewL函数使用了TLS来测试本类型的对象是否已綺生成。如果是,则简单返回存储在TLS中的指针(转化为它自己的类型),如果否,则实例化一个这样类型的对象,并存储在TLS中,并给予返回。

注意这里假定在DLL中没有其他类使用本类,如果有的话,那你需要重写一个单独的管理类,它使用TLS来存储一个结构指针,该结构含所有程序需要的单个对象的指针。

Code:
Example 1: Singleton implementation based on TLS

  ==============

  CMySingleton.h

  ==============

 

  class CMySingleton : public CBase

      {

  public: // constructor and destructor

      static CMySingleton* NewL();

      virtual ~CMySingleton();

  private: // constructors

      CMySingleton(); // private because of the singleton pattern; it is

                      // guaranteed that only NewL will call it

      void ConstructL();

  public: // other functions

      ...

  private: // other functions

      ...

  private: // data

      ...

      }

  ================

  CMySingleton.cpp

  ================

 

  CMySingleton::CMySingleton* NewL()

      {

      CMySingleton* singleton;

      // Check thread local storage:

      if ( Dll::Tls() == NULL )

          {

          // TLS is still null, which means that no CMySingleton has

          // been instantiated yet.  Do so now, and return that

          // instance:

          singleton = new ( ELeave ) CMySingleton();

          CleanupStack::PushL( singleton );

          singleton->ConstructL();

          CleanupStack::Pop( singleton );

          // Store a pointer to the new instance in thread local storage:

          TInt err = Dll::SetTls( static_cast<TAny*>( singleton ) );

          if ( err == KErrNone )

              {

              return singleton;

              }

          else

              {

              delete instance;

              User::Leave( err );

              return NULL;

              }

          }

      else

          {

          // CMySingleton has been instantiated once already, so return

          // that instance:

          singleton = static_cast<CMySingleton*>( Dll::Tls() );

          return singleton;

          }

      }
为什么播放buffer数据下的MIDI无法成功
说明:
CMdaAudioPlayerUtility不支持buffer形式播放MIDI,只能以文件形式播放。
hoolee提外话,可以自己来实现midi的codec,这样就可以buffer处理了
ResetMachine()会引发数据文件损坏丢失
说明:
在调用UserSvr::ResetMachine()方法重启机器时可能会引发数据文件的丢失或损坏。
因为这个函数不允许用户处理退出的准备工作,直接关机当然会损坏文件的数据。
解决方法为,让用户手动选择机器的关闭。
CSendAs中关于SMS的发送
说明:
如果使用CSendAs API发送短信,必须由用户明确指定。而使用后发送的短信会存放在发件箱里。
播放AMR文件结束过早的问题
说明:
播放AMR文件结束的过早,导致最后的声音都无法听见。
无法听到的那部分至少0.5秒。
解决方法:
在文件末尾加上段静音。
播放声音时有来电发生的错误
说明:
在播放声音时,当有来电出现, 会引发KErrDied错误。
这在系统中是不允许的,因为在硬件设备层是不允许程序声音与来电声音相混合的。注意,这样的情况只发生在上面指定的手机型号中。

如何在来电时播放声音呢,可以使用MMF(Multi Media Framework)中的CMdaAudioOutputStream或CMdaAudioPlayerUtility向audio硬件传递声音。
这样你会获得一个error code -13的错误(KErrDied)
这是没有办法解决的。
在模拟器上使用CMdaAudioInputStream时出现内存泄露
说明:
在模拟器上使用CMdaAudioInputStream时会引发内存泄露,导致在退出程序时出现错误提示。
解决办法:忽略CMdaAudioInputStream所引发的内存泄露。
Audio input streaming溢出,导致异常发生
说明:
当录音到最后一个buffer完成时会因为CMdaAudioInputStream导致异常发生。
CMdaAudioInputStream会引发E32User-CBase 49错误。在KErrOverflow错误发生时,MMdaAudioInputStreamCallback::MaiscRecordComplete()
会被调用。
解决方法,可以通过重用buffer来避免这个问题,请参考Series 60 Developer Platform 2.0: Audio Streaming Example v1.0一文获取更多资料。
在Series60 2.0平台中没有了WAP Stack API怎么办
说明:
在symbian OS 7.0s中就已綺不推荐使用WAP stack API了,因此在Symbian OS 8.0a中就去掉了这些。
因为某些程序使用WAP Stack API后会引发机器崩溃。这些API所涉及到的Capcodec.dll和wapstkcli.dll库也都被去掉了。
我们现在可以使用HTTP Client API来替代它们,这里HTTP Client API是支持WSP的
XML Parser API无法使用的问题
说明:
尽管XML Parser API在一些开发文档中提及,并且在SDK中也有一些相关性的头文件存在,但其目前仍无法使用。
XML Parser API将在未来的Series 60 Developer Platform被正式支持。
如果你需要的话,可以实现自己的XML解析程序或使用现成的解析器,如Digia SAX Paser
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值