以前android 有这方面的API, 可是现在好像没了, 请问如何才能实现 拒接来电的功能, 有什么机制可以实现,broadcast 或者 keyevent 之类的! keyevent 我有试过,可是提示说权限有问题!!!
         网上也有说把来电转到 voicemail , 有人知道具体怎么实现吗??
         

解决方案 »

  1.   

    用android.telephony.PhongStateListener。文档里面有写:A listener class for monitoring changes in specific telephony states on the device, including service state, signal strength, message waiting indicator (voicemail), and others. Override the methods for the state that you wish to receive updates for, and pass your PhoneStateListener object, along with bitwise-or of the LISTEN_ flags to TelephonyManager.listen(). Note that access to some telephony information is permission-protected. Your application won't receive updates for protected information unless it has the appropriate permissions declared in its manifest file. Where permissions apply, they are noted in the appropriate LISTEN_ flags. 
      

  2.   

     我找到了解决方法:大体是这样的;
    1.自己实现一个ITelephony.aidl(源代码copy),eclipse会自动生成一个ITelephony.java ,这是我们就可以使用这个interface了。 
    2.获得ITelephony:TelephonyManager类中有一个私有方法 private Itelephony getITelephony() 可以获得ITelephony,但是如何使用这个私有方法有一个小技巧,要用到java 的 反射机制。简单的过程如下:
    获得Class---》Method----》调用getITelephony.
      

  3.   

    打错了,,应该是 扩展 PhoneStateListener 类 
     PhoneStateListener  fucklister = new PhoneStateListener ();
      
     TelephonyManager temBoss = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
     temBoss.listen(fucklister,PhoneStateListener.LISTEN_CALL_STATE);
      

  4.   

    兄弟的方法实现不了的,还是guo_tianqi的方法有效
      

  5.   

    1. 在src下新建一个包:com.android.internal.telephony(和ITelephony.aidl 中 package 声明的包名一样);
    2. 然后把从系统源码中把ITelephony.aidl文件拷贝到 com.android.internal.telephony包下。(也可以先新建一个ITelephony.aidl, 然后再把内容拷贝进去(ITelephony.aidl文件内容可以在http://www.netmite.com/android/mydroid/1.5/frameworks/base/telephony/java/com/android/internal/telephony/ITelephony.aidl,这个方法适合么有SDK源码文件的开发者));
    3. 在src下新建一个包:android.telephony,  然后新建一个NeighboringCellInfo.aidl,其内容为:
    package android.telephony;parcelable NeighboringCellInfo;4.从私有方法中获取ITelephony: 代码如下。tManager = (TelephonyManager) 
    this.getSystemService(Context.TELEPHONY_SERVICE);
    //初始化iTelephony
    Class<TelephonyManager> c = TelephonyManager.class;
    Method getITelephonyMethod = null;
    try {
    getITelephonyMethod = c.getDeclaredMethod("getITelephony", (Class[])null);
    getITelephonyMethod.setAccessible(true);
    } catch (SecurityException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (NoSuchMethodException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

    try {
    iTelephony = (ITelephony) getITelephonyMethod.invoke(tManager, (Object[])null);
    } catch (IllegalArgumentException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IllegalAccessException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (InvocationTargetException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }(其实android sdk里面的文档是很有帮助的, aidl建立方法不清楚的可以看 里面的文档, )
      

  6.   

    1. 在src下新建一个包:com.android.internal.telephony(和ITelephony.aidl 中 package 声明的包名一样);
    2. 然后从系统源码中把ITelephony.aidl文件拷贝到 com.android.internal.telephony包下。(也可以先新建一个ITelephony.aidl, 然后再把内容拷贝进去(ITelephony.aidl文件内容可以在http://www.netmite.com/android/mydroid/1.5/frameworks/base/telephony/java/com/android/internal/telephony/ITelephony.aidl 找到,这个方法适合没有SDK源码文件的开发者));
    3. 在src下新建一个包:android.telephony,  然后新建一个NeighboringCellInfo.aidl,其内容为:
    package android.telephony;parcelable NeighboringCellInfo;4.从私有方法中获取ITelephony: 代码如下。tManager = (TelephonyManager)
    this.getSystemService(Context.TELEPHONY_SERVICE);
    //初始化iTelephony
    Class <TelephonyManager> c = TelephonyManager.class;
    Method getITelephonyMethod = null;
    try {
    getITelephonyMethod = c.getDeclaredMethod("getITelephony", (Class[])null);
    getITelephonyMethod.setAccessible(true);
    } catch (SecurityException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (NoSuchMethodException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }try {
    iTelephony = (ITelephony) getITelephonyMethod.invoke(tManager, (Object[])null);
    } catch (IllegalArgumentException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IllegalAccessException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (InvocationTargetException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }(其实android sdk里面的文档是很有帮助的, aidl建立方法不清楚的可以看 里面的文档, ) 
      

  7.   

    感谢楼主的共享精神。
    请问下,这种aidl方式 是使用hide api的途径么?
      

  8.   

    aidl 类似 j2ee 里的 RMI 远程方法调用,主要是提供 跨进程的调用。
    应该算是一种使用隐藏API的途径吧!!
      

  9.   

    哈哈,感谢啊,不经意间学会了这么好的东西。
    不过这样使用aidl不稳定吧。
    万一哪天google把endcall删掉而不是隐藏 岂不不能用?
      

  10.   

    我按照楼主的方法实现了这个来电拦截的功能,太感谢了!
    另外,楼主知不知道如何拦截短信呢?broadcast接收之后,应该怎样来cancle掉呢?
      

  11.   

    请问楼主,这个方法对sdk的版本有要求吗?
      

  12.   

    有吧, android 现在的sdk 还不是很稳定吧!!
    我的是在 sdk 1.5 的下面实现的,在其他更高的sdk上可不可以,我就不知道了!
      

  13.   

    我在Android1.5下用模拟器测试时来电时系统报异常,要强制终止,我是按楼主的方法写的,最后以myITelephony.endCall();来调用,问题就出在这句话上,不知为什么,请知道的说明一下原因
      

  14.   

    报错的原因找到了,原来要在AndroidManifest.xml中加入<uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>就好了。
      

  15.   

    谢谢lz,不知道能不能和你成为好朋友,以后有问题就来找你--------------------------------------
    [[email protected]][/email]
      

  16.   

    跑到外国网站找了两个多星期未果....终于在这里找到答案....感谢郭天琪大侠....感谢CSDN....感谢ANDROID....
      

  17.   

    感谢郭天琪大侠....感谢CSDN
    除了要有permission 之外,就是在需要用的地方初始化一下
      

  18.   


    我按照这个方法可以自动把来电挂断了,但是有个问题是有时候还会显示来电的界面,这样导致我的surface被destroy了,有没有办法让来电界面不显示出来啊?谢谢
      

  19.   

    首先我没有写那两个aidl类也没有问题。大家可以试一下
    其次个人感觉来电界面没有办法阻止,毕竟是系统级的,上层应用干涉不了