在Android 5.0之前,雖然也有手機是雙卡手機,但是雙卡方案都是ODM廠商自己做的,或者是有芯片廠商提供的源碼完成。因此,如果要在4.4甚至更早之前的手機上獲取雙卡信息,基本上不是一向巨大的工程。雖然之前嘗試過使用反射方法去獲取
- 高通的“android.telephony.MSimTelephonyManager”類
- MTK的"com.mediatek.common.telephony.ITelephonyEx.aidl"類,
打印出函數的方法和參數以及類屬性,然後去猜測,但是由於無法直接閱讀源碼,而且ODM廠商也會自己去修改對應的代碼實現其他用戶癢點功能(主卡3/4G網絡,副卡流量)等。
因此在Lollipop之前,雙卡問題是暫時就放棄了。但是其他的功能調用還是有辦法的。
例如在自己的項目下新建如下文件夾
把ITelephony.aidl放進來,然後通過反射TelephonyManager的getITelephony()方法獲取 ITelephony實例,進而調用如endCall()等方法來實現如果來電黑名單攔截等方式
eg:
在Android .0以後,Google 官方API開始支持多SIM卡,這對開發者來說是一件好事,意味著應用能夠實現的功能也越來越多。
在Lollipop上Google又新增了一個Isub.aidl的文件,從命名上就可以看出這是一個進程服務,所以在使用時和ITelephony.adil一樣,在自己的項目裡建立對應adil文件夾,把ISub.aidl拉進來就行了。使用時調用方式如下:
舉個例子,假設現在是一台雙卡雙待的手機系統是Lollipop,我們想知道現在使用的是哪一張卡作為流量卡,那麼久必須知道默認的流量的subId。具體方法是調用ISub.aidl的getDefaultDataSubId()。
對應的流量卡subId後則需要調用到TelephonyManager下的getSubscriberid(long subId)方法,但是這個方法有點坑的地方,就是在5.0的時候參數書long類型的,但是到了5.1的時候有換成了int類型,所以在使用時必須注意
具體使用
通過將系統的AIDL引入,還可以調用其他的方法來是顯示更多的功能。
在6.0上Google進一步開放了SIM卡相關的API我們可以使用SubscriptionManager這個API
這個使用管理類使用更簡單,類似於TelephonyManager。
獲取實例:
獲取默認數據卡信息:
獲取激活的SIM 卡數量:
,既然能獲得SIM卡的信息,那還有個重要的東西想要獲取,就是如何監聽兩張SIM的信號場強信息以及對應的基站鄰區信息。
在5.0以前這是無法做到的,因為5.0以前,PhoneStateListener這個方法只有一個不帶參數的構造函數,所以無法注冊監聽,但是到了5.0以後的版本就有了
但是一個大大的@hide就給你隔絕了監聽的可能。
而且連參數protected也加了@hide明顯是不對普通開發者開放的。
但是,我們都知道,反射是可以獲取到類的參數,當然也可以設置參數值。
具體設置方法,在繼承PhoneStateListener時實現構造函數
並且在構造函數中對監聽進行設置。