騰訊優測是專業的app自動化測試平臺,除了提供兼容性測試,遠程真機租用等多維度的測試服務,還有優分享-騰訊內部的移動研發測試乾貨精選~android
許多APP都但願獲取用戶通信錄聯繫人,利用通信錄關係鏈信息來豐富產品功能。在讀取系統聯繫人數據庫的ContentProvider時,對於雙卡雙待手機,電話和短信數據都須要標識來自哪張卡。
Android 5.0開始加入Dual Sim支持,Android 官方方案和mtk的方案十分相似,感興趣的小夥伴能夠直接移步mtk方案實現方式。數據庫
根據系統ContentProvider數據內容來作適配開發,找到區分雙卡的標識字段和字段對應的值。爲了如下闡述內容清晰,這裏約定:主卡—0卡,副卡—1卡。
主要涉及的數據庫表有兩個:短信彩信、電話。安全
若是手機安裝了安全軟件有可能」污染「數據庫數據,清空數據庫中的數據能夠保證如下操做的準確性。app
保證使用的是系統短信和撥號程序,第三方APP會接管系統程序,開始操做前需卸載第三方APP。ide
對於能夠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),若是不導出這兩個文件,數據更新不及時。測試
常見於:三星、moto等
舉例:手機的短信數據庫spa
經過上圖,咱們能夠知道短信數據庫表中:
標識雙卡的字段名:sim_id,字段的值:卡0—-0 || 卡1—-1
這種狀況相對簡單,在作短信、電話相關的APP只須要:
(1)肯定對應的卡槽
(2)須要數據庫操做時,增長一列對於雙卡標識字段的操做.net
常見於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同時存在缺陷。
常見於:酷派系列手機
特殊點:root沒有成功,沒法查看data/data目錄下內容
電話數據庫適配:
使用查詢數據庫的工具
清空db後操做:使用0、1卡分別向5520撥打電話,使用0卡向10010撥打電話。經過記錄的查詢結果可知,電話標識字段爲moduletype,字段對應的值爲0—–1 || 1——2
短信數據庫適配:
清空db後向5520發送4條短信,見下圖:
當使用查詢工具查詢結果時,會出現下圖的狀況,其中sim_id一般在方案1中做爲雙卡標識的字段,可是在這款手機上值均爲-1。(能夠注意到iteminfo字段中的值時累加的一、二、三、4)
查詢iteminfo數據庫表的結果:Uri.parse(「content://mms-sms/itemInfo」);
適配方法:
(1)每次在sms表插入一條數據,iteminfo會對應的增長一條記錄,這個是由系統provider自動完成的。
(2)須要更新iteminfo中的數據中的network_type字段值來標識卡槽。
總結:
不只系統聯繫人須要數據庫適配,當APP開發過程當中使用到系統數據庫的時候,可能也會遇到相似的適配問題。這時,也可使用相似的方式處理。
文/騰訊優測 李豔超