1. 程式人生 > >android實現撥打電話但不彈出撥號介面

android實現撥打電話但不彈出撥號介面

這裡只提供一個大概的思路,整個流程不是我一個人就能完成的。測試機型為htc one x,Android版本4.2.2,已ROOT。

要實現撥號程式可能很簡單,一個簡單的Intent就能實現,從發出意圖到真正實現撥號的程式碼中間還執行了很多其他方法,這都是android底層原始碼自動實現的,其中就包含了啟動撥號的Activity。要想實現不彈出撥號介面就實現撥號,就必須繞過中間這些方法,直接呼叫framework層中的撥號方法。詳情可以去看下別人寫的android撥號流程,就可知道真正實現撥號的方法。

這裡先貼出我寫的程式碼:

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();
	}
}
一開始是想通過反射呼叫底層方法,但是我當初試過,好像不能實現,所以最後直接呼叫底層方法,由於android本身並未提供相關的類或方法,所以必須引用額外的jar包(將android原始碼編譯打包成jar)。這裡我用的是某位大神將android2.2的部分原始碼編譯成的jar包。

然後是許可權申明:

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
但是這樣還不是不夠,要想呼叫底層的方法許可權依然不夠,在application中加上
android:process="com.android.phone"
在manifest中加上
android:sharedUserId="android.uid.phone"

最後,也是最重要的地方,這個程式必須偽裝成系統應用才能被正確安裝到手機上,這一環節是別人實現的,我並不太清楚如何操作的。

最後附上成品效果圖(由於沒插卡,所以無法撥號,正常情況下是隻有工作列有撥號標誌,但沒有撥號介面彈出,另外撥號物件的響應時間也是無法控制的):