zoukankan      html  css  js  c++  java
  • Android拨打电话不弹出系统拨号界面总结

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

    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 argetproductsecurity目录下,不同的系统版本找对应的文件(我用的是4.4.2的版本)

    (2)获取signapk,.jar

            通常在源码环境的build oolssignapk目录下,我是直接在网上下载的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

  • 相关阅读:
    ajax实现无刷新上传附件并且显示进度条的实例
    thinkphp ajax 无刷新分页效果的实现
    微信错误码详述
    eclispse修改项目项目编码
    构建高性能web之路------mysql读写分离实战
    Hibernate 的Ehache学习
    sessionStorage和localStorage
    sql中的group by 和 having 用法解析
    Hibernate DetachedCriteria实现
    JavaScript eval_r() 函数
  • 原文地址:https://www.cnblogs.com/IT-Goddess/p/5725705.html
Copyright © 2011-2022 走看看