天天看點

關于android雙卡手機sim卡資訊采集适配的心得關于android雙卡手機sim卡資訊采集适配的心得

關于android雙卡手機sim卡資訊采集适配的心得

這幾天通過對各個廠商的雙卡資訊适配的研究,總結了幾點規律,寫這篇心得主要是為了能夠抛磚引玉,和大家一起分享,一起讨論,源碼已上傳。

一、android5.0以上(包含5.0)的版本雙卡資訊适配:

1、參數名意義:

slotId(simId):卡曹值Id,對應實體卡槽的位置0表示主卡位,1表示副卡位,-1表示無卡;

subId:據說是對應存放雙卡資訊資料庫中的索引id,這個id目前隻能從android5.0開始才能擷取的到,擷取需要用到的方法為

SubscriptionManager.getSubId(int slotId),注意的是這個方法傳回的是一個long(5.0)/int類型數組,取數組第一個;(擷取某些特定的資訊需要用到subid,但大部分情況都是用slotId)

2、資訊擷取

imei:telephonyManager.getDeviceId(int slotid),擷取imei;

imsi:telephonyManager.getSubscriberId(int slotid),擷取imsi;

operator:telephonyManager.getSimOperator(long/5.0//int subid),這裡要特别注意的是,擷取operator需要用subid,并且,在android5.0版本,getSimOperator方法的參數類型為long,之後的版本改成了int,在反射擷取方法的時候要特别注意;

simState:telephonyManager.getSimState(int slotid),擷取手機sim卡的狀态碼;

以上資訊的擷取方法,在5.0到6.0之間都是被系統隐藏的方法,從6.0開始方法公開。

defaultDataSlotId:預設上網卡,5.0到6.0之間擷取方法為,先擷取subId,static SubscriptionManager.getDefaultDataSubId(),方法為隐藏的;再通過static SubscriptionManager.getSlotId(long/5.0//int subId),方法個版本都為隐藏的;從7.0開始方法名變為static SubscriptionManager.getDefaultDataSubscriptionId(),方法也變為公開的;

擷取指定卡槽的SmsManager對象執行個體:5.0版本擷取方法為static SmsManager.getSmsManagerForSubscriber(long subId),方法為隐藏的;從5.1版本開始擷取的方法名為static SmsManager.getSmsManagerForSubscriptionId(int subId),方法是公開的,特别注意的是這裡的參數類型也由long變為了int;

subId的擷取:static SubscriptionManager.getSubId(int slotId),此方法一直被隐藏,從未公開。

二、android5.0一下版本雙卡資訊适配:

因為谷歌官方在5.0以上才開始對手機雙卡進行支援,是以在5.0以下都是廠商自己加入了自定義的類來維護對雙卡的支援,下面根據

幾個大的廠商來講解下他們自定義了哪些類來支援低版本的雙卡功能:

1、聯發科:MTK在低版本中的TeleManager中加入了一些方法,命名規則是xxxxGemini(),比如擷取指定imei好就是getDeviceIdGemini(int slotId),

以此類推,但要注意的是,擷取operator和imsi傳入的參數不再是subId了,而是統一改用slotId去擷取;此外,聯發科還新增了幾個類:

android.telephony.gemini.GeminiSmsManager ,com.mediatek.telephony.SmsManagerEx:這兩個是指定sim卡發送短信用的,SmsManagerEx發送短信的方法是SmsManagerEx.getDefault().sendDataMessage(String desAddr, String scAddr, short port, byte[] data, PendingIntent sendIntent,PendingIntent deliveryIntent, int slotId);與原API中不同的是參數清單最後多傳了一個slotId用于指定用哪張sim卡發送;而GeminiSmsManager不一樣的地方是它在每個方法名後面都加了一個字尾Gemini,例如發送短信的方法就是static GeminiSmsManager.sendDataMessageGemini(String desAddr, String scAddr, short port, byte[] data, int slotId, PendingIntent sendIntent,PendingIntent deliveryIntent);

com.mediatek.telephony.TelephonyManagerEx:這個類是用于擷取手機的imei、imsi、operator等資訊用的,擷取資訊對應的方法名和原API中的TelephonyManager基本一緻。

這幾個自定義隐藏類大家可以把類反射出來看看裡面有哪些内容。

2、高通:

android.telephony.MSimTelephonyManager:這個類是高通對低版本手機擷取imei、imsi、operator等資訊的相容,擷取資訊的方法名基本和原API的TelephonyManager一緻,注意的是,擷取operator資訊的方法參數與聯發科的一樣都改為了用slotId擷取而不是subId。

android.telephony.MSimSmsManager:發送短信的類,調用方式為MSimSmsManager.getDefault().sendDataMessage(String desAddr, String scAddr, short port, byte[] data, PendingIntent sendIntent,PendingIntent deliveryIntent, int slotId),與原API的SmsManager不同的是,參數清單最後多了一個slotId,指定用哪張卡發送短信。

像華為、三星、小米等這些廠商都對低版本的雙卡手機做了一定的修改,目前暫未收集完所有的擷取資訊,希望有知道的同學可以一起分享,完善對雙卡手機資訊的适配。

demo源碼:https://github.com/haoxiangtt/DualSimInfo