关键词:腾讯优测,数据库适配,双卡适配,移动研发,android 适配

许多 APP 都希望获取用户通讯录联系人,利用通讯录关系链信息来丰富产品功能。在读取系统联系人数据库的 ContentProvider 时,对于双卡双待手机,电话和短信数据都需要标识来自哪张卡。
Android 5.0 开始加入 Dual Sim 支持,Android 官方方案和 mtk 的方案十分类似,感兴趣的小伙伴可以直接移步 mtk 方案实现方式。

双卡数据库适配流程

根据系统 ContentProvider 数据内容来做适配开发,找到区分双卡的标识字段和字段对应的值。为了以下阐述内容清晰,这里约定:主卡—0 卡,副卡—1 卡。
主要涉及的数据库表有两个:短信彩信、电话。

1.清空数据库

如果手机安装了安全软件有可能” 污染 “数据库数据,清空数据库中的数据可以保证以下操作的准确性。

2.使用系统短信程序和拨号程序分别使用 1 卡、2 卡发送短信,拨打电话

保证使用的是系统短信和拨号程序,第三方 APP 会接管系统程序,开始操作前需卸载第三方 APP。

3.读取数据库值,找到区分卡槽的值

对于可以 root 的手机,可以直接找到对应的数据库文件,导出后使用 SQLite 查看器来查询数据库中的值。
短信、彩信数据库位置:
/data/data/com.android.providers.telephony/mmssms.db
电话数据库位置:
data/data/data/com.android.providers.contacts/contacts2.db

注意:对应的.db-wal、.db-shm 文件也需要导出,SQLite 引入了日志预写模式(WAL),如果不导出这两个文件,数据更新不及时。

双卡数据库适配常见类型都有哪些?
1.新增标识字段

常见于:三星、moto 等
举例:手机的短信数据库

通过上图,我们可以知道短信数据库表中:
标识双卡的字段名:sim_id,字段的值:卡 0—-0 || 卡 1—-1
这种情况相对简单,在做短信、电话相关的 APP 只需要:
(1)确定对应的卡槽
(2)需要数据库操作时,增加一列对于双卡标识字段的操作

2.mtk 系列芯片新增 siminfo 表

常见于 mtk 系列芯片的手机
现象:
按照 1 中的方法找到了区分卡槽的字段和值,发现当用户换卡时,标识字段对应的值会随着变化,每换一张新卡,对应的 simId 值 +1。
问题原因:
如下图所显示,这类手机新建了一张表,用来记录 SIM 卡的信息。对应的 uri 为:Uri uri = Uri.parse(“content://telephony/siminfo”);
解释:
slot 字段值为 0:主卡
slot 字段值为 1:副卡
slot 字段值为-1:此卡没有安装在卡槽

如下图,sms 表和 siminfo 表的映射关系。sms 表中的 simId 字段存储的是 siminfo 表中对应的_id,siminfo 中对应的 0,1 是卡槽的标识。
注意:siminfo 表是系统维护的,第三方 APP 只需读取,不需要进行 “写” 操作。

解决办法:
(1)确立映射关系
在一定的触发时机(应用启动,监听 iteminfo 数据库信息变化),触发 iteminfo 表的查询,将查询结果建立成映射关系。
0—-4
1—-3
(2)需要操作时根据卡槽获得映射值写入 db

mtk 在双卡双待方面的积累是很深厚长久的,在功能机时代就有非常广泛的应用。那么为什么还要如此麻烦的新建一张表来做这个映射呢?为什么不使用方案 1 简单的处理呢?

场景:
使用 1 中数据库新增字段的方法,对于 WCDMA 联通定制机(同时 G 卡制式),如果用户将两张卡对调位置,将会发生什么情况?
在方案 1 中,所有的信息直接和 sms 表中的双卡标识字段绑定,如果换卡的话将无法判断信息来自那个 SIM 卡,在上述的场景发生时,用户所有的信息和 SIM 卡发生混乱。
在方案 2 中,因为 sms 和 siminfo 存在映射关系,siminfo 表中的 icc_id 可以唯一标识一张 SIM 卡,不会发生方案 1 中出现的换卡可能造成的信息错乱问题。
思考总结:
方案 2 的存在是合理的,因为方案 1 同时存在缺陷。

3. coolpad 系列手机新增 iteminfo 表

常见于:酷派系列手机
特殊点:root 没有成功,无法查看 data/data 目录下内容
电话数据库适配:
使用查询数据库的工具

清空 db 后操作:使用 0、1 卡分别向 5520 拨打电话,使用 0 卡向 10010 拨打电话。通过记录的查询结果可知,电话标识字段为 moduletype,字段对应的值为 0—–1 || 1——2
短信数据库适配:
清空 db 后向 5520 发送 4 条短信,见下图:

当使用查询工具查询结果时,会出现下图的情况,其中 sim_id 通常在方案 1 中作为双卡标识的字段,但是在这款手机上值均为-1。(可以注意到 iteminfo 字段中的值时累加的 1、2、3、4)

查询 iteminfo 数据库表的结果:Uri.parse(“content://mms-sms/itemInfo”);

## 数据库表关联关系:

适配方法:
(1)每次在 sms 表插入一条数据,iteminfo 会对应的增加一条记录,这个是由系统 provider 自动完成的。
(2)需要更新 iteminfo 中的数据中的 network_type 字段值来标识卡槽。
总结:
不仅系统联系人需要数据库适配,当 APP 开发过程中使用到系统数据库的时候,可能也会遇到类似的适配问题。这时,也可以使用类似的方式处理。

文/腾讯优测 李艳超


↙↙↙阅读原文可查看相关链接,并与作者交流