Symbian开发小结

 

1、获取IMSI号、手机版本等

 

   CTelephony:GetSubscriberId()

   CTelephony:GetPhoneId()

   CTelephony:Version()

2、获取屏幕尺寸

   TSize CEikConsoleScreen::ScreenSize

3、更改ListBox字体

   方法1:

       _LIT(KFontName,"Courier");

       TFontSpec fontSpec;

       fontSpec.iTypeface.iName=KFontName;

       fontSpec.iFontStyle.SetStrokeWeight(EStrokeWeightBold);

       fontSpec.iHeight=100;

       CFont * iFont;

       CCoeEnv::Static()->ScreenDevice()->GetNearestFontInTwips(iFont,fontSpec);

       CColumnListBoxData * data =

       ( static_cast<CColumnListBoxItemDrawer*>

       (iListBox->ItemDrawer()))->ColumnData();

       data->SetColumnFontL(1,iFont);

   方法2:

       data->SetColumnFontL(1,LatinPlain12());

   方法3:

       const CFont * iFont1;

       const CFont * iFont2;

       iFont1 = AknLayoutUtils::FontFromId(EAknLogicalFontPrimaryFont);//大字体

       iFont2 = AknLayoutUtils::FontFromId(EAknLogicalFontPrimarySmallFont);//小字体

       data->SetColumnFontL(1,iFont2);

   注意以上方法都必须在ActiveL()后面(也就是必须List创建好了)再使用.

4、UID范围说明

       Protected Range

       0 0x00000000 - 0x0FFFFFFF        Development use only

        0x01000000 - 0x0FFFFFFF               用作测试

       1   0x10000000 - 0x1FFFFFFF     Legacy UID allocations

       2   0x20000000 - 0x2FFFFFFF     V9 protected UID allocations

       3   0x30000000 - 0x3FFFFFFF     Reserved

       4   0x40000000 - 0x4FFFFFFF     Reserved

     5   0x50000000 - 0x5FFFFFFF     Reserved

     6   0x60000000 - 0x6FFFFFFF         Reserved

     7   0x70000000 - 0x7FFFFFFF     Vendor IDs Unprotected Range

       8     0x80000000 - 0x8FFFFFFF        Reserved

     9   0x90000000 - 0x9FFFFFFF         Reserved

       A   0xA0000000 - 0xAFFFFFFF      V9 unprotected UID allocations

     B     0xB0000000 - 0xBFFFFFFF        Reserved

     C   0xC0000000 - 0xCFFFFFFF       Reserved

     D     0xD0000000 - 0xDFFFFFFF      Reserved

     E     0xE0000000 - 0xEFFFFFFF      Development use only

     F     0xF0000000 - 0xFFFFFFFF        Legacy UID compatibility range

