《BREW进阶与精通——3G移动增值业务的运营、定制与开发》连载之86——不同品牌BREW手机间的应用移植

简介: 版权声明:本文为半吊子子全栈工匠(wireless_com,同公众号)原创文章,未经允许不得转载。
版权声明:本文为半吊子子全栈工匠(wireless_com,同公众号)原创文章,未经允许不得转载。 https://blog.csdn.net/wireless_com/article/details/5981424

一个应用在不同类型BREW 手机上的移植主要是处理手机之间的差异性,这里的差异性包括硬件差异性和软件差异性。硬件差异性是指手机自身的内存和存储空间大小,屏幕尺寸和色深,键盘布局以及手机中的特殊硬件的支持(如照相机,游戏手柄等)。软件差异性包括BREW的版本,手机软件编译器的版本,一些多媒体编解码器的异同,以及对某些BREW API是否支持等等。由此可见,了解运营商所制定的手机相关规范对移植BREW应用是非常有益的。

            针对手机的硬件差异性,为了减少应用移植中的工作,可以在应用中采用自适应的方法。每个手机都有各自的类型标识——平台标识,如果应用自身根据平台标识以及相应硬件信息动态加载相应的资源,无疑可以实现某些应用的零工作量移植。获得手机平台标识和相关硬件信息的方式之一是使用ISHELL_GetDeviceInfo()ISHELL_GetDeviceInfoEx()

            ISHELL_GetDeviceInfo()可以在 AEE层中查询有关手机性能的信息,例如所支持的 RAM 总量、屏幕显示等其它项目。要获取 AEEDeviceInfo结构中的 dwNetLinger dwSleepDefer值,在调用此函数之前,wStructSize 必须等于sizeof(AEEDeviceInfo)。其中AEEDeviceInfo是这样一个数据结构:

typedef struct

{

   uint16            cxScreen;         // 实际屏幕大小 (像素)

   uint16            cyScreen;         // 实际屏幕大小 (像素)

   uint16            cxAltScreen;      // 第二显示屏幕的屏幕大小

   uint16            cyAltScreen;      // 第二显示屏幕的屏幕大小

   uint16            cxScrollBar;      // 标准滚动条的宽度

   uint16            wEncoding;        // 字符集编码 (AEE_ENC_UNICODE, ....)

   uint16            wMenuTextScroll;  // 应该用于自动滚动的毫秒

   uint16            nColorDepth;      // 色深 (1表示黑色,2表示灰色等)

   EmptyEnum         unused2;

   uint32            wMenuImageDelay;  // 应该用于影像延迟的毫秒

   uint32            dwRAM;            // 已安装的 RAM 总量 (RAM)

   flg               bAltDisplay:1;    // 设备具有备选显示屏幕 (寻呼机)

   flg               bFlip:1;          // 设备为翻盖电话

   flg               bVibrator:1;      // 安装了振动器

   flg               bExtSpeaker:1;    // 安装了外部扬声器

   flg               bVR:1;            // V支持语音识别

   flg               bPosLoc:1;        // 支持定位

   flg               bMIDI:1;          // 支持 MIDI 文件格式

   flg               bCMX:1;           // 支持 CMX 音频

   uint32            dwPromptProps;    // 默认提示属性

   uint16            wKeyCloseApp;     // 关闭当前应用的按键

   uint16            wKeyCloseAllApps; // 关闭所有应用的按键 (默认为 AVK_END)

   uint32            dwLang;           // Resource Loader 使用 (见下方的 AEE_LNG_XXX)

   //

   // 注:要使用以下各字段,必须先将结构的

   // wStructSize 填用才能将其传送到 GetDeviceInfo调用

   //

   uint16            wStructSize;      // 该结构的大小1

   uint32            dwNetLinger;      // PPP 振铃定时器 (毫秒)

   uint32            dwSleepDefer;     // 激活的非睡眠模式 (毫秒)

   uint16            wMaxPath;         // 文件路径最大长度

   uint32            dwPlatformID;     // 平台 ID

} AEEDeviceInfo;

            ISHELL_GetDeviceInfoEx()用于获取有关设备的特定信息(AEEDeviceItem。此函数使用 ID 指定所需的信息,返回时在缓冲区中包含对应的信息。这些ID所表示的含义如表15-2所示。

ID的名称

含义说明

AEE_DEVICEITEM_CHIP_ID

标识芯片组 ID 的字符串

AEE_DEVICEITEM_MOBILE_ID

标识手持设备的移动 ID 的一个 ASCII 字符串

AEE_DEVICEITEM_AMR_VOCODER_SUPPORT

是否支持 AMR (Adaptive Multi-Rate) 声码器

AEE_DEVICEITEM_EVRC_VOCODER_SUPPORT

是否支持 EVRC(增强型变速率编码)声码器

AEE_DEVICEITEM_IS96_VOCODER_SUPPORT

否支持 QCELP-IS96(8K)Qualcomm 码激励线性预测编码)声码器

AEE_DEVICEITEM_IS96A_VOCODER_SUPPORT

否支持 QCELP-IS96A(8K)Qualcomm 码激励线性预测编码)声码器

AEE_DEVICEITEM_IS733_VOCODER_SUPPORT

是否支持 QCELP-IS733Qualcomm 码激励线性预测编码)声码器

AEE_DEVICEITEM_SMV_VOCODER_SUPPORT

是否支持可选择模式的声码器

AEE_DEVICEITEM_SYS_COLORS_DISP1 AEE_DEVICEITEM_SYS_COLORS_DISP2 AEE_DEVICEITEM_SYS_COLORS_DISP3 AEE_DEVICEITEM_SYS_COLORS_DISP4

返回与特定显示屏幕关联的系统颜色列表

AEE_DEVICEITEM_DISPINFO1 AEE_DEVICEITEM_DISPINFO2 AEE_DEVICEITEM_DISPINFO3 AEE_DEVICEITEM_DISPINFO4

返回特定显示屏幕的相关信息

AEE_DEVICEITEM_CARRIER_ID

标识手持设备的运营商 ID 的一个 uint32

AEE_DEVICEITEM_SIDHASH

返回手持设备的支付帐户的一个散列。 可用于确定是否已更换了支付帐户,例如在调换了 RUIM 卡时。 请注意,不会返回具体的帐号,而只是返回一个帐户字符串的散列。

AEE_DEVICESTATE_KEYS_PRESSED

返回处于按下状态的按键的值

AEE_DEVICESTATE_FLIP_OPEN

在设备翻盖处于打开状态时返回 TRUE,否则返回 FALSE

AEE_DEVICESTATE_HEADPHONE_ON

如果设备耳机是打开的,返回 TRUE,否则返回 FALSE

AEE_DEVICESTATE_KEYGUARD_ON

如果设备的键盘是打开,将返回 TRUE,否则返回 FALSE

AEE_DEVICESTATE_SPEAKER_ON

如果设备的扬声器为打开则返回 TRUE,否则返回 FALSE

AEE_DEVICEITEM_USER

OEM 定义项目的起始点

15-2:可以用ISHELL_GetDeviceInfoEx()获取的有关设备的特定信息

根据AEEDeviceInfoAEEDeviceItem中的信息,应用可以做到动态加载资源文件。当然这些资源信息也可以保存在服务器上,应用程序通过网络通信的方式获得这些资源数据,从而完成一个应用在不同手机上的适配。

如果某些手机不支持某些接口,应用程序可以通过判断该接口是否创建成功获得该信息。例如在内存没有问题的情况下,创建IPosDet接口失败,很可能是由于该手机不支持定位功能造成的。这时,应用程序就应该不提供定位功能,从而成为只具备浏览查询功能的一个LBS应用。

如果是两台手机对同一接口的功能存在差异(一般出现在IRingerMgr或者IAddrBook),这时需要应用程序多做一些工作。例如采用一个配置文件来定义地址簿或者铃声目录中的域,应用程序在启动时根据手机信息来读取配置文件,这样就能够进一步弥补手机间的差异进而很好的实现移植了。

目录
相关文章
|
机器学习/深度学习 存储 人工智能
MNN-LLM App:在手机上离线运行大模型,阿里巴巴开源基于 MNN-LLM 框架开发的手机 AI 助手应用
MNN-LLM App 是阿里巴巴基于 MNN-LLM 框架开发的 Android 应用,支持多模态交互、多种主流模型选择、离线运行及性能优化。
13388 81
MNN-LLM App:在手机上离线运行大模型,阿里巴巴开源基于 MNN-LLM 框架开发的手机 AI 助手应用
|
存储 算法 API
【01】整体试验思路,如何在有UID的情况下获得用户手机号信息,python开发之理论研究试验,如何通过抖音视频下方的用户的UID获得抖音用户的手机号-本系列文章仅供学习研究-禁止用于任何商业用途-仅供学习交流-优雅草卓伊凡
【01】整体试验思路,如何在有UID的情况下获得用户手机号信息,python开发之理论研究试验,如何通过抖音视频下方的用户的UID获得抖音用户的手机号-本系列文章仅供学习研究-禁止用于任何商业用途-仅供学习交流-优雅草卓伊凡
2810 82
|
存储 人工智能 编译器
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
980 11
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
|
存储 API 数据安全/隐私保护
【02】整体试验思路,在这之前我们发现sec_uid,sec_uid是什么和uid的关系又是什么?相互如何转换?python开发之理论研究试验,如何通过抖音视频下方的用户的UID获得抖音用户的手机号-本系列文章仅供学习研究-禁止用于任何商业用途-仅供学习交流-优雅草卓伊凡
【02】整体试验思路,在这之前我们发现sec_uid,sec_uid是什么和uid的关系又是什么?相互如何转换?python开发之理论研究试验,如何通过抖音视频下方的用户的UID获得抖音用户的手机号-本系列文章仅供学习研究-禁止用于任何商业用途-仅供学习交流-优雅草卓伊凡
2280 6
|
缓存 前端开发 IDE
【06】flutter完成注册页面-密码登录-手机短信验证-找回密码相关页面-并且实现静态跳转打包demo做演示-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【06】flutter完成注册页面-密码登录-手机短信验证-找回密码相关页面-并且实现静态跳转打包demo做演示-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
475 0
【06】flutter完成注册页面-密码登录-手机短信验证-找回密码相关页面-并且实现静态跳转打包demo做演示-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
移动开发 Android开发 数据安全/隐私保护
移动应用与系统的技术演进:从开发到操作系统的全景解析随着智能手机和平板电脑的普及,移动应用(App)已成为人们日常生活中不可或缺的一部分。无论是社交、娱乐、购物还是办公,移动应用都扮演着重要的角色。而支撑这些应用运行的,正是功能强大且复杂的移动操作系统。本文将深入探讨移动应用的开发过程及其背后的操作系统机制,揭示这一领域的技术演进。
本文旨在提供关于移动应用与系统技术的全面概述,涵盖移动应用的开发生命周期、主要移动操作系统的特点以及它们之间的竞争关系。我们将探讨如何高效地开发移动应用,并分析iOS和Android两大主流操作系统的技术优势与局限。同时,本文还将讨论跨平台解决方案的兴起及其对移动开发领域的影响。通过这篇技术性文章,读者将获得对移动应用开发及操作系统深层理解的钥匙。
590 12
|
Web App开发 Android开发
FFmpeg开发笔记(四十六)利用SRT协议构建手机APP的直播Demo
实时数据传输在互联网中至关重要,不仅支持即时通讯如QQ、微信的文字与图片传输,还包括音视频通信。一对一通信常采用WebRTC技术,如《Android Studio开发实战》中的App集成示例;而一对多的在线直播则需部署独立的流媒体服务器,使用如SRT等协议。SRT因其优越的直播质量正逐渐成为主流。本文档概述了SRT协议的使用,包括通过OBS Studio和SRT Streamer进行SRT直播推流的方法,并展示了推流与拉流的成功实例。更多细节参见《FFmpeg开发实战》一书。
1131 1
FFmpeg开发笔记(四十六)利用SRT协议构建手机APP的直播Demo
|
小程序 JavaScript API
微信小程序开发之:保存图片到手机,使用uni-app 开发小程序;还有微信原生保存图片到手机
这篇文章介绍了如何在uni-app和微信小程序中实现将图片保存到用户手机相册的功能。
3939 0
微信小程序开发之:保存图片到手机,使用uni-app 开发小程序;还有微信原生保存图片到手机
|
存储 移动开发 Android开发
使用kotlin Jetpack Compose框架开发安卓app, webview中h5如何访问手机存储上传文件
在Kotlin和Jetpack Compose中,集成WebView以支持HTML5页面访问手机存储及上传音频文件涉及关键步骤:1) 添加`READ_EXTERNAL_STORAGE`和`WRITE_EXTERNAL_STORAGE`权限,考虑Android 11的分区存储;2) 配置WebView允许JavaScript和文件访问,启用`javaScriptEnabled`、`allowFileAccess`等设置;3) HTML5页面使用`<input type="file">`让用户选择文件,利用File API;
|
前端开发 小程序
【微信小程序-原生开发】实用教程20 - 生成海报(实战范例为生成活动海报,内含生成指定页面的小程序二维码,保存图片到手机,canvas 系列教程)
【微信小程序-原生开发】实用教程20 - 生成海报(实战范例为生成活动海报,内含生成指定页面的小程序二维码,保存图片到手机,canvas 系列教程)
1150 0

热门文章

最新文章