Android双卡双适配——隐藏在数据库中的那些秘密.docVIP

Android双卡双适配——隐藏在数据库中的那些秘密.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Android双卡双适配——隐藏在数据库中的那些秘密

Android双卡双待适配——隐藏在数据库中的那些秘密 文/腾讯优测 李艳超 虽然crash问题会困扰很多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/viders.telephony/mmssms.db 电话数据库位置: data/data/data/viders.contacts/contacts2.db 注意:对应的.db-wal、.db-shm文件也需要导出,SQLite引入了日志预写模式(WAL),如果不导出这两个文件,数据更新不及时。 双卡数据库适配常见类型都有哪些? 1.新增标识字段 常见于:三星、moto等 举例:手机的短信数据库 INCLUDEPICTURE \d /mmbiz/kn3fIZB16Mq6XuvHtkQBdIgYUOhEuhuicMqcyAJm2SeLLod2LCf9yde0Ln68MN1jg1Vf4pEUsBpFZu6eicYB3OWQ/640?wx_fmt=pngtp=webpwxfrom=5wx_lazy=1 \* MERGEFORMATINET  通过上图,我们可以知道短信数据库表中: 标识双卡的字段名: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 ContentValues values = new ContentValues(); ?//......其他字段填充..... values.put(双卡标识字段列名, 卡槽对应的映射值); mtk在双卡双待方面的积累是很深厚长久的,在功能机时代就有非常广泛的应用。那么为什么还要如此麻烦的新建一张表来做这个映射呢?为什么不使用方案1 简单的处理呢? 场景: 使用1中数据库新增字段的方法,对于WCDMA联通定制机(同时G卡制式),如果用户将两张卡对调位置,将会发生什么情况? 在方案1中,所有的信息直接和sms表中的双卡标识字段绑定,如果换卡的话将无法判断信息来自那个SIM卡,在上述的场景发生时,用户所有的信息和SIM卡发生混乱。 在方案2中,因为sms和siminfo存在映射关系,siminfo表中的icc_id可以唯一标识一张SIM卡,不会发生方案1中出现的换卡可能造成的信息错乱问题。 思考总结: 方案2的存在是合理的,因为方案1同时存在缺陷。 腾

文档评论(0)

xciqshic + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档