怎样通过代码实现呼叫转移
答案: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);
}
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);
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