1、标题:在/private目录下存储应用程序图片文件
KIS000314
设备, 软件 版本: S60 3rd Edition
说明:
如果图片文件存放在受保护目录下,则在S60第三版上使用AknIconUtils加载图标或图片可能会引发错误。
创建日期: February 23, 2006
详细描述:
如果图片文件aFileName存放在一个受保护目录下,如/private/<appUID>/下,则在S60第三版中使用AknIconUitls的下列方法
(akniconutils.h)时将会引发错误:
void CreateIconL( CFbsBitmap *&aBitmap,
CFbsBitmap *&aMask,
const TDesC &aFileName,
TInt aBitmapId,
TInt aMaskId )
这是因为Avkon icon server无法访问存放在保护目录下的文件。
案例重现:
在这种情况下AknIconUtils::CreateIconL()不会引发异常,不管怎么说,aBitmap和aMask参数将不会指向有效位图。如果尝试使用返回的位图
将会引发错误异常。
例如,尝试使用AknIconUtils::SetSize()设置位图大小时会引发error -46(KErrPermissionDenied)
解决方案:
不要将文件名传递到CAknIconUtils,程序应当完成max-in类MAknIconFileProvider,以便提供一个打开的文件句柄给Avkon icon server.
CAknIconUtils有一个可供重载的CreateIconL()方法以便接收一个MAknIconFileProvider示例。
这里提供一个完成MAknIconFileProvider 类的示例,请S60 Platform: Scalable Screen-Drawing Example, 可在
http://www.forum.nokia.com/下载
注意:包含应用程序图标的.mbm和.mif文件(会在LOCALISABLE_APP_INFO资源定义中被引用)应该永远安装在/resource/apps/.目录下。
2、RHostResolver和选择接入点对话框重复显示的问题
KIS000321
设备, 软件 版本: S60 3rd Edition
说明:
使用一个服务器解析服务时(RHostResolver)可能会引发选择接入点对话框的重复显示
创建日期: April 21, 2006
详细描述:
在S60第三版上,当前已有连接的状态下使用服务器解析服务(RHostResolver)时将导致选择接入点对话框不停重复出现。
案例重现:
连接socket server(RSocketServ),打开一个RConnection示例:
iSocketServer.Connect();
iConnection.Open(iSocketServer);
这样就开始了一个internet连接:
iConnection.Start();
这时会出现一个选择接入点对话框,要选择一个适当的访问接入点。
在连接已经建立后,使用RHostResolver打开一个DNS resolver session,并开始尝试解析一个主机名:
iResolver.Open(iSocketServer, KAfInet, KProtocolInetUdp);
iResolver.GetByName(someHost, iResult);
这时选择接入点对话框会会再次出现。
解决方案:
传递当前RConnection示例到host resolver中:
iResolver.Open(iSocketServer, KAfInet, KProtocolInetUdp, iConnection);
3、S60第三版中启动web浏览器打开一个指定的URL
TSS000340
设备, 软件 版本: S60 3rd Edition
说明:
创建日期: May 4, 2006
详细描述:
为了启动在S60第三版上的web浏览器,自动打开一个指定的URL,该应用程序必须能处理SWEvent。
参考代码:
Code:
RApaLsSession apaLsSession;
const TUid KOSSBrowserUidValue = {0x1020724D};
HBufC* param = HBufC::NewLC(64);
param->Des().Copy(_L("4 http://www.yahoo.com/"));
TUid id(KOSSBrowserUidValue);
TApaTaskList taskList(CEikonEnv::Static()->WsSession());
TApaTask task = taskList.FindApp(id);
if(task.Exists())
{
task.BringToForeground();
HBufC8* param8 = HBufC8::NewLC(param->Length());
param8->Des().Append(*param);
task.SendMessage(TUid::Uid(0), *param8); // UID not used
CleanupStack::PopAndDestroy(param8);
}
else
{
if(!apaLsSession.Handle())
{
User::LeaveIfError(apaLsSession.Connect());
}
TThreadId thread;
User::LeaveIfError(apaLsSession.StartDocument(*param, KOSSBrowserUidValue, thread));
apaLsSession.Close();
}
CleanupStack::PopAndDestroy(param);注意:如果浏览器正在加载一个URL,而另一个程序试图去打开它。那就会在加载新的url时报“Unable
to retrieve”错误
4、在S60第二版,FP2设备上获取电量状态
TSS000338
设备, 软件 版本: S60 2nd Edition, FP2
创建日期: May 4, 2006
说明:
直到S60第二版,FP2,电量值都是通过RSystemAgent中如systAgent.GetState(KUidBatteryStrength)获得的,但现在方法返回错误代码-19。
那在S60第二版,FP2设备上是否有其他方法可供使用呢?
案例重现:
解决方案:
这些值在新版中确实有所改变,而公开文档中却并未写上。
你可以通过使用下列值来查询电量状态。
Code:
// The current battery status information
const TInt KUidBatteryCStatusValue = 0x100052D8;
const TUid KUidBatteryCStatus = {KUidBatteryCStatusValue};
enum TSABatteryCStatus
{
ESACBatteryOk,
ESACBatteryLow,
ESACBatteryEmpty,
ESACPowerOff
};
// The amount of battery bars
const TInt KUidBatteryBarsValue = 0x100052D3;
const TUid KUidBatteryBars ={KUidBatteryBarsValue};
enum TSABatteryBars
{
ESABBars_0,
ESABBars_1,
ESABBars_2,
ESABBars_3,
ESABBars_4,
ESABBars_5,
ESABBars_6,
ESABBars_7
};
5、检查离线模式
TSS000336
设备, 软件 版本: S60 3rd Edition
说明:
创建日期: May 4, 2006
在S60第三版中,我们通过读取Centrol Repository中的电话设置来检查离线模式是否启动。
要获得情景模式的设置,只有对Central Repository进行调用才行:
Code:
#include <centralrepository.h>
#include <ProfileEngineSDKCRKeys.h>
CRepository* cr = CRepository::NewLC( KCRUidProfileEngine );
TInt value;
// Get ID of current profile
User::LeaveIfError( cr->Get( KProEngActiveProfile, value ) );
// Check value to determine the active profile
if ( value == 5 )
{
// current profile is the offline profile
}
// ...要了解更多关于Profile Engine的信息,可阅读SDK的帮助文档和“Profiles Engine Active Profile Settings API.”
案例重现:
解决方案:
6、S60第三版中出现了2个浏览器,缺省的为双模式浏览器
KIC000362
设备, 软件 版本: S60 3rd Edition
说明:
在S60第三版设备中有两个浏览器,做为主要浏览方式的传统双模式浏览器以及Nokia OSS浏览器
从其他程序中启动URL将打开双模式浏览器。
创建日期: May 11, 2004, updated July 7, 2006.
详细描述:
S60第三版设备现在有2个浏览器,传统的双模式浏览器支持Extensible Hypertext Markup Language Mobile Profile (XHTML MP)/ Wireless
Markup Language (WML)和HTML。这个浏览器被命名为“Services”(hoolee语,就是中文机中的“服务”)
第二个浏览器是Noia开源浏览器,它支持XHTML MP和HTML,不过尚未支持WML。这个浏览器力图保持web页面原来的布局,似它看起来就和原来
设计初衷一样。这个浏览器被命名为“Web”(hoolee语,取代了Opera了,呵呵)
如果用户请求,如一个MMS消息里有条连接要打开web页面,这是就会打开双模式浏览器去解析它。因为它是目前缺省的。
而从S60第三版FP1向后,Nokia开源浏览器将做为平台唯一的浏览器存在了:)
7、震动控制API(更新版)
KIS000160
设备, 软件 版本: S60 2nd Edition, Nokia 6600, versions 3.42.1 and 4.09.1, and Nokia 7610, version 4.0421.4
说明:
在设备中没有VibraCtrl.DLL存在
创建日期: May 11, 2004, updated July 7, 2006.
详细描述:
CVibraControl API已经在S60 SDK 2.0中有所描述,开发者也可以使用其工作。不过在Nokia6600中并没有被支持。
S60第二版,FP2和FP3设备已经包括了VibraCtrl.dll和震动功能。
S60第三版中提供了一个新的Vibra Client API(CHWRMVibra)
8、 搜索可用的WLAN网络
TSS000377
设备, 软件 版本: S60 3rd Edition
说明:
搜索可用的WLAN网络:我该如何获得网络的SSID和信号强度?
创建日期: July 7, 2006
详细描述:
搜索WLAN可用网络时,可以通过Connection Moniter Server API来获得他们实际的信号强度。
下面是该API的一个使用示例:
Code:
#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
9、在通话时捕捉到结束键(红色键)
TSS000375
设备, 软件 版本: S60 3rd Edition,S60 3rd Edition, FP1
说明:
创建日期: July 7, 2006
详细描述:
我们可以使用下列代码在通话时捕捉到结束键。
Please note that SwEvent capability is needed to make successful calls to the mentioned Window Server functions.
Code:
#include <W32STD.H> // link against ws32.lib
#include <e32keys.h>
...
RWindowGroup& groupWin = CCoeEnv::Static()->RootWin();
TInt endKey1 = groupWin.CaptureKeyUpAndDowns( EStdKeyNo, 0, 0 );
TInt endKey2 = groupWin.CaptureKey( EKeyNo, 0, 0 );
// -> End key can now be processed before the phone application of the device...
...
// Cancel the capture
groupWin.CancelCaptureKeyUpAndDowns( endKey1 );
groupWin.CancelCaptureKey( endKey2 );
10、安全共享数据及数据库加密
TSS000373
设备, 软件 版本: S60 3rd Edition
说明:
创建日期: July 7, 2006
详细描述:
从Symbian OS v9.x后就不再提供数据库加密机制了,保护你数据库不被其他程序访问的唯一方法就是将数据库文件存储在你的私人数据空间。
不过这样其他程序也就没法访问到它了。
Symbian OS v9.x中所介绍的安全共享数据库的方法为,通过data caging机制保护并共享数据。
数据库是通过DBMS client-serve API来生成并被访问的。数据库文件被存储在DBMS server的data cage文件夹中。DBMS server根据与此数据
库预先关联的安全法则允许其他客户端程序去访问它。这种安全法则可以规定客户端只能具有ReadDeviceData能力。为了向数据库写入东西,
客户端得具有WriteDeviceData能力,和一个给定的Secure ID(SID)
不幸的是,安全法则目前只能存放在Z盘中。这意味着第三方开发者无法定义或安装他们自己的安全法则。同样,当第三方程序需要使用一个好
的方法来同享数据库时,也没有能使用的预先配置的法则。
如果你的程序需要访问一个共享数据库,那下列选项是可以考虑的:
将数据库存放在一个共同目录下(如果不需要考虑安全性问题)
为你的服务提供一个API以访问存储在自己
If for your applications require access to a shared database, the options available are
- share a database stored in a public folder (if there are no security concerns)
- write your own server that provides an API to access a database stored in its own data cage folder.
If data encryption needs to be used, you must provide your own encryption mechanism in both cases.