以文本方式查看主題 - 曙海教育集團(tuán)論壇 (http://www.xinguifushi.cn/bbs/index.asp) -- Symbian開(kāi)發(fā) (http://www.xinguifushi.cn/bbs/list.asp?boardid=46) ---- Symbian 平臺(tái)技術(shù)開(kāi)發(fā)技巧匯總 (http://www.xinguifushi.cn/bbs/dispbbs.asp?boardid=46&id=2047) |
-- 作者:wangxinxin -- 發(fā)布時(shí)間:2010-12-3 13:55:44 -- Symbian 平臺(tái)技術(shù)開(kāi)發(fā)技巧匯總 問(wèn)題一、如何枚舉出正在運(yùn)行的App 結(jié)合RApaLsSession和TApaTaskList應(yīng)該可以做到. RApaLsSession: GetAppIcon() GetAppInfo() TApaTaskList: FindApp() 問(wèn)題二、從收件箱讀取彩信圖片 mmslist實(shí)現(xiàn)了首先以listbox列表的形式列出了收件箱中的所有彩信,選擇某一條彩信后可以顯示出它的發(fā)送端號(hào)碼和彩信的文本信息;現(xiàn)在我想讓它顯示發(fā)送端號(hào)碼和彩信圖片(假設(shè)我的彩信都是圖片格式);請(qǐng)教兩位應(yīng)該怎么才能實(shí)現(xiàn)讀彩信圖片并顯示的功能。 下面是讀彩信文本信息的代碼,你們參考一下: void CMmslController::GetMessageL( const TDesC& aItem, TDes& aMessageText ) const { //Read the message Uid from aItem TUint32 id = 0; TLex lexer( aItem ); lexer.SkipSpace(); TChar ch( lexer.Get() ); while ( ( ch != ‘\\t’ ) && ( ch != 0 ) ) // Finding end of 1.st line { ch = lexer.Get(); } lexer.SkipSpace(); lexer.Val( id, EHex ); if( iCurEntries->Find( id ) == KErrNotFound ) { return; } CMsvEntry* msvEntry = iSession->GetEntryL( id ); CleanupStack::PushL( msvEntry ); const TMsvEntry& msgEntry = msvEntry->Entry(); CBaseMtm* clientMtm = iMtmReg->NewMtmL( msgEntry.iMtm ); CleanupStack::PushL( clientMtm ); clientMtm->SwitchCurrentEntryL( msvEntry->EntryId() ); // An instance of the TDesOverflow derived class used to suppress // the panic that would be generated if buffer length was exceeded // in calls to AppendFormat TOverrideOverFlow noOflo; // Text is located in iDescription field. aMessageText.AppendFormat( msgEntry.iDescription, &noOflo ); //aMessageText.AppendFormat( msgEntry.iDetails ); CleanupStack::PopAndDestroy( 2 ); // clientMtm, msvEntry } 問(wèn)題三、如何讓程序在安裝后自動(dòng)運(yùn)行 如何讓一個(gè)程序(或是一個(gè)server)在安裝后自動(dòng)運(yùn)行于手機(jī)中,這是非常容易的,只需在你的PKG文件中,在包含你的app或exe文件的那行末尾加上“FR,RI”。 “FR”表示“File Run”,而“RI”則表示“Run during Installation”。請(qǐng)注意,務(wù)必要先開(kāi)始rsc,aif,mbm文件的安裝,然后才能是APP等(也就是在pkg文件的末尾進(jìn)行app的安裝) 舉例: “\\Symbian.1\\Series60\\Epoc32\\release\\thumb\\urel\\MyApp.rsc” - “!:\\system\\apps\\MyApp\\MyApp.rsc” “\\Symbian.1\\Series60\\Epoc32\\release\\thumb\\urel\\MyApp_caption.rsc” - “!:\\system\\apps\\MyApp\\MyApp_caption.rsc” “\\Symbian.1\\Series60\\Epoc32\\release\\thumb\\urel\\MyApp.aif” - “!:\\system\\apps\\MyApp\\MyApp.aif” “\\Symbian.1\\Series60\\Epoc32\\release\\thumb\\urel\\MyApp.app” - “!:\\system\\apps\\MyApp\\MyApp.app”,FR,RI 問(wèn)題四、全面了解文件類型和從屬關(guān)系 下圖顯示了在一個(gè)典型的Symbian程序中各文件的從屬關(guān)系。 .hrh文件中包含所有要在.rss、.h和.cpp中使用的枚舉類型。它們主要使用在應(yīng)用程序的菜單、工具欄等地方,下面展示了一個(gè)典型的例子: //MyApp.hrh // enum{ EMyAppCmdOpenFile = 0×6000, EMyAppCmdEdit, }; 按照慣例這些命令I(lǐng)D值的范圍應(yīng)該從0×6000開(kāi)始向上。 .rss文件中是資源文件,這些文件包括所有靜態(tài)字符串、按鈕、菜單和列表等的定義,都使用在應(yīng)用程序UI中。此外,Nokia Series 60向?qū)н可能生成一個(gè).loc文件,這個(gè)文件同.rss文件很相似但只用于描述你程序中的靜態(tài)字符串,利用它你可以很容易的將程序變成多語(yǔ)言版本。 .rsg是生成的資源文件。它們是在編譯時(shí)刻由資源編譯器產(chǎn)生的,.cpp文件將包含它們以便處理資源。 .mbm是symbian位圖文件,它里面可以存儲(chǔ)幾個(gè)位圖。 .mbg是在創(chuàng)建.mbm時(shí)生成的。這些文件一般包含在那些使用位圖的RSS文件中,一個(gè)mbg文件包括在.mbm中各位圖的ID。 問(wèn)題五、如何在網(wǎng)絡(luò)通訊中正確顯示中文 1。經(jīng)過(guò)對(duì)照GB2312/GBK編碼表,在程序中定義_LIT8(KTest, “中文測(cè)試”);是GB2312/GBK編碼 2。直接從輸入框取出的字符串,經(jīng)過(guò)按照byte分析并比較中文和unicode對(duì)照表,發(fā)現(xiàn)是UTF-16LE(Sixteen-bit UCS Transformation Format, little-endian byte order)編碼 3,中文對(duì)服務(wù)器的傳輸建議統(tǒng)一處理成UTF8編碼進(jìn)行,從對(duì)話框獲得的也一樣處理,服務(wù)器需要對(duì)應(yīng)識(shí)別過(guò)來(lái)的字符串并做處理。 問(wèn)題六、如何動(dòng)態(tài)更改CEikLabel 的text CEikLabel* iLabelStatus; ….. iLabelStatus = new (ELeave) CEikLabel; iLabelStatus->SetContainerWindowL( *this ); iLabelStatus->SetTextL( this->iStatusStr ); …. //動(dòng)態(tài)在這里更改 iLabelStatus->SetTextL(iStatusStr); iLabelStatus->DrawNow(); 如果初始化時(shí)就無(wú)法顯示,請(qǐng)對(duì)照helloworld代碼檢查自己label是否設(shè)置正確;如果是進(jìn)度進(jìn)行中無(wú)法顯示,請(qǐng)檢查CActive是否正確執(zhí)行,單步DrawNow是否被正確調(diào)用。 問(wèn)題七、在listbox中怎么處理所選項(xiàng)的事件 觸發(fā)事件并不是很復(fù)雜的事情, TKeyResponse CXXContainer::OfferKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aType) { TInt code = aKeyEvent.iCode; switch(code) { // is navigator button pressed導(dǎo)航按鈕被按下時(shí) case EKeyOK: { // pass the key press event to view, // then view will pass it to ui class’s handler iXXView->ProcessListEvent(iListBox->CurrentItemIndex()) ; } return (EKeyWasConsumed); case EKeyLeftArrow : case EKeyRightArrow : return (EKeyWasConsumed); default: // Let Listbox take care of its key handling return iListBox->OfferKeyEventL(aKeyEvent, aType) ; } } 這個(gè)iXXView的ProcessListEvent()函數(shù)就是傳入當(dāng)前用戶選擇的那個(gè)list item的index。 問(wèn)題八、pkg文件中指定多個(gè)操作系統(tǒng)版本 pkg file定義了安裝文件(sis)的內(nèi)容,它包括應(yīng)用程序的UID,一個(gè)支持的語(yǔ)言列表,目標(biāo)產(chǎn)品的UID和打包在sis的一組文件: ; MyGame.pkg ; Specifies an installation file for MyGame ///////為MyGame文件制定一個(gè)安裝文件 ;Languages &EN ;Header #,(0×1000ABCD),1,0,0 ; Required line for Series 60 devices. Defines the target product ; UID. (0×101F6F88), 0, 0, 0, “\\epoc32\\release\\thumb\\urel\\MyGame.app”-“!:\\system\\apps\\MyGame\\MyGame.app” “\\epoc32\\release\\thumb\\urel\\MyGame.rsc”-“!:\\system\\apps\\MyGame\\MyGame.rsc” “\\epoc32\\release\\thumb\\urel\\MyGame.mbm”-“!:\\system\\apps\\MyGame\\MyGame.mbm” “\\epoc32\\release\\thumb\\urel\\MyGame.aif”-“!:\\system\\apps\\MyGame\\MyGame.aif” “..\\MyGame\\MyGameSample.wav”-“!:\\system\\apps\\MyGame\\MyGameSample.wav” Product UID定義了應(yīng)用程序的目標(biāo)環(huán)境,大部分的s60版本是向下兼容的。 參見(jiàn)下表: Nokia 7650 0×101F6F87 Nokia 3650 0×101F7962 Nokia 9210/9290 0×10005E33 Nokia N-gage 0×101F8A64 Siemens SX1 0×101F9071 Series 60 Platform v0.9 0×101F6F88 Series 60 Platform v1.0 0×101F795F Series 60 Platform v1.1 0×101F8201 Series 60 Platform v1.2 0×101F8202 Series 60 Platform v2.0 0×101F7960 如果程序需要依據(jù)各不同的平臺(tái)來(lái)進(jìn)行安裝,那就可以使用條件語(yǔ)句塊來(lái)處理,這時(shí)pkg里的語(yǔ)句如下: ; ; Files to install ; IF MachineUID=0×101fb3dd ; Nokia 6600 specific files “..\\MyFiles\\FileFor6600.dat”-“!:\\system\\apps\\MyGame\\MyData.dat” ELSEIF MachineUID=0×101f466a ; Nokia 3650 specific files “..\\MyFiles\\FileFor3650.dat”-“!:\\system\\apps\\MyGame\\MyData.dat” ELSE ; Files for other devices “..\\MyFiles\\FileForOthers.dat”-“!:\\system\\apps\\MyGame\\MyData.dat” ENDIF 就可以生成一個(gè)支持多平臺(tái)的安裝文件,除了機(jī)器UID外,還有很多屬性,如內(nèi)存和CPU的標(biāo)識(shí): 注意,機(jī)器UID和Product UID是不同的,見(jiàn)下: Nokia 7650 0×101F4FC3 Nokia 3650 0×101F466A Nokia 6600 0×101FB3DD Nokia 9210/9290 0×10005E33 Nokia N-Gage 0×101F8C19 Win32 Emulator 0×10005F62 可以使用如下的代碼來(lái)找出該設(shè)備的機(jī)器UID: #include //and link with hal.lib TInt machineUid = 0; HAL::Get(HALData::EmachineUid, machineUid); 問(wèn)題九、如何按字節(jié)讀取文件 1.RFile::Read() TInt Read(TDes8& aDes,TInt aLength) const; |