android实现拨打电话但不弹出拨号界面

时间:2022-11-09 23:16:01

这里只提供一个大概的思路,整个流程不是我一个人就能完成的。测试机型为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"

最后,也是最重要的地方,这个程序必须伪装成系统应用才能被正确安装到手机上,这一环节是别人实现的,我并不太清楚如何操作的。

最后附上成品效果图(由于没插卡,所以无法拨号,正常情况下是只有任务栏有拨号标志,但没有拨号界面弹出,另外拨号对象的响应时间也是无法控制的):

android实现拨打电话但不弹出拨号界面