我在网上搜了一下,解决这个问题,有两种方式:
1.反射调用系统底层方法,并获取系统权限
反射调用的代码如下:
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);
正常调用的思路:
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/2111949
开始获取系统权限的过程:
(1)获取platform.pk8和platform.x509.pem
通常在源码环境的build\target\product\security目录下,不同的系统版本找对应的文件(我用的是4.4.2的版本)
(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