我在網上搜了一下,解決這個問題,有兩種方式:html
1.反射調用系統底層方法,並獲取系統權限java
反射調用的代碼以下:android
Class phoneFactoryClass = Class.forName("com.android.internal.telephony.PhoneFactory"); Method makeDefaultPhones=phoneFactoryClass.getMethod("makeDefaultPhones",Context.class); makeDefaultPhones.invoke(null,context); Method getDefaultPhone = phoneFactoryClass.getMethod("getDefaultPhone"); Object p = getDefaultPhone.invoke(null); Class classCallManager = Class.forName("com.android.internal.telephony.CallManager"); Object CallManagerInstance=classCallManager.getDeclaredMethod("getInstance"); classCallManager.getMethod("registerPhone", Object.class).invoke(CallManagerInstance, p); Method newGetDefaultPhone =classCallManager.getMethod("getDefaultPhone"); Object phone=newGetDefaultPhone.invoke(CallManagerInstance); String phoneName = "com.android.internal.telephony.Phone"; Class phoneClass = Class.forName(phoneName); phoneClass.getMethod("dial", String.class).invoke(phone, number);
正常調用的思路:app
PhoneFactory.makeDefaultPhones(context); Phone p = PhoneFactory.getDefaultPhone(); CallManager cm = CallManager.getInstance(); cm.registerPhone(p); Phone phone = cm.getDefaultPhone(); phone.dial(number);
代碼寫完了以後,還須要獲取系統權限。工具
固然,若是你手上有源碼環境,那就不要這麼麻煩了,直接將你的程序放到源碼環境進行編譯便可。下面討論的前提是,咱們有系統的簽名程序,但沒有系統源碼環境,可是有在線源碼,好比http://androidxref.com/網站,具體參考:網站
http://gqdy365.iteye.com/blog/2111949ui
開始獲取系統權限的過程: spa
(1)獲取platform.pk8和platform.x509.pem.net
一般在源碼環境的build\target\product\security目錄下,不一樣的系統版本找對應的文件(我用的是4.4.2的版本)code
(2)獲取signapk,.jar
一般在源碼環境的build\tools\signapk目錄下,我是直接在網上下載的4.4.2的版本
(3)將(1)(2)中獲取的文件和生成的apk放在一個文件夾中,進入到這個目錄,執行簽名操做:
java -jar signapk.jar platform.x509.pem platform.pk8 原.apk 新.apk
到這裏獲取系統權限尚未結束,還須要設置mainifest.xml,在application中加上:
android:process="com.android.phone"
在mainifest.xml的manifest上加上:
android:sharedUserId="android.uid.phone"
2.將android源碼編譯的jar包項目中引用,直接使用撥打電話
直接調用的方法:
PhoneFactory.makeDefaultPhones(context); Phone p = PhoneFactory.getDefaultPhone(); CallManager cm = CallManager.getInstance(); cm.registerPhone(p); Phone phone = cm.getDefaultPhone(); phone.dial(number);
在build.pradle文件中設置:
defaultConfig {
…
multiDexEnabled true
}
dexOptions {
javaMaxHeapSize "4g"
incremental true
}
總結,我在網上找到的文章中說能夠實現,但具體我實踐下來是沒有成功的,網上實現實現這個功能的系統版本是比較低的,而我實踐的版本是4.4.2
能夠參考一下面的博客文章:
http://blog.csdn.net/u013401219/article/details/45887193
http://blog.sina.com.cn/s/blog_65977dde0100uu7b.html
獲取系統權限用到的工具(4.4.2)
http://files.cnblogs.com/files/IT-Goddess/android4.4.2.zip