Android安卓电话拦截及短信过滤
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安卓电话拦截及短信过滤的更多相关文章
- Android之电话拨号和短信
拨打电话号码,需要添加权限设置,在安装的应用程序信息中可以看到此权限信息Intent doSth=new Intent();//意图:你想做什么呢?doSth.setAction(Intent.ACT ...
- Android短信过滤项目中的观察者模式
观察者模式: 观察者模式定义了对象之间的一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新. 观察者模式提供了一种对象设计, 让主题和观察者之间松耦合.主题只知道观察者实现了某个接 ...
- Android开发手记(15) 拨打电话和收发短信
1.Intent简介 Android组价之间的通信,由Intent来协助完成.Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述,Android则根据此Intent的描述,负责找到 ...
- 利用Android Lost通过互联网或短信远程控制安卓设备
利用Android Lost通过互联网或短信远程控制安卓设备 作者:Jack Wallen| 杰克·瓦伦翻译:PurpleEndurer.2014-11-15第1版 使用智能手机要考虑的一个至关重要的 ...
- Android中使用Intent的Action和Data属性实现点击按钮跳转到拨打电话和发送短信
场景 点击拨打电话按钮,跳转到拨打电话页面 点击发送短信按钮,跳转到发送短信页面 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程 ...
- 脚本控制向Android模拟拨打电话,发送短信,定位设置功能
做行为触发的时候要向模拟器实现拨打电话,发送短信,定位设置的的功能,可以很方便通过telnet localhost 5554实现. 写个脚本很快的搞定了.网上资料很多,脚本的很少,也所积点德啦. 写 ...
- Android手机上监听短信的两种方式
Android手机上监听短信有两种方式: 1. 接受系统的短信广播,操作短信内容. 优点:操作方便,适合简单的短信应用. 缺点:来信会在状态栏显示通知信息. AndroidManifest.xml: ...
- Android -- 怎么发出和接收广播, Broadcast, 电话拨号拦截,短信拦截
1. 发送广播 使用以下三个API可以发送广播 public void click(View view){ Intent intent = new Intent(); intent.setAction ...
- java攻城师之路(Android篇)--搭建开发环境、拨打电话、发送短信、布局例子
一.搭建开发环境 1.所需资源 JDK6以上 Eclipse3.6以上 SDK17, 2.3.3 ADT17 2.安装注意事项 不要使用中文路径 如果模拟器默认路径包含中文, 可以设置android_ ...
随机推荐
- 47: error: undefined reference to `QWebView::QWebView(QWidget*)'
QT 5.6版本 用Qt界面设计器打开界面文件,在界面上托入QWebView控件,这时运行会出现错误,错误如下: ......... undefined reference to `QWebView ...
- [xdoj1227]Godv的数列(crt+lucas)
解题关键:1001=7*11*13,模数非常小,直接暴力lucas.递归次数几乎为很小的常数.最后用中国剩余定理组合一下即可. 模数很小时,一定记住lucas定理的作用 http://acm.xidi ...
- 面试题: 数据库 sql优化 sql练习题 有用 学生表,课程表,成绩表,教师表 练习
什么是存储过程?有哪些优缺点? 什么是存储过程?有哪些优缺点? 存储过程就像我们编程语言中的函数一样,封装了我们的代码(PLSQL.T-SQL). 存储过程的优点: 能够将代码封装起来 保存在数据库之 ...
- jquery中的$.ajax()的源码分析
针对获取到location.href的兼容代码: try { ajaxLocation = location.href; } catch( e ) { // Use the href attribut ...
- SQL中的row_number() over()解释
有一个面试题目, 有一张表,如下: event_type value time : - : : : : : 需要按照event_type排序,返回同一个event_type的,最近时间和次近时间的两个 ...
- Django 的 之 视图
Django的View(视图) 一个视图函数(类),简称视图, 是个简单的python函数(类),它接受wed请求并且返回web 响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误, ...
- js选中select
function selected(id, val) { $('#' + id + ' option[value="' + val + '"]').attr('selected', ...
- 使用PowerDesigner创建物理模型并生成SQL语句在MySQL中生成表
我使用的PowerDesigner的版本为16.5,创建物理模型后,使用PowerDesigner生成的SQL语句,在MySQL中创建表. 1. 打开Power Designer软件,在弹出的欢迎对话 ...
- cf769D(枚举&位或运算)
题目链接:http://codeforces.com/problemset/problem/769/D 题意:求给出的 n 个数中有多少对数字的二进制形式恰好有 k 位不同 思路:两个数a, b的二进 ...
- XXy
XXy codevs1003 帮我看看 #include<iostream> #include<cstdio> using namespace std; ],map[][],n ...