package com.focus.manager;
import java.lang.reflect.Method;
import Android .app.Activity;
import Android .content.BroadcastReceiver;
import Android .content.Context;
import Android .content.Intent;
import Android .content.IntentFilter;
import Android .media.AudioManager;
import Android .net.Uri;
import Android .os.Bundle;
import Android .os.Handler;
import Android .os.Message;
import Android .telephony.SmsMessage;
import Android .telephony.TelephonyManager;
import Android .util.Log;
import Android .view.View;
import Android .view.View.OnClickListener;
import com.Android .internal.telephony.ITelephony;
public class CallAndSMSInterceptorActivity extends Activity {
//要拦截的号码
private final static String BLOCKED_NUMBER = "15555215556" ;

private IncomingCallReceiver mIncomingCallReceiver;
private ITelephony mITelephony;
private AudioManager mAudioManager;
//占线时转移,这里13800000000是空号,所以会提示所拨的号码为空号
private final String ENABLE_SERVICE = "tel:**67*13800000000%23" ;

//占线时转移
private final String DISABLE_SERVICE = "tel:%23%2367%23" ;
private final static int OP_REGISTER = 100 ;
private final static int OP_CANCEL = 200 ;

@Override
public void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.main);

mIncomingCallReceiver = new IncomingCallReceiver();

IntentFilter mIntentFilter = new IntentFilter();
//拦截电话
mIntentFilter.addAction( "Android .intent.action.PHONE_STATE" );
//拦截短信
mIntentFilter.addAction( "Android .provider.Telephony.SMS_RECEIVED" );
//注册BroadcastReceiver
registerReceiver(mIncomingCallReceiver, mIntentFilter);
mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
//利用反射获取隐藏的endcall方法
TelephonyManager mTelephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

try {
Method getITelephonyMethod = TelephonyManager. class .getDeclaredMethod( "getITelephony" , (Class[]) null );
getITelephonyMethod.setAccessible( true );
mITelephony = (ITelephony) getITelephonyMethod.invoke(mTelephonyManager, (Object[]) null );
} catch (Exception e) {
e.printStackTrace();
}
findViewById(R.id.enableCallTransfer).setOnClickListener( new OnClickListener(){
public void onClick(View view) {
//设置呼叫转移
Message message = mHandler.obtainMessage();
message.what = OP_REGISTER;
mHandler.dispatchMessage(message);
}
});

findViewById(R.id.disableCallTransfer).setOnClickListener( new OnClickListener(){
public void onClick(View view) {
//取消呼叫转移
Message message = mHandler.obtainMessage();
message.what = OP_CANCEL;
mHandler.dispatchMessage(message);
}
});

}
private class IncomingCallReceiver extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Log.d( "mayingcai" , "Action:" + action);

if ( "Android .intent.action.PHONE_STATE" .equals(action)){ //拦截电话
String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
Log.i( "mayingcai" , "State: " + state);

String number = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
Log.d( "mayingcai" , "Incomng Number: " + number);

if (state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_RINGING)){ //电话正在响铃
if (number.equals(BLOCKED_NUMBER)){ //拦截指定的电话号码
//先静音处理
mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
Log.d( "mayingcai" , "Turn Ringtone Silent" );

try {
//挂断电话
mITelephony.endCall();
} catch (Exception e) {
e.printStackTrace();
}

//再恢复正常铃声
mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
}
}
} else if ( "Android .provider.Telephony.SMS_RECEIVED" .equals(action)){ //拦截短信
SmsMessage sms = getMessagesFromIntent(intent)[ 0 ];
String number = sms.getOriginatingAddress();
Log.d( "mayingcai" , "Incomng Number: " + number);
number = trimSmsNumber( "+86" , number); //把国家代码去除掉
if (number.equals(BLOCKED_NUMBER)){
abortBroadcast(); //这句很重要,中断广播后,其他要接收短信的应用都没法收到短信广播了
}
}
}
}
public final static SmsMessage[] getMessagesFromIntent(Intent intent) {
Object[] messages = (Object[]) intent.getSerializableExtra( "pdus" );
byte [][] pduObjs = new byte [messages.length][];
for ( int i = 0 ; i < messages.length; i++) {
pduObjs[i] = ( byte []) messages[i];
}

byte [][] pdus = new byte [pduObjs.length][];
int pduCount = pdus.length;
SmsMessage[] msgs = new SmsMessage[pduCount];

for ( int i = 0 ; i < pduCount; i++) {
pdus[i] = pduObjs[i];
msgs[i] = SmsMessage.createFromPdu(pdus[i]);
}

return msgs;
}

public final static String trimSmsNumber(String prefix, String number){
String s = number;

if (prefix.length()> 0 && number.startsWith(prefix)){
s = number.substring(prefix.length());
}

return s;
}
private Handler mHandler = new Handler() {
public void handleMessage(Message response) {
int what = response.what;
switch (what) {
case OP_REGISTER:{
Intent i = new Intent(Intent.ACTION_CALL);
i.setData(Uri.parse(ENABLE_SERVICE));
startActivity(i);
break ;
}
case OP_CANCEL:{
Intent i = new Intent(Intent.ACTION_CALL);
i.setData(Uri.parse(DISABLE_SERVICE));
startActivity(i);
break ;
}
}
}
};

}

