android實現撥打電話但不彈出撥號介面
阿新 • • 發佈:2019-02-09
這裡只提供一個大概的思路,整個流程不是我一個人就能完成的。測試機型為htc one x,Android版本4.2.2,已ROOT。
要實現撥號程式可能很簡單,一個簡單的Intent就能實現,從發出意圖到真正實現撥號的程式碼中間還執行了很多其他方法,這都是android底層原始碼自動實現的,其中就包含了啟動撥號的Activity。要想實現不彈出撥號介面就實現撥號,就必須繞過中間這些方法,直接呼叫framework層中的撥號方法。詳情可以去看下別人寫的android撥號流程,就可知道真正實現撥號的方法。
這裡先貼出我寫的程式碼:
一開始是想通過反射呼叫底層方法,但是我當初試過,好像不能實現,所以最後直接呼叫底層方法,由於android本身並未提供相關的類或方法,所以必須引用額外的jar包(將android原始碼編譯打包成jar)。這裡我用的是某位大神將android2.2的部分原始碼編譯成的jar包。public static void Call(String number, Context context) { PhoneFactory.makeDefaultPhones(context); Phone p = PhoneFactory.getDefaultPhone(); CallManager cm = CallManager.getInstance(); cm.registerPhone(p); Phone phone = cm.getDefaultPhone(); try { phone.dial(number); } catch (CallStateException e) { e.printStackTrace(); } }
然後是許可權申明:
但是這樣還不是不夠,要想呼叫底層的方法許可權依然不夠,在application中加上<uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
android:process="com.android.phone"
在manifest中加上android:sharedUserId="android.uid.phone"
最後,也是最重要的地方,這個程式必須偽裝成系統應用才能被正確安裝到手機上,這一環節是別人實現的,我並不太清楚如何操作的。
最後附上成品效果圖(由於沒插卡,所以無法撥號,正常情況下是隻有工作列有撥號標誌,但沒有撥號介面彈出,另外撥號物件的響應時間也是無法控制的):