androidL中使用一张数据表来保存sim卡信息:telephony.db中有一张记录SIM卡信息的表,siminfo:
CREATE TABLE siminfo(_id INTEGER PRIMARY KEY AUTOINCREMENT,icc_id TEXT NOT NULL,sim_id INTEGER DEFAULT -1,display_name TEXT,carrier_name TEXT,name_source INTEGER DEFAULT 0,color INTEGER DEFAULT 0,number TEXT,display_number_format INTEGER NOT NULL DEFAULT 1,data_roaming INTEGER DEFAULT 0,mcc INTEGER DEFAULT 0,mnc INTEGER DEFAULT 0);
一行记录实例如下:
INSERT INTO "siminfo" VALUES(1,‘89860114831010865147‘,0,‘中国联通‘,‘中国联通3G‘,0,-16746133,‘+8618516657794‘,1,0,460,1);
其中,主键_id就类似SIM卡的id,其值是从1开始递增的,sim_id类似于slot id,在双卡版本中一般只有-1/0/1三个值;其余的属性都好理解。
那如何去对应_id和sim_id呢?如函数:
SubscriptionController.getPhoneId(subId): // 根据subId取得phoneId
foreach entry: mSlotIdxToSubId.entrySet() // 具体代码,遍历mSlotIdxToSubId
int sim = entry.getKey(); // 对应siminfo表中的sim_id字段
int sub = entry.getValue(); // 对应siminfo表中的_id字段
if (subId == sub) { return sim; } // 正常流程下,这里返回的值会作为phoneId;
就是说传入的参数subId值等于siminfo表中的某行SIM的_id值,返回其sim_id字段,这个字段代表了phone id。
可以参考mSlotIdxToSubId 中的元素是这样填充的:
mSlotIdxToSubId.put(slotId, subId); // slotId:the slot which the SIM is inserted; subId:siminfo表中_id字段,一个例子:
_id = 3
icc_id = 89860114831010865147
sim_id = 1