5、关于真机文件目录

       在*.pkg文件中,'-'前面是PC上的文件目录,请确认PC上对应目录下存在这些文件。

   '-'后面是手机上的目录,采用相对路径,如“resource/apps/*.mbm”

   注意:程序中若加载*.mbm文件中图片,需要使用“resource//apps//*.mbm”,注意'//'。

6、经常出现的SetRect(aRect);或ActivateL();出现错误

       需要注意控件是否成功构造。

       通常是由于构造函数中的代码次序问题。控件的构造应该在 ActiveL前完成。

7、申请开发证书将支持能力

       Capabilities for the certificate

   LocalServices   Location   NetworkServices   PowerMgmt   ProtServ

   ReadDeviceData   ReadUserData   SurroundingsDD   SwEvent

   TrustedUI   UserEnvironment   WriteDeviceData   WriteUserData。

8、打包常用命令

打包:makesis *.pkg *.sis

签名:signsis *.sis *.sisx *.cer *.key 111111

产生自签名证书:makekeys -cert -password 111111 -len 1024 -dname "CN=China OU=Develo

pment OR=Datang mobile Ltd lsg@datangmobile.cn" lsg.key lsg.cer

9、代码移植注意能力选项

移植第三方代码的时候注意能力选项,如获取手机IMSI号需要ReadDeviceData能力。

10、修改了rss文件后必须全部重新编译项目

修改rss文件后保存了需要重新编译项目,否则可能出现增量编译导致程序运行时加载字符串等资源出错。

11、以类对象作为成员变量

直接将类对象作为另外某个类的成员变量,而不是将该类对象指针作为类的成员变量,那么如果该类的构造函数是Protected/Private的,则新的对象无法成功构造!

12、Symbian不支持全局变量

13、RArray<Templete>定义时Templete的大小不能超过640

报告User 129错误, 127错误也是由RArray引起。

14、修改了类头文件后需要重新编译工程

15、获取手机剩余内存字节数

TMemoryInfoV1Buf info;

UserHal::MemoryInfo(info);

TInt freeMemory = info().iFreeRamInBytes;

16、控制用户输入长数字串

void CTestDlgDialog::PrepareLC(TInt aResourceId)

{

CEikDialog::PrepareLC( aResourceId );

// Pick up the Editor control from the dialog

CEikEdwin* control = static_cast<CEikEdwin*>(ControlOrNull(EMyQuery));

// Set the input mode

control->SetAknEditorInputMode(EAknEditorNumericInputMode);

// Restrict the other input modes

control->SetAknEditorAllowedInputModes(EAknEditorNumericInputMode);

}

17、播放wav声音文件

const TInt KSnapSoundId = 2;

CAknKeySoundSystem* iCameraSound;

iCameraSound =   static_cast<CAknAppUi*>(CEikonEnv::Static()->AppUi())->KeySounds();

if (iCameraSound)

        {

        TRAPD(error, iCameraSound->AddAppSoundInfoListL(R_CAMERA_SNAP_SOUND));

        if ((error != KErrAlreadyExists) && (error != KErrNone))

            {

            User::LeaveIfError(error);

            }

        }

iCameraSound->PlaySound(KSnapSoundId);

//以下在rss文件中定义

#define KcameraSoundFile    "Z://system//sounds//digital//Camera1a_2_8kHz.wav"

#define KSnapSoundId 2

RESOURCE AVKON_SOUND_INFO_LIST r_camera_snap_sound

    {

    list =

         {

        AVKON_SOUND_INFO

           {

            sid = KSnapSoundId;

            priority = 45;

            preference = EAknAudioPrefCamera; // defined in avkon.hrh

            file = KCameraSoundFile;

            }

        };

    }

18、搜索可用的WLAN网络

#include <rconnmon.h>

void CWlanTest:: ListNetworksAndSignalL(CDesCArraySeg& aNetworks)

{

    _LIT(KNetInfo, "Network: %S/tSignal: %d");

    TBuf<32> netName;

    TBuf<100> line;

    RConnectionMonitor monitor;

    TPckgBuf<TConnMonNetworkNames> pkgNetworks;

    // establish connection with the monitor server

    monitor.ConnectL();

    // prepare leave clean-up

    CleanupClosePushL(monitor);

    TRequestStatus status;

    // get the list of available networks

    monitor.GetPckgAttribute(EBearerIdWLAN, 0, KNetworkNames, pkgNetworks, status);

    // suspend thread until the info is retrieved

    // production code should use active objects

    User::WaitForRequest( status ) ;

    // leave if the asynchronous method returned an error

    User::LeaveIfError(status.Int());

    // reset networks list

    aNetworks.Reset();

    // add retrieved networks to the list

    for(TUint i=0; i<pkgNetworks().iCount; i++)

    {

        netName.Copy(pkgNetworks().iNetwork[i].iName);

        line.Format(KNetInfo, &netName, pkgNetworks().iNetwork[i].iSignalStrength);

        aNetworks.AppendL(line);

    }

    // close server session

    CleanupStack::PopAndDestroy(&monitor);

}

Note:

- Link against: ConnMon.lib

- S60 3rd Edition-specific capability needed: NetworkServices

19、有没有播放基于流的视频的方法

参考CVideoPlayerUtility的使用,可以播放流内容,详情参考SDK

问题一:更换S60第三版的应用程序图标

在mmp文件中添加

START BITMAP Test_aif.mbm

TARGETPATH                              /resource/apps

HEADER                                 

SOURCEPATH                              ../data

source                                  c24 icon_lst.bmp

source                                  c24 icon_lst_mask.bmp

source                                  c24 icon_cxt.bmp

source                                  c24 icon_cxt_mask.bmp

END

修改rss文件中LOCALISABLE_APP_INFO

icon_file = "//resource//apps//Test_aif.mbm";

在pkg 文件中增加

"C:/Symbian/9.1/S60_3rd_MR/Epoc32/data/z/resource/apps/Test_aif.mbm"-"!:/resource/apps/Test_aif.mbm"

 

 

问题二:模拟器无法启动

可能由于部分注册应用造成,尝试删除些*_reg.*

 

问题三:图片读取转化及base64解码问题

Base64使用TImCodecB64 类

图片注意DataNewL的数据必须作为成员变量,而不是局部变量,保证在转化之前数据未丢失

 

 

问题四:屏蔽HTTP接入点

步骤一:列举接入点

http://www.newlc.com/A-few-notes-about-the-CommDb.html

CCommsDatabase* CommDb = CCommsDatabase::NewL(EDatabaseTypeIAP);

CleanupStack::PushL(CommDb);

CApSelect* ApSelect = CApSelect::NewLC(*CommDb, KEApIspTypeAll ,EApBearerTypeAll ,KEApSortUidAscending);

if (ApSelect->MoveToFirst())

{

   do{

          TUint uid = ApSelect->Uid();

          //put here your IAP stuff

     }while(ApSelect->MoveNext());

}

CleanupStack::PopAndDestroy(ApSelect);

CleanupStack::PopAndDestroy(CommDb);

步骤二:

//头文件

RHTTPSession iSession;

RHTTPTransaction iTransaction;

RConnection iConnection;

RSocketServ iSocketServ;

//构造中

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

User::LeaveIfError(iConnection.Open(iSocketServ));

iPref.SetDialogPreference(ECommDbDialogPrefDoNotPrompt);

iPref.SetIapId(IAPId);

iPref.SetBearerSet(KCommDbBearerPSD);

iPref.SetDirection(ECommDbConnectionDirectionOutgoing);

TInt ret;

if( ( ret = iConnection.Start(iPref)) != KErrNone)

{

//成功了

}

//打开会话成功

TRAPD(err, iSession.OpenL());

步骤三:将http绑定到指定SocketServ,在http Post中

http://www.forum.nokia.com/document/Forum_Nokia_Technical_Library/contents/FNTL/Using_the_HTTP_Client_API_with_RConnection.htm

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

User::LeaveIfError(iConnection.Open(iSocketServ));

iHttpSession.OpenL();

// Initiate connection

iConnection.Start(iStatus);

//...

RHTTPConnectionInfo connInfo = iHttpSession.ConnectionInfo();

RStringPool pool = iHttpSession.StringPool();

// Attach to socket server

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

// Attach to connection

TInt connPtr = REINTERPRET_CAST(TInt, &iConnection);

connInfo.SetPropertyL(pool.StringF(HTTP::EHttpSocketConnection, RHTTPSession::GetTable()), THTTPHdrVal(connPtr));

// Open transaction...

iHttpTrans = iHttpSession.OpenTransactionL(iUri, *this, pool.StringF(HTTP::EGET, RHTTPSession::GetTable()));

RHTTPHeaders hdr = iHttpTrans.Request().GetHeaderCollection();

 

问题五:如何在Container中List控件和图片控件切换

void CMyContainer::Draw(TRect aRect)

{

CWindowGc& gc = SystemGc();

gc.SetPenStyle( CGraphicsContext::ENullPen );

gc.SetBrushColor( KRgbGray );

gc.SetBrushStyle( CGraphicsContext::ESolidBrush );

gc.DrawRect( aRect );

if(iImage)

{

gc.Clear();

gc.BitBit(TPoint(0,0), iImage);

}

}

CCoeControl* CMyContainer::ComponentControl(TInt aIndex) const

{

switch(TInt nIndex)

{

case 0:

if(iImage)

iListBox->MakeVisue(EFalse);

else

iListBox->MakeVisue(ETrue);

}

}

void CMyContainer::ShowImage()

{

iImage = ***;

DrawNow();

}

问题六:关于手机上的Log日志

现在在手机上,用PC套件怎么只能看到手机的Data目录,C:/Logs/MyLogDir/Log.txt看不到

1)退出时读文件内容重写一个新文件到Data目录

2) 安装文件工具FExplorer,http://www.newlc.com/article.php3?id_article=70

3) 使用自定义log http://developer.uiq.com/forum/threa...=1120&tstart=0

 

问题七:中文字符处理问题

Java String 16 中文 ->> 客户端8bit接受 --> 转化为16bit Tbuf, OKOK!

客户端16bit Tbuf --> 转化为8bit发送 --> Java String接受为乱码?????

解决: 使用utf.h中的C**Convert函数转化,而不是使用Copy函数

 

问题八:对话框被覆盖

使用CAknInformationNote的R_AKN_INFORMATION_NOTE_WAIT 标志

 

问题九:制作mask图片

直接将文件存为黑白图片即可

 

问题十:如何保证让http接收完成后再进行后续操作

1)使用观察器

2)使用等待框

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值