Android安卓电话拦截及短信过滤的更多相关文章

  1. Android之电话拨号和短信

    拨打电话号码,需要添加权限设置,在安装的应用程序信息中可以看到此权限信息Intent doSth=new Intent();//意图:你想做什么呢?doSth.setAction(Intent.ACT ...

  2. Android短信过滤项目中的观察者模式

    观察者模式: 观察者模式定义了对象之间的一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新. 观察者模式提供了一种对象设计, 让主题和观察者之间松耦合.主题只知道观察者实现了某个接 ...

  3. Android开发手记(15) 拨打电话和收发短信

    1.Intent简介 Android组价之间的通信,由Intent来协助完成.Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述,Android则根据此Intent的描述,负责找到 ...

  4. 利用Android Lost通过互联网或短信远程控制安卓设备

    利用Android Lost通过互联网或短信远程控制安卓设备 作者:Jack Wallen| 杰克·瓦伦翻译:PurpleEndurer.2014-11-15第1版 使用智能手机要考虑的一个至关重要的 ...

  5. Android中使用Intent的Action和Data属性实现点击按钮跳转到拨打电话和发送短信

    场景 点击拨打电话按钮,跳转到拨打电话页面 点击发送短信按钮,跳转到发送短信页面 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程 ...

  6. 脚本控制向Android模拟拨打电话,发送短信,定位设置功能

    做行为触发的时候要向模拟器实现拨打电话,发送短信,定位设置的的功能,可以很方便通过telnet localhost  5554实现. 写个脚本很快的搞定了.网上资料很多,脚本的很少,也所积点德啦. 写 ...

  7. Android手机上监听短信的两种方式

    Android手机上监听短信有两种方式: 1. 接受系统的短信广播,操作短信内容. 优点:操作方便,适合简单的短信应用. 缺点:来信会在状态栏显示通知信息. AndroidManifest.xml: ...

  8. Android -- 怎么发出和接收广播, Broadcast, 电话拨号拦截,短信拦截

    1. 发送广播 使用以下三个API可以发送广播 public void click(View view){ Intent intent = new Intent(); intent.setAction ...

  9. java攻城师之路(Android篇)--搭建开发环境、拨打电话、发送短信、布局例子

    一.搭建开发环境 1.所需资源 JDK6以上 Eclipse3.6以上 SDK17, 2.3.3 ADT17 2.安装注意事项 不要使用中文路径 如果模拟器默认路径包含中文, 可以设置android_ ...

随机推荐

  1. Java基础知识之常见关键字(1)

    static 特点: 随着类的加载而加载 优先于对象存在 被所有对象所共享 可以直接被类名调用 注意点: 静态方法只能访问静态方法 但是非静态成员可以直接访问静态成员 静态方法中不可以使用this , ...

  2. session和cookie(2)

    会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端 ...

  3. windows文件同步工具

    windows 文件同步工具: realTimesync freefilesync second copy   second copy注册码: Name:爱学府软件园 注册码:15BF-E46C-67 ...

  4. 《Java多线程编程核心技术》读后感(十六)

    线程组 线程组的作用是,可以批量的管理线程或线程组对象,有效地对线程或线程组对象进行组织 线程对象关联线程组:1级关联 package Seven; public class ThreadA exte ...

  5. (一)新建一个javaweb项目

    一.为了不影响其他项目,可以重新选择一个新的工作目录:swith workspace 二.为了尽可能统一项目,所使用的编程环境,包括:Tomcat.JRE都是项目组自己的,所以在新建项目的时候要注意选 ...

  6. Spring入门第十八课

    Spring AOP AspectJ:Java社区里最完整最流行的AOP框架 在Spring2.0以上的版本中,可以使用基于AspectJ注解或者基于XML配置的AOP 看代码: package lo ...

  7. SQL将一个表中的某一列值全部插入到另一个表中

    1.  SQL将一个表中的某一列值全部插入到另一个表中 插入的话: insert into a(col) select col from b; 更新的话: update a set col=selec ...

  8. iTween研究院之学习笔记Move移动篇(一)

    http://www.xuanyusong.com/archives/2052 iTween.MoveTo(): 让模型移动到一个位置,它的底层函数是通过动态的修改模型每一帧的transform.po ...

  9. 51nod1113(矩阵快速幂模板)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1113 题意:中文题诶- 思路:矩阵快速幂模板 代码: #inc ...

  10. 2014-11-2 NOIP模拟赛1

    Noip2009 团结模拟赛如题目理解困难,请自行阅读或参考样例.内存限制均为 256MB,时间限制均为 1s.出题人不会 故意 在题目中设置陷阱,但请自己注意程序的正确性.IO 文件名(.in/.o ...