腾讯优测干货精选|Android双卡双待适配——隐藏在数据库中的那些秘密
腾讯优测是专业的app自动化测试平台,除了提供兼容性测试,远程真机租用等多维度的测试服务,还有优分享-腾讯内部的移动研发测试干货精选~
许多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开发过程中使用到系统数据库的时候,可能也会遇到类似的适配问题。这时,也可以使用类似的方式处理。
文/腾讯优测 李艳超
腾讯优测干货精选|Android双卡双待适配——隐藏在数据库中的那些秘密的更多相关文章
- 腾讯优测干货精选| 安卓开发新技能Get -常用必备小工具汇总
文/腾讯公司 陈江峰 优测小优有话说: 移动研发及测试干货哪里找?腾讯优测-优社区你值得拥有~ 开发同学们都知道,安卓开发路上会碰到很多艰难险阻,一不小心就被KO.这时候,没有新技能傍身怎么行?今天我 ...
- 腾讯优测-优社区干货精选 | android开发在路上:少去踩坑,多走捷径(下)
文/腾讯公司 陈江峰 优测小优有话说: android开发的坑自然是不少,不想掉坑快来优测优社区~ 6.Android APP开发中其它需要提醒的问题 android4.4在UI线程无法进行网络操作. ...
- 【腾讯优测干货分享】Android 相机预览方向及其适配探索
本文来自于腾讯bugly开发者社区,未经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/583ba1df25d735cd2797004d 由于Android系统的开放策略 ...
- 【腾讯优测干货】看腾讯的技术大牛如何将Crash率从2.2%降至0.2%?
小优有话说: App Crash就像地雷. 你怕它,想当它不存在.无异于让你的用户去探雷,一旦引爆,用户就没了. 你鼓起勇气去扫雷,它却神龙见首不见尾. 你告诫自己一定开发过程中减少crash,少埋点 ...
- 【腾讯优测干货分享】安卓专项测试之GPU测试探索
本文来自于Dev Club 开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57c7ffdc0569a1191bce8a63 作者:章未哲——腾讯SNG质 ...
- 【腾讯优测干货分享】如何降低App的待机内存(四)——进阶:内存原理
本文来自于腾讯优测公众号(wxutest),未经作者同意,请勿转载,原文地址:http://mp.weixin.qq.com/s/3FTPFvZRqyAQnU047kmWJQ 1.4进阶:内存原理 在 ...
- 【腾讯优测干货分享】如何降低App的待机内存(三)——探索内存增长的原因
本文来自于腾讯优测公众号(wxutest),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/8BiKIt3frq9Yv9KV5FXlGw 1.3新问题的进一步挖 ...
- 【腾讯优测干货分享】如何降低App的待机内存(二)——规范测试流程及常见问题
本文来自于腾讯优测公众号(wxutest),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/806TiugiSJvFI7fH6eVA5w 作者:腾讯TMQ专项测 ...
- 【腾讯优测干货分享】越用越卡为哪般——如何降低App的待机内存(一)
本文来自于腾讯优测公众号(wxutest),未经作者同意,请勿转载,原文地址:http://mp.weixin.qq.com/s/1_FKMbi1enpcKMqto-o_FQ 作者:腾讯TMQ专项测试 ...
随机推荐
- 备用帖子1Shell(Shell R语言)
shell========================== echo 1 > /proc/sys/vm/drop_caches 清理内存 free -m du -h --max-depth= ...
- JQ写简单的伸缩菜单(内附效果图和源代码)
效果如图: JQ代码就那么几句, <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "h ...
- ~是什么意思 在C语言中,~0代表什么
是c语言中的位运算符:取反.0在内存中的存储方式是所有位为0,0000000000000000那么按位取反后位16个1(如果整形在你的机器上站16位),那么表示的数为-1.
- Android 自定义波浪动画 --"让进度浪起来~"
原文链接:http://www.jianshu.com/p/0e25a10cb9f5 一款效果不错的动画,实现也挺简单的,推荐阅读学习~ -- 由 傻小孩b 分享 waveview <Andro ...
- DEV GridControl TableView隔行换色/奇偶行换色
GridControl中的TableView“奇偶行换色”这件事情纠结了我好几天,虽然已经是上个月的事情,好歹记录一下吧,万一有谁要用到呢. GridControl是长这个样子的, <dxg:G ...
- WPF:ListView 分页
布局MainWindow.xaml <ListView Name="list_Reg" ItemsSource="{Binding Source={StaticRe ...
- 安装Composer 步骤
Composer 是 PHP 的一个依赖管理工具.它允许你申明项目所依赖的代码库,它会在你的项目中为你安装他们.Composer 不是一个包管理器.是的,它涉及 "package ...
- JavaScipt 源码解析 回调函数
函数是第一类对象,这是javascript中的一个重要的概念,意味着函数可以像对象一样按照第一类管理被使用,所以在javascript中的函数: 能"存储"在变量中,能作为函数的实 ...
- 求解,ASP.Net MVC Redirect 无法跳转问题
①JS代码 $.post("/Home/CheckLogin", { "username": $("#username").val(), & ...
- HDU 1231:最大连续子序列 解题报告
第一次写博客, 自己总结写出了一道题感觉值得保存. 自己总结的规律:求最大连续子序列, 可以先求包括第N项在内的前N项最大值, (因为每一项都求过后, 前N项最大值最大的那一个元素所连续的序列即为最大 ...