这里只提供一个大概的思路,整个流程不是我一个人就能完成的。测试机型为htc one x,Android版本4.2.2,已ROOT。
要实现拨号程序可能很简单,一个简单的Intent就能实现,从发出意图到真正实现拨号的代码中间还执行了很多其他方法,这都是android底层源码自动实现的,其中就包含了启动拨号的Activity。要想实现不弹出拨号界面就实现拨号,就必须绕过中间这些方法,直接调用framework层中的拨号方法。详情可以去看下别人写的android拨号流程,就可知道真正实现拨号的方法。
这里先贴出我写的代码:
public static void Call(String number, Context context) {一开始是想通过反射调用底层方法,但是我当初试过,好像不能实现,所以最后直接调用底层方法,由于android本身并未提供相关的类或方法,所以必须引用额外的jar包(将android源码编译打包成jar)。这里我用的是某位大神将android2.2的部分源码编译成的jar包。
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();
}
}
然后是权限申明:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>但是这样还不是不够,要想调用底层的方法权限依然不够,在application中加上
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
android:process="com.android.phone"在manifest中加上
android:sharedUserId="android.uid.phone"
最后,也是最重要的地方,这个程序必须伪装成系统应用才能被正确安装到手机上,这一环节是别人实现的,我并不太清楚如何操作的。
最后附上成品效果图(由于没插卡,所以无法拨号,正常情况下是只有任务栏有拨号标志,但没有拨号界面弹出,另外拨号对象的响应时间也是无法控制的):