目标:一个短信apk可以安装在多平台上。
适配层设计
谷歌的标准接口
frameworks/opt/telephony/src/java/android/provider目录下
Telephony.Sms; 用来保存短信到uri或收件箱,草稿箱等,是把短信保存到数据库中。
frameworks/opt/telephony/src/java/android/telephony目录下
SmsManager; 用于发送短信,向SIM卡写短信,删短信,读取短信,
SmsMessage; 代表一条短信,可以获取一条短信的所有的东西。
frameworks/base/telephony/java/android/telephony 目录下
TelephonyManager;代表了telephony服务。获取SIM卡的信息等。
展讯扩展的接口
frameworks/base/core/java/android/sim 目录下
Sim 代表一张Sim卡,获取一张卡的各种信息。
SimManager 用来管理2张卡,id,名称,颜色,iccId等。
MTK扩展的接口
目录没找到,但用法知道。
SimInfoManager 用来管理SIM卡信息
SimInfoRecord
SmsManagerEx 用来发送双卡短信。
其他双卡平台也会扩展双卡接口,但代码应该是类似的。
适配层的设计
我们做的适配层不是适配所有短信接口,而是针对双卡扩展的部分。而对于谷歌的标准接口,则不作适配。对于双卡部分,也不是全部扩展,而是根据需要扩展。这样适配层的代码很简单,应用的改动也很少。
HqPlatform 用于获取平台信息
init() 初始化,用来确定是不是当前编译的平台。
HqSimManager 管理SIM卡信息
GetSimCount() 获取插入的SIM卡个数
GetSimIdBySlot()
GetNameBySlot()
GetSlotBySimId()
HqSmsManager 用于操作SIM卡的短信(发送,读取,保存,删除等)
sendMultipartTextMessage() 发送
divideMessage() 拆分
HqTelephony 短信数据库操作
HqTelephony.Sms.addMessageToUri() 把短信写入数据库
如何编译
把适配层编译成HqAdapterMTk.jar,HqAdapterSpread等jar包。
最初的想法是,一次编译,可以安装到所有的手机上使用。实际上做不到。因为MTK和展讯扩展的接口不一样,在MTK编译环境中,调用展讯扩展的接口,编译不过。
其他厂商也无法做到只编译一次。
小米系统安装在展讯,MTK手机上,都只支持单卡,说明小米系统只支持谷歌标准接口,没有对双卡做适配。
乐蛙需要做一个适配层,这个适配层对于每个平台都不同,才可以支持双卡。适配层需要单独编译。
方法是:在MTK环境编译,编译出来的apk安装在MTK平台上可以使用双卡,安装在其他平台上,使用谷歌标准接口,只支持单卡。在展讯平台也是一样。
需要解决的问题
使用MTK环境下编译的apk,如果放到其他平台运行,会因为找不到一些类,而导致程序异常终止,所以需要判断当前运行的平台。
获取平台的方法:调用这个接口
SimInfoManager.getInsertedSimCount(),并catch异常,如果捕捉到java.lang.NoClassDefFoundError或ExceptionInInitializerError,则说明不是MTK平台,只能调用谷歌标准接口。
调试结果
MTK平台上编译出来的apk,在MTK平台上测试了没卡,单卡,双卡,均能正常收发短信。而在其他平台上,只能调用默认的那张卡来收发短信。删除,转发,重发等操作都测试通过。
展讯平台编译出来的apk,也测试通过。
其他模块思考
联系人和拨号盘,使用同样的方法来扩展,应该没问题。
通话模块,语音通话部分可以同样扩展。谷歌没有开发视频通话部分,而是由各个厂商自己开发的。预计需要1-2周时间评估。
设置模块,需要进一步评估。