(1)我的应用程序可以随附的文件数有限制吗?
提交无应用程序扩展名的文件:
在 BREW 1.x 中,应用程序提交包中包含的每个文件都必须有一个扩展名(有关详细信息,请参阅http://www.qualcomm.com/brew/sch/developer/support/kb/235.html)。这将影响那些作为其提交包一部分包含数据库文件的应用程序。有关“作为应用程序包的一部分包含数据库文件的解决办法”的详细信息,请参阅至 9h 的链接。应用程序包中的每个 1.x 文件都需要有一个扩展名。如何提交 1.x 应用程序中的
(2)数据库文件?
提交应用程序包中的零字节文件:
由于 BREW 1.x 缺陷,Mobile Shop(移动商店)有时无法下载包含零字节文件的应用程序。请确保您的应用程序包中不包含任何零字节文件。零字节文件只会在下载时引起问题 - 在运行时期间可能会产生零字节文件。
在应用程序的 MIF 文件进行了 TAPI 状态通知注册:
由于 BREW 1.0 缺陷,因此无法在应用程序的 MIF 文件中注册 TAPI 状态通知 (NMASK_TAPI_STATUS)。这是因为在 MIF 文件中为 TAPI 状态注册的应用程序被禁用时会发生错误:在启动 Mobile Shop(移动商店)连接后,BREW 会尝试通知应用程序(因为数据调用已开始并引发一个 TAPI 状态更改事件)。因为已禁用该应用程序,所以 BREW 会尝试重新启用它,这样会再次启动 Mobile Shop(移动商店)连接。结果产生一个不停重新启动 Mobile Shop(移动商店)的循环。
该缺陷已在 BREW 1.1 及以后的版本中修正。对于该问题没有解决办法 - BREW 1.0 应用程序不能在它的 MIF 文件中注册 TAPI 状态更改事件。要在运行应用程序时获得 TAPI 状态更改事件的通知,可以调用 ISHELL_RegisterNotify()。
(3)如何将多个模块打包成单个 True BREW 测试提交?
答:如果您在提交由多个模块组成的应用程序, 请按下述说明安排 zip 文件的结构:
多模块提交说明:
每个 "mod" 文件必须有一个唯一名称。开发者应该将每个 "mod" 文件放在 ARM 目录下的独立子目录中。每个子目录都应该有 自己的 "mod" 和 "mif" 文件且已单独签名。子目录名 与关联的 "mod" 文件应该相同。例如:
ARM\test1\
test1.mod
test1.mif
test1.sig
test1.bar
ARM\ test2\
test2.mod
test2.mif
test2.sig
等等...
ARM 目录使用的同一目录结构也应用于 WIN 目录。 应用程序的 Windows 版本也 用于测试且应该依据于电话所用的同一模块。
(4)使用扩展类的小程序是否需要将权限级别设置为“全部”才能成功运行?
要加载扩展,不需全部权限。请确保在您的小程序类的 MIF 文件和扩展类的 MIF 文件中遵守下面的指导原则?
1. 在扩展类的 MIF 文件中:
扩展的 Class ID 应在导出类下的“扩展”选项卡中列出。它不应在“小程序”选项卡上“小程序信息”下列出。如果在“小程序信息”下列出,则 BREW 将认为 Class ID 属于小程序。只有系统可以使用 ISHELL_CreateInstance() 创建小程序的实例。
2. 在小程序类的 MIF 文件中:
在“小程序信息”下列出小程序 Class ID。
选择必需的权限级别(“常规”选项卡)。
在“依存”选项卡中列出扩展类。
BREW SDK 1.0.1 随附的 ExtUse 和扩展示例在 MIF 文件中包含以下故障:
全部权限已检查
扩展的 Class ID 在“导出类”和“小程序信息”下列出
这已在 1.1 SDK 中修复。
(5)ISHELL_CreateInstance() 在试图创建扩展类的实例时为什么返回 EPRIVLEVEL?
请参阅使用扩展类的小程序是否需要将权限级别设置为“全部”才能成功运行?FAQ。
(6)使用 Mobile Shop(移动商店)删除取决于某个模块的所有应用程序时,有时发现通用模块被删除。为什么?
如果应用程序被连续删除且在应用程序删除期间不退出 Mobile Shop(移动商店),则说明 Mobile Shop(移动商店)中有故障引起了这种行为。
例如,假定已加载了两个对一个通用模块有依存关系的应用程序。如果您使用 Mobile Shop(移动商店)连续删除了这两个应用程序(删除期间不退出 MobileShop(移动商店)),则会看到该通用模块仍然存在。但是,如果在删除期间退出并重新启动 Mobile Shop(移动商店),则会同时删除通用模块。这是可以预期的行为。
通用模块是扩展类。有关使用扩展的详细信息,请参阅 SDK 随附的 ExtUse 和扩展示例和下面的 FAQ 使用扩展类的小程序是否需要将权限级别设置为“全部”才能成功运行?。
(7)请详细说明 BREW 权限级别。
权限级别通过控制对 API 类的访问提供附加安全性。小程序必须具有相应的权限级别才能使用特定的类。小程序的权限级别在其相应的 MIF 中指定。MIF 是通过 MIF 编辑器创建和维护的。
为了使用 Ifile、IfileMgr、Idatabase、IDBMgr、IDBRecord、ISound 和/或 ISoundplayer API 类,小程序必须具有“文件”权限级别。
为了使用 INetMgr 和/或 ISocket ISoundplayer API 类,小程序必须具有“网络”权限级别。
如果未选择相应的权限级别,则该类的 ISHELL_CreateInstance() 会失败。
两个其它权限级别,即“下载”和“全部”显示在 MIF 的“高级权限级别”对话框。这些权限目前不使用,只能由运营商或设备生产商使用。如果您是应用程序开发人员,选择这些权限级别可能会引起应用程序无法通过 TRUE BREW 测试。
(8)为什么在调用 ISHELL_CreateInstance() 时收到 EPRIVLEVEL 21 错误?
这表明您没有创建特定类所需的权限。务必检查应用程序的 MIF 文件中的必需权限(“常规”选项卡)。请参阅请详细说明 BREW 权限级别 FAQ。
如果从小程序 (class_b) 中调用一个非小程序类 (class_a),则必须执行以下操作才能具有必需的权限:
在 class_b 的 mif 文件中,指定 class_a 的外部 class ID(MIF 编辑器中的“依存”选项卡)。
在 class_a 的 mif 文件中,必须导出其 Class ID(MIF 编辑器中的“扩展”选项卡)。
有关详细信息,请参阅 ISHELL_CreateInstance() 在试图创建扩展类的实例时为什么返回 EPRIVLEVEL? FAQ。
(9)可以从何处找到 ISHELL_CheckPrivLevel() API 的各种权限级别 (wPrivWant) 的定义?
权限级别在 API 参考文档的“AEE 权限级别”下进行了说明。SDK 版本 1.1 中没有这些权限级别的定义。这是 SDK 版本 1.1 中的故障。请创建一个具有以下定义的头文件并将该头文件放在您的项目中:
#define PL_FILE (0x0001) // IFileMgr, IDBMgr
#define PL_NETWORK (0x0002) // INetMgr
#define PL_TAPI (0x0004) // ITAPI (简单)权限
#define PL_WEB (0x0008) // IWeb 权限(如果为 PL_NETWORK 也同样适用)
#define PL_DOWNLOAD (0x0020) // IDownload
#define PL_SHARED_WRITE (0x0040) // 写入权限 - 共享目录
#define PL_POS_LOCATION (0x0080) // 定位权限 (ISHELL_GetLocation)
#define PL_RINGER_WRITE (0x0100) // 写入权限 - 振铃器目录
#define PL_ADDRBOOK (0x0200) // 访问地址簿
#define PL_SECTORINFO (0x0400) // GetSectorInfo
#define PL_SYSTEM (0xffff)
在版本 2.0 中,权限级别定义将纳入 AEE.h 中。
(10)BREW 如何处理不同语言的应用程序本地化?
我们建议对于包含语言的任何内容(位图、字符串和对话框),都应使用资源文件并按需在程序中加载所需项目。采用这种方式,您可以避免源代码中的硬编码项目,对于每种语言单独创建资源文件而且不必修改和编译源代码。
有关应用程序韩文本地化的详细信息,请参阅如何在模拟器和手持设备上显示韩文字符? FAQ。
(11)如何在模拟器和手持设备上显示韩文字符?
在当前可用的韩文 BREW 手持设备上,始终将语言设置为韩文,字体是 KSC5601。您可以使用以下步骤进行更改。
设置模拟器上显示的语言和字体
运行 BREW Device Configurator,然后打开所用设备的 QSC 文件(File(文件)> Open(打开))。
单击“型号”字段右侧的“详细资料”按钮,显示“设备属性”对话框。
根据您使用的 BREW SDK 版本,进入下面几部分之一,完成相应步骤。
BREW SDK 1.0:
执行以下操作之一:
对于韩文 KSC5601,从“语言”下拉列表中选择“韩文”。
对于韩文 Unicode,从“语言”下拉列表中选择“韩文”或“英文”。
在“正常字体”和“大字体”字段中,单击“设置”,选择希望使用的韩文字体和磅值。
单击“确定”。
BREW SDK 1,1:
单击“语言和字体”选项卡。
执行以下操作之一:
对于韩文 KSC5601,从“语言”下拉列表中选择“韩文”,从“编码”下拉列表中选择“KSC5601”。
对于韩文 Unicode,从“语言”下拉列表中选择“韩文”或“英文”,从“编码”下拉列表总选择“Unicode”。
在“正常字体”和“大字体”字段中,单击“设置”,选择希望使用的韩文字体和磅值。
单击“确定”。
在手持设备上显示文本
您需要使用 IDISPLAY_DrawText() 和 AEEChar 字符串。下面的步骤说明了需要在 BREW 资源编辑器和 C/C++ 源代码中作出哪些更改,才能使用 KSC5601 和Unicode 格式创建 AECHAR 字符串。
使用 KSC5601 格式显示韩文字符串
启动 BREW 资源编辑器。
右键单击“字符串”图标,选择“新建字符串”。“字符串资源”对话框打开。
在“资源名称”字段中,键入一个 ID,如 IDS_STRING_KSC。
从“字符串格式”下拉列表中,选择“KSC5601”。
在“值”字段中,键入韩文文本字符串。
单击“确定”。
在 C/C++ 源代码中作以下更改:
使用 ISHELL_LoadResString 加载字符串。
**示例代码**
AECHAR szBuf[30] = {0};
ISHELL_LoadResString(pMe->a.m_pIShell, APP_RES_FILE,
IDS_STRING_KSC, szBuf, sizeof(szBuf));
IDISPLAY_DrawText(pMe->a.m_pIDisplay, AEE_FONT_NORMAL,
szBuf, -1, pMe->m_cxWidth/5, pMe->m_cyHeight/8, 0, 0);
用 KSC5601 代码输入正常字符(无符号字符)串。
使用 STR_EXPAND() 将正常字符串转换为 AEEChar 字符串。
**示例代码**
AECHAR szBuf[30] ;
const unsigned char szhello[] ="";
STREXPAND(szhello,10,szBuf,30);
IDISPLAY_DrawText(pMe->m_pIDisplay, AEE_FONT_BOLD,
(AECHAR *) szBuf, -1, 0, 0, 0, IDF_ALIGN_CENTER |
IDF_ALIGN_MIDDLE);
使用 Unicode 格式显示韩文字符串
启动 BREW 资源编辑器。
右键单击“字符串”图标,选择“新建字符串”。“字符串资源”对话框打开。
在“资源名称”字段中,键入一个 ID,如 IDS_STRING_UNI。
从“字符串格式”下拉列表中,选择“Unicode”。
在“值”字段中,键入韩文文本字符串。
单击“确定”。
在 C/C++ 源代码中作以下更改:
使用 ISHELL_LoadResString 加载字符串。
**示例代码**
AECHAR szBuf[30] = {0};
ISHELL_LoadResString(pMe->a.m_pIShell, APP_RES_FILE,
IDS_STRING_UNI,szBuf, sizeof (szBuf));
IDISPLAY_DrawText(pMe->a.m_pIDisplay, AEE_FONT_NORMAL,
szBuf, -1, pMe->m_cxWidth/5, pMe->m_cyHeight/8, 0, 0);
用韩文 Unicode 输入 AEEChar 字符串。需要输入正确的 Unicode,因为韩文 Windows 使用 KSC5601 进行韩文文本输入。 或者使用KSC5601 到 Unicode 转换将 [KSC5601 code Korean character (unsigned char) string] 转换为 [Unicode Korean AEEChar string]。因为此方法要求BREW 手持设备的内存过多,所以不推荐采用此方法。
**示例代码**
AECHAR szBuf[30] ;
const unsigned char szhello[] ="";
STREXPAND(szhello,10,szBuf,30);
IDISPLAY_DrawText(pMe->m_pIDisplay, AEE_FONT_BOLD,
(AECHAR *) szBuf, -1, 0, 0, 0, IDF_ALIGN_CENTER |
IDF_ALIGN_MIDDLE);
**STREXPAND() 示例代码**
void STREXPAND(const byte * pSrc, int nCount,
AECHAR * pDest, int nSize)
参数:
pSrc 以 Null 结尾的源字符串
nLen 源字符串的长度(字符)
pDest 指向目标缓冲区的指针
nSize 目标缓冲区的大小(字节)
(13)如何在 BREW 中生成随机数?
GET_RAND() 使用当前 CDMA 时间作为随机数元数据。 它确保每次调用 GET_RAND() 时都会生成唯一的随机数序列。