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. 2-5 Flutter开发环境与Android开发环境设置详解(Windows)

    第二个是国内服务器的网址 andoid stuido的一些使用的说明文档 https://developer.android.google.cn/studio/intro 安装Flutter Dart ...

  2. win32 API中GetSystemMetrics函数

    1. SM_ARRANGE: 用于说明系统如何安排最小化窗口,根据显示器的不同系统数据可能有所不同.其包含一个起始位置和方向.关于在程序中怎么使用我还没有见个这样的代码. 起始位置可为下列值之一: A ...

  3. 微调Inception V3网络-对Satellite分类

    目录 1. 流程概述 2. 准备数据集 2.1 Satellite数据集介绍 3. Inception V3网络 4. 训练 4.1 基于Keras微调Inception V3网络 4.2 Keras ...

  4. __stdcall

    __stdcall是函数调用约定的一种,函数调用约定主要约束了两件事: 1.参数传递顺序 2.调用堆栈由谁(调用函数或被调用函数)清理 常见的函数调用约定:stdcall cdecl fastcall ...

  5. Codevs 1688 求逆序对(权值线段树)

    1688 求逆序对  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 给定一个序列a1,a2,…, ...

  6. 洛谷P2652 同花顺

    P2652 同花顺 题目背景 所谓同花顺,就是指一些扑克牌,它们花色相同,并且数字连续. 题目描述 现在我手里有n张扑克牌,但它们可能并不能凑成同花顺.我现在想知道,最少更换其中的多少张牌,我能让这 ...

  7. 洛谷P3757 [CQOI2017]老C的键盘

    传送门 首先可以直接把整个序列建成一个完全二叉树的结构,这个应该都看得出来 然后考虑树形dp,以大于为例 设$f[i][j]$表示$i$这个节点在子树中排名第$j$位时的总方案数(因为实际只与相对大小 ...

  8. Visio画图(一):UML用例图

    Visio画图(一):UML用例图 1.找到UML用例图 A.有网状态 第一步 在搜索框内输入用例图进行搜索. 第二步,移动鼠标直到找到用例图 B.无网状态 第一步 点击特别推荐旁的类别选项 第二步 ...

  9. jvm 默认字符集

    最近在读取第三方上传的文件时,遇到一个问题,就是采用默认字符集读取,发现个别中文乱码,找到乱码的字,发现是生僻字:碶. 由于在window是环境下做的测试,并没有报错,但是在linux服务器上执行,发 ...

  10. HDU-1498-50years,50colors(最大匹配, 枚举)

    链接:https://vjudge.net/problem/HDU-1498#author=634579757 题意: 撞气球游戏,一个n*n的矩阵中,有不同颜色的气球,气球的颜色最多50种(从1到5 ...