Android 經過反射及AIDL獲取雙卡手機SIM卡相關信息,及註冊監聽

在Android 5.0以前,雖然也有手機是雙卡手機,可是雙卡方案都是ODM廠商本身作的,或者是有芯片廠商提供的源碼完成。所以,若是要在4.4甚至更早以前的手機上獲取雙卡信息,基本上不是一貫巨大的工程。雖然以前嘗試過使用反射方法去獲取 高通的「android.telephony.MSimTelephonyManager」類 MTK的"com.mediatek.common.telephony.ITelephonyEx.aidl"類, 打印出函數的方法和參數以及類屬性,而後去猜想,可是因爲沒法直接閱讀源碼,並且ODM廠商也會本身去修改對應的代碼實現其餘用戶癢點功能(主卡3/4G網絡,副卡流量)等。 所以在Lollipop以前,雙卡問題是暫時就放棄了。可是其餘的功能調用仍是有辦法的。 例如在本身的項目下新建以下文件夾android

把ITelephony.aidl放進來,而後經過反射TelephonyManager的getITelephony()方法獲取 ITelephony實例,進而調用如endCall()等方法來實現若是來電黑名單攔截等方式 eg:網絡

在Android 5.0之後,Google 官方API開始支持多SIM卡,這對開發者來講是一件好事,意味着應用可以實現的功能也愈來愈多。 在Lollipop上Google又新增了一個Isub.aidl的文件,從命名上就能夠看出這是一個進程服務,因此在使用時和ITelephony.adil同樣,在本身的項目裏創建對應adil文件夾,把ISub.aidl拉進來就好了。使用時調用方式以下:ide

舉個例子,假設如今是一臺雙卡雙待的手機系統是Lollipop,咱們想知道如今使用的是哪一張卡做爲流量卡,那麼久必須知道默認的流量的subId。具體方法是調用ISub.aidl的getDefaultDataSubId()。函數

對應的流量卡subId後則須要調用到TelephonyManager下的getSubscriberid(long subId)方法,可是這個方法有點坑的地方,就是在5.0的時候參數書long類型的,可是到了5.1的時候有換成了int類型,因此在使用時必須注意 具體使用.net

經過將系統的AIDL引入,還能夠調用其餘的方法來是顯示更多的功能。 在6.0上Google進一步開放了SIM卡相關的API咱們可使用 SubscriptionManager這個API 這個使用管理類使用更簡單,相似於TelephonyManager。 獲取實例: 獲取默認數據卡信息:blog

獲取激活的SIM 卡數量:繼承

,既然能得到SIM卡的信息,那還有個重要的東西想要獲取,就是如何監聽兩張SIM的信號場強信息以及對應的基站鄰區信息。 在5.0之前這是沒法作到的,由於5.0之前,PhoneStateListener這個方法只有一個不帶參數的構造函數,因此沒法註冊監聽,可是到了5.0之後的版本就有了進程

可是一個大大的@hide就給你隔絕了監聽的可能。 並且連參數protected也加了@hide明顯是不對普通開發者開放的。ip

可是,咱們都知道,反射是能夠獲取到類的參數,固然也能夠設置參數值。 具體設置方法,在繼承PhoneStateListener時實現構造函數開發

而且在構造函數中對監聽進行設置。

另外,還有一篇好文章: http://blog.csdn.net/firedancer0089/article/details/60121128

相關文章
相關標籤/搜索