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. Http状态码解释

    参考:urllib与urllib2的学习总结(python2.7.X) # Table mapping response codes to messages; entries have the # f ...

  2. sweetalert插件的使用

    sweetalert是一个漂亮的弹窗插件,使用它可以完成各种炫酷的弹窗效果 链接:sweetalert 实例 删除演示 urls.py from django.contrib import admin ...

  3. 简单备份mysql数据库

    对于数据量不大的业务场景,可以每天做全量备份. 实现方式:编写备份数据库脚本,然后在crontab中每天定时执行脚本进行备份. 备份脚本示例: #!/bin/bash #Author: zhangsa ...

  4. 【转载】详解KMP算法

    网址:https://www.cnblogs.com/yjiyjige/p/3263858.html

  5. C++ 类2

    继承: 联系一起的类有层次关系. 基类: 层次关系的根部 派生类: 基类负责定义在层次关系中所以类共同拥有的成员,派生类定义其各种特有的成员. 基类类型相关的函数, 派生类不做改变直接继承的函数 某些 ...

  6. matplotlib-2D绘图库学习目录

    matplotlib的安装和 允许中文及几种字体 散点图 直线和点 子图 点的形状 条形图 堆叠条形图 直方图 颜色和样式字符串 饼状图  画多个图  画网格 线的形状  图例  坐标轴  画注释   ...

  7. Python之进程 2 - multiprocessing模块

    ​ 我们已经了解了,运行中的程序就是一个进程.所有的进程都是通过它的父进程来创建的.因此,运行起来的python程序也是一个进程,那么我们也可以在程序中再创建进程.多个进程可以实现并发效果,也就是说, ...

  8. python 多线程小方法

    import time from multiprocessing import Process, Lock, JoinableQueue from multiprocessing import Sem ...

  9. git部分提交

    ---git add 需要提交的文件----git stash -u -k -k 开关告诉仓库保持文件的完整. -u 开关告诉仓库包括无路径的文件(那些新的和未添加到git的)----git stas ...

  10. Codeforces891C(892E)

    传送门:here 简述题意:                                                                                       ...