概述
slotid或者phoneid是指卡槽,双卡机器卡槽一值为0,卡槽2为1,依次类推,不过国内也就双卡和单卡机器了,三卡机器只听说在遥远的印度有。
subid用过数据库的同学比较好理解,subid就是主键递增项,值从1开始,机器每插入一个新卡(iccid是没有见的,值就会加1,iccid每个sim卡是唯一的)。插入双卡后数据库中就会有subid值为1和2的两个数据条目,拔卡插卡交换卡槽数据库并不会增加新项,只有插入一张新的sim卡才会增加一条id为3的数据条目
subid是跟卡走的,slotid是跟卡槽走的。一般来说slotid比较好理解,subid不好理解。Android5.0之后google终于加入了多sim卡的代码,5.0之前的多卡(一般也就是双卡)机制是各写各的,mtk和高通的代码各有千秋,但是基本上用slotid较多,subid只有mtk在用也很少。Google一统千秋后subid反而用的比slotid多了,例如
TelephonyManager:
frameworks/base/telephony/java/android/telephony/TelephonyManager.java
public int getSimState(int slotIdx)
public String getSimOperator(int subId)
都是int类型,但是一定要瞪大眼睛看清楚是subid还是slotid,按照一般情况双卡机器一般也就插两张卡,那么subid可以是1和2,slotid是0和1,拿一张卡做开发的同学可能掉到坑里,因为1对subid还是slotid都是合法的值三方app获取slot和subId
这个小节是针对文章下面的评论加的。
frameworks/base/telephony/java/android/telephony/SubscriptionManager.java
public int getDefaultDataPhoneId() 默认数据slotId
public static int getDefaultDataSubscriptionId() 默认数据subId
public int getDefaultSmsPhoneId() 默认短信slotId
public static int getDefaultSmsSubscriptionId() 默认短信subId
public static int getDefaultVoicePhoneId() 默认通话slotId
public static int getDefaultVoiceSubscriptionId() 默认通话subId
public static int getDefaultSubscriptionId() 获取默认subId,上述三个都返回-1的话使用这个
双卡设置中短信和通话的设置只是设置SettingsProvider中的一个字段,而设置数据业务卡槽除了设置数据库字段外还会导致modem的重启、网络类型切换(数据业务卡能上4G,而另一张卡只能用2G)等一系列操作。所以手机开发厂商一般说主卡就是数据业务卡。
互换方法
两个id互换的方法在SubscriptionManager类中
frameworks/base/telephony/java/android/telephony/SubscriptionManager.java
public static int getSubIdUsingPhoneId(int phoneId)
public static int getSlotId(int subId)
getSubIdUsingPhoneId方法是mtk加的,高通的可以用下面:
public static int getSubIdbySlot(Context ctx, int slot) {
int subid[] = SubscriptionManager.getSubId(slot);
if(subid != null) {
return subid[0];
}
return SubscriptionManager.INVALID_SUBSCRIPTION_ID;
}