您好,登錄后才能下訂單哦!
騰訊優(yōu)測是專業(yè)的app自動化測試平臺,除了提供兼容性測試,遠(yuǎn)程真機(jī)租用等多維度的測試服務(wù),還有優(yōu)分享-騰訊內(nèi)部的移動研發(fā)測試干貨精選~
許多APP都希望獲取用戶通訊錄聯(lián)系人,利用通訊錄關(guān)系鏈信息來豐富產(chǎn)品功能。在讀取系統(tǒng)聯(lián)系人數(shù)據(jù)庫的ContentProvider時,對于雙卡雙待手機(jī),電話和短信數(shù)據(jù)都需要標(biāo)識來自哪張卡。
Android 5.0開始加入Dual Sim支持,Android 官方方案和mtk的方案十分類似,感興趣的小伙伴可以直接移步mtk方案實現(xiàn)方式。
根據(jù)系統(tǒng)ContentProvider數(shù)據(jù)內(nèi)容來做適配開發(fā),找到區(qū)分雙卡的標(biāo)識字段和字段對應(yīng)的值。為了以下闡述內(nèi)容清晰,這里約定:主卡—0卡,副卡—1卡。
主要涉及的數(shù)據(jù)庫表有兩個:短信彩信、電話。
1.清空數(shù)據(jù)庫
如果手機(jī)安裝了安全軟件有可能”污染“數(shù)據(jù)庫數(shù)據(jù),清空數(shù)據(jù)庫中的數(shù)據(jù)可以保證以下操作的準(zhǔn)確性。
2.使用系統(tǒng)短信程序和撥號程序分別使用1卡、2卡發(fā)送短信,撥打電話
保證使用的是系統(tǒng)短信和撥號程序,第三方APP會接管系統(tǒng)程序,開始操作前需卸載第三方APP。
3.讀取數(shù)據(jù)庫值,找到區(qū)分卡槽的值
對于可以root的手機(jī),可以直接找到對應(yīng)的數(shù)據(jù)庫文件,導(dǎo)出后使用SQLite查看器來查詢數(shù)據(jù)庫中的值。
短信、彩信數(shù)據(jù)庫位置:
/data/data/com.android.providers.telephony/mmssms.db
電話數(shù)據(jù)庫位置:
data/data/data/com.android.providers.contacts/contacts2.db
注意:對應(yīng)的.db-wal、.db-shm文件也需要導(dǎo)出,SQLite引入了日志預(yù)寫模式(WAL),如果不導(dǎo)出這兩個文件,數(shù)據(jù)更新不及時。
雙卡數(shù)據(jù)庫適配常見類型都有哪些?
1.新增標(biāo)識字段
常見于:三星、moto等
舉例:手機(jī)的短信數(shù)據(jù)庫
通過上圖,我們可以知道短信數(shù)據(jù)庫表中:
標(biāo)識雙卡的字段名:sim_id,字段的值:卡0—-0 || 卡1—-1
這種情況相對簡單,在做短信、電話相關(guān)的APP只需要:
(1)確定對應(yīng)的卡槽
(2)需要數(shù)據(jù)庫操作時,增加一列對于雙卡標(biāo)識字段的操作
2.mtk系列芯片新增siminfo表
常見于mtk系列芯片的手機(jī)
現(xiàn)象:
按照1中的方法找到了區(qū)分卡槽的字段和值,發(fā)現(xiàn)當(dāng)用戶換卡時,標(biāo)識字段對應(yīng)的值會隨著變化,每換一張新卡,對應(yīng)的simId值+1。
問題原因:
如下圖所顯示,這類手機(jī)新建了一張表,用來記錄SIM卡的信息。對應(yīng)的uri為:Uri uri = Uri.parse(“content://telephony/siminfo”);
解釋:
slot字段值為0:主卡
slot字段值為1:副卡
slot字段值為-1:此卡沒有安裝在卡槽
如下圖,sms表和siminfo表的映射關(guān)系。sms表中的simId字段存儲的是siminfo表中對應(yīng)的_id,siminfo中對應(yīng)的0,1是卡槽的標(biāo)識。
注意:siminfo表是系統(tǒng)維護(hù)的,第三方APP只需讀取,不需要進(jìn)行“寫”操作。
解決辦法:
(1)確立映射關(guān)系
在一定的觸發(fā)時機(jī)(應(yīng)用啟動,監(jiān)聽iteminfo數(shù)據(jù)庫信息變化),觸發(fā)iteminfo表的查詢,將查詢結(jié)果建立成映射關(guān)系。
0—-4
1—-3
(2)需要操作時根據(jù)卡槽獲得映射值寫入db
mtk在雙卡雙待方面的積累是很深厚長久的,在功能機(jī)時代就有非常廣泛的應(yīng)用。那么為什么還要如此麻煩的新建一張表來做這個映射呢?為什么不使用方案1 簡單的處理呢?
場景:
使用1中數(shù)據(jù)庫新增字段的方法,對于WCDMA聯(lián)通定制機(jī)(同時G卡制式),如果用戶將兩張卡對調(diào)位置,將會發(fā)生什么情況?
在方案1中,所有的信息直接和sms表中的雙卡標(biāo)識字段綁定,如果換卡的話將無法判斷信息來自那個SIM卡,在上述的場景發(fā)生時,用戶所有的信息和SIM卡發(fā)生混亂。
在方案2中,因為sms和siminfo存在映射關(guān)系,siminfo表中的icc_id可以唯一標(biāo)識一張SIM卡,不會發(fā)生方案1中出現(xiàn)的換卡可能造成的信息錯亂問題。
思考總結(jié):
方案2的存在是合理的,因為方案1同時存在缺陷。
3. coolpad系列手機(jī)新增iteminfo表
常見于:酷派系列手機(jī)
特殊點(diǎn):root沒有成功,無法查看data/data目錄下內(nèi)容
電話數(shù)據(jù)庫適配:
使用查詢數(shù)據(jù)庫的工具
清空db后操作:使用0、1卡分別向5520撥打電話,使用0卡向10010撥打電話。通過記錄的查詢結(jié)果可知,電話標(biāo)識字段為moduletype,字段對應(yīng)的值為0—–1 || 1——2
短信數(shù)據(jù)庫適配:
清空db后向5520發(fā)送4條短信,見下圖:
當(dāng)使用查詢工具查詢結(jié)果時,會出現(xiàn)下圖的情況,其中sim_id通常在方案1中作為雙卡標(biāo)識的字段,但是在這款手機(jī)上值均為-1。(可以注意到iteminfo字段中的值時累加的1、2、3、4)
查詢iteminfo數(shù)據(jù)庫表的結(jié)果:Uri.parse(“content://mms-sms/itemInfo”);
數(shù)據(jù)庫表關(guān)聯(lián)關(guān)系:
適配方法:
(1)每次在sms表插入一條數(shù)據(jù),iteminfo會對應(yīng)的增加一條記錄,這個是由系統(tǒng)provider自動完成的。
(2)需要更新iteminfo中的數(shù)據(jù)中的network_type字段值來標(biāo)識卡槽。
總結(jié):
不僅系統(tǒng)聯(lián)系人需要數(shù)據(jù)庫適配,當(dāng)APP開發(fā)過程中使用到系統(tǒng)數(shù)據(jù)庫的時候,可能也會遇到類似的適配問題。這時,也可以使用類似的方式處理。
文/騰訊優(yōu)測 李艷超
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。