騰訊優測是專業的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開發過程中使用到系統數據庫的時候,可能也會遇到類似的適配問題。這時,也可以使用類似的方式處理。
文/騰訊優測 李豔超