永发信息网

怎样通过代码实现呼叫转移

答案:1  悬赏:0  手机版
解决时间 2021-11-09 06:21
  • 提问者网友:情歌越听越心酸
  • 2021-11-08 12:09
怎样通过代码实现呼叫转移
最佳答案
  • 五星知识达人网友:玩家
  • 2021-11-08 13:07
原理剖析:
  1 这个问题以前困扰了我很久,前天在地铁上突发奇想,猛然醒悟,回家测试,ok
  2 短信防火墙利用短信广播接收者,过滤短信,终止黑名单发来的短信广播即可,较为简单,不说了
  3 电话防火墙比较复杂,我当初本来已经实现了,可是老想着再完美一点,搞来搞去,总是实现不了,后来才知道,原来360做得也并不是完美的。他们是用了
  a 在android1.0后,google很执着的关闭了终止电话的endcall的api,但是实际上这个方法仍然在电话服务里面存在着,所以,我们可以利用java的反射原理将其获取出来。电话服务是另外一个进程,所以我们需要用到aidl不同进程的通信
  b endcall方法获得后,在onCallStateChanged(别跟我说你不知道这个是什么)方法对来电状态进行监听,如果发现时黑名单号码,先静音,然后调用endcall方法终止
  c 执行endcall方法后,默认是提示忙音的,如果你想要提示别的,可以通过来电转移来实现。你可以激发其它的意图,比如移动号程序控制拨打**67#电话号码#等进行呼叫转移,你故意转移到一个停机的好,黑名单的拨打着将听到停机的提示音,你转移到关机的好,人家也会听到关机的提示音,我当初就是在这里想叉了,shit,浪费了好多天,一直在纠结
  d 如果你不能执行呼叫转移,那应该是你的运营商不支持,你打客服问问怎么执行呼叫转移,反正我有移动和电信的手机,都是没问题的
  e 有些机器不给力,你并不一定能获取到来电手机号,比如如果你是华为的什么c8500或c8600,那么我可以告诉你,太不给力了,十之八九你获取不到来电手机(短信可以),我的一个三星i5700获取是没问题的,如果你试验不成功,建议你先system.out一下你是否是获取到了手机号了
  公司完成的东西,不方便公开代码,重点代码我贴出来
  反射的代码:

  Method method = Class.forName("android.os.ServiceManager").getMethod("getService", String.class);

  IBinder binder = (IBinder)method.invoke(null, new Object[]{TELEPHONY_SERVICE});

  ITelephony telephony = ITelephony.Stub.asInterface(binder);

  telephony.endCall();
  复制代码呼叫转移设置的代码:

  String str1 = "tel:";

  String str2 = "**67*13810538911%23";//拨打这个手机将产生空号 移动的做法

  //其实就是设置需要转移的代码

  Intent localIntent = new Intent();

  localIntent.setAction("android.intent.action.CALL");

  System.out.println("start new Intent first...");

  Uri localUri = Uri.parse(str1 + str2);

  localIntent.setData(localUri);

  startActivity(localIntent);

  System.out.println("start new Intent end...");
  复制代码静音的,记住静音在黑名单电话响起时,恢复在挂断电话后,记得恢复

  AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);

  if (audioManager != null) {

  audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);

  audioManager.getStreamVolume(AudioManager.STREAM_RING);

  }
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