騰訊優測優分享乾貨精選| 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開發過程中使用到系統數據庫的時候,可能也會遇到類似的適配問題。這時,也可以使用類似的方式處理。


文/騰訊優測 李豔超


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章