码迷,mamicode.com
首页 > 移动开发 > 详细

Android拨打电话不弹出系统拨号界面总结

时间:2016-08-01 15:30:06      阅读:1693      评论:0      收藏:0      [点我收藏+]

标签:

我在网上搜了一下,解决这个问题,有两种方式:

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 

 

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

Android拨打电话不弹出系统拨号界面总结

标签:

原文地址:http://www.cnblogs.com/IT-Goddess/p/5725705.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!