1. 电话拦截
这个功能大家可能都知道了,就是利用反射原理调用ITelephony的隐藏方法来实现。这个就不说了,在附件的代码里有。
2.拦截后提示忙音/空号/已关机/已停机
这个功能其实是要用到MMI指令,具体如何设置呼叫转移的指定可以参考这里 http://baike.baidu.com/view/206402.html?fromTaglist 。
在本文中我们会用到“遇忙转移”转移的功能。中国移动的设置方式是 **67#电话号码#,取消方式为 ##67#。”无条件转移“用21代替67即可。这两个指令可以直接在手机的拨号界面输入并拨号测试。ITelephony的endcall方法挂断电话后,会提示电话忙。如果事前设置好了忙时转移到一个空号/已关机/已停机的电话号码,就会提示您拨的电话号码是空号/已关机/已停机。

//先静音处理
mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
try {
//挂断电话
iTelephony.endCall();
} catch (RemoteException e) {
e.printStackTrace();
}
//再恢复正常铃声
mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);

//判断号码是否存在
public static boolean IsValidMobileNo(String mobiles){
Pattern p = Pattern.compile("^((13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$");
Matcher m = p.matcher(mobiles);
return m.matches();
}

//呼叫转移
switch (v.getId()) {
case R.id.change: //转移
if(phoneNum!=null&&phoneNum.length()>0){
if(IsValidMobileNo(phoneNum)){
intent=new Intent();
intent.setAction(Intent.ACTION_CALL);
if(changeType==0){
intent.setData(Uri.parse("tel:**21*"+phoneNum+"%23")); //始终进行呼叫转移
}else if(changeType==1){
intent.setData(Uri.parse("tel:**67*"+phoneNum+"%23")); //占线时进行呼叫转移
}else if(changeType==2){
intent.setData(Uri.parse("tel:**61*"+phoneNum+"%23")); //无应答时进行呼叫转移
}else if(changeType==3){
intent.setData(Uri.parse("tel:**62*"+phoneNum+"%23")); //无法接通时进行呼叫转移
}
startActivity(intent);
}else{
Toast.makeText(this, getString(R.string.app_name08), Toast.LENGTH_SHORT).show();
}
}else{
Toast.makeText(this, getString(R.string.app_name07), Toast.LENGTH_SHORT).show();
}
break;
case R.id.cancle: //取消
intent=new Intent();
intent.setAction(Intent.ACTION_CALL);
if(changeType==0){
intent.setData(Uri.parse("tel:%23%2321%23"));
}else if(changeType==1){
intent.setData(Uri.parse("tel:%23%2367%23"));
}else if(changeType==2){
intent.setData(Uri.parse("tel:%23%2361%23"));
}else if(changeType==3){
intent.setData(Uri.parse("tel:%23%2362%23"));
}
startActivity(intent);
break;
case R.id.query: //查询
intent=new Intent();
intent.setAction(Intent.ACTION_CALL);
if(changeType==0){
intent.setData(Uri.parse("tel:*%2321%23"));
}else if(changeType==1){
intent.setData(Uri.parse("tel:*%2367%23"));
}else if(changeType==2){
intent.setData(Uri.parse("tel:*%2361%23"));
}else if(changeType==3){
intent.setData(Uri.parse("tel:*%2362%23"));
}
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
break;
}

参考链接:http://blog.csdn.net/liushaogeng/article/details/6592916

代码下载链接:http://download.csdn.net/detail/klcf0220/7170513

Android来电拦截及来电转移的更多相关文章

  1. 实现android手机来电拦截系统页面弹出自定义页面特效

    如何实现android手机来电拦截系统页面弹出自定义页面特效, 首先:    我们需要注册一个监听来电的广播PhoneStateReceiver 类:其次:    在onReceive里面我们获取an ...

  2. 三星S4,呼转的来电,在来电界面上不显示的解决方案

    因为工作关系,我有2个号码是呼叫转移到我现在的手机上的,如果有呼叫转移的来电的话,在通话界面里面没有提示该来电是呼叫转移来的.之前我用的诺基亚的,可以看到呼叫转移的来电,在号码的左边有个拐弯的箭头,提 ...

  3. 讲讲Android事件拦截机制

    简介 什么是触摸事件?顾名思义,触摸事件就是捕获触摸屏幕后产生的事件.当点击一个按钮时,通常会产生两个或者三个事件--按钮按下,这是事件一,如果滑动几下,这是事件二,当手抬起,这是事件三.所以在And ...

  4. Android 事件拦截机制一种粗鄙的解释

    对于Android事件拦截机制,相信对于大多数Android初学者是一个抓耳挠腮难于理解的问题.其实理解这个问题并不困难. 首先,你的明白事件拦截机制到底是怎么一回事?这里说的事件拦截机制,指的是对触 ...

  5. 如何将为Android开发的AIR应用转移到SD卡

    如果你想用户能够将为Android开发的AIR应用转移到SD卡上,所需要做的是在你的应用程序描述符中修改一下.如果你想你的应用程序默认安装到内置存储器中,但是允许用户把它转移到SD卡上,设置andro ...

  6. Android 代码实现来电拦截

    为了更好地理解这个Demo,我先向大家介绍一下需求与功能. 需求: 每天都会有很多无聊的电话,比如推销商品等,占用我们大量时间不说,有时候还会打乱我们的思路,扰乱我们的正常生活.所以实现一个对某些号码 ...

  7. Android实战_来电拦截专家

    1 项目演示: 2 代码演示: 1)MainActivity类代码: MainActivity类代码: package com.example.phoneinteceptor_one;import j ...

  8. ANDROID 通过监听来电去电,并弹出悬浮窗

    要监听android打电话和接电话,有一种的是通过新建一个Receiver继承自BroadcastReceiver. 还有一种也可通过PhoneStateListener来实现.今天就说说后面一种,废 ...

  9. Android ViewGroup拦截触摸事件具体解释

    前言 在自己定义ViewGroup中.有时候须要实现触摸事件拦截.比方ListView下拉刷新就是典型的触摸事件拦截的样例. 触摸事件拦截就是在触摸事件被parent view拦截,而不会分发给其ch ...

随机推荐

  1. python实现单向循环链表

    单向循环链表 单链表的一个变形是单向循环链表,链表中最后一个节点的next域不再为None,而是指向链表的头节点. 实现 class Node(object): """节 ...

  2. 保存页面数据的场所----Hidden、ViewState、ControlState

    1.使用隐藏域Session.Application和Cache都是保存在服务器内存中的.一般来说我们是无权访问客户端的机器,把数据直接保存在客户端的(Cookie是一个例外,不过Cookie只能保存 ...

  3. 22.doublewrite/ChangeBuffer/AHI/FNP

    一. Double Write1 Double Write介绍 • Double Write的目的是为了保证数据写入的可靠性, 避免partial write 的情况 ◦ partial write( ...

  4. 堆栈Stack介绍

    堆栈(Stack)代表了一个后进先出的对象集合.当您需要对各项进行后进先出的访问时,则使用堆栈.当您在列表中添加一项,称为推入元素,当您从列表中移除一项时,称为弹出元素. Stack 类的方法和属性 ...

  5. 对XML文件进行的修改

    XmlDocument xml = new XmlDocument(); xml.Load(Way);//获取相对路径 var Exports = xml.GetElementsByTagName(& ...

  6. java8 从对象集合中取出某个字段的集合

    public class FeildTest { public static void main(String[] args) { //定义list集合 List<P> list = Ar ...

  7. 20155324 2016-2017-2 《Java程序设计》第6周学习总结

    20155324 2016-2017-2 <Java程序设计>第6周学习总结 教材学习内容总结 InputStream与OutputStream 串流设计 1.串流:Java将输入/输出抽 ...

  8. luogu P3201 [HNOI2009]梦幻布丁

    传送门 先考虑暴力,显然每次是把一个位置集合和另一个集合合并,同时维护答案,合并的过程中如果两个集合每有一对元素相邻,答案就减1 优化暴力的话,说到合并,怎么能不想起启发式合并呢?每次把一个大小小的集 ...

  9. 洛谷P2251 【质量检测】

    无意中刷st表题看到的题目(抄模板),一看到题目,,,没想用st表,直接莫队?????跑起来也不是特别慢... 这里用flag数组记录出现次数,set维护最小值,用的时候直接取头部. 代码也很短 #i ...

  10. Menu显示三个点,不显示内容

    先说下menu的使用 首先自定义一个menu选项 <menu xmlns:android="http://schemas.android.com/apk/res/android&quo ...