android电话拦截及短信过滤
16lz
2021-01-23
(1) 主界面(main.xml)实现:
- <?xmlversion="1.0"encoding="utf-8"?>
- <LinearLayoutxmlns:Android="http://schemas.android.com/apk/res/android"
- Android:orientation="vertical"
- Android:layout_width="fill_parent"
- Android:layout_height="fill_parent"
- >
- <Button
- Android:id="@+id/enableCallTransfer"
- Android:layout_width="wrap_content"
- Android:layout_height="wrap_content"
- Android:text="设置呼叫转移"
- />
- <Button
- Android:id="@+id/disableCallTransfer"
- Android:layout_width="wrap_content"
- Android:layout_height="wrap_content"
- Android:text="取消呼叫转移"
- />
- </LinearLayout>
(2) 主Activity实现:
- packagecom.focus.manager;
- importjava.lang.reflect.Method;
- importAndroid.app.Activity;
- importAndroid.content.BroadcastReceiver;
- importAndroid.content.Context;
- importAndroid.content.Intent;
- importAndroid.content.IntentFilter;
- importAndroid.media.AudioManager;
- importAndroid.net.Uri;
- importAndroid.os.Bundle;
- importAndroid.os.Handler;
- importAndroid.os.Message;
- importAndroid.telephony.SmsMessage;
- importAndroid.telephony.TelephonyManager;
- importAndroid.util.Log;
- importAndroid.view.View;
- importAndroid.view.View.OnClickListener;
- importcom.Android.internal.telephony.ITelephony;
- publicclassCallAndSMSInterceptorActivityextendsActivity{
- //要拦截的号码
- privatefinalstaticStringBLOCKED_NUMBER="15555215556";
- privateIncomingCallReceivermIncomingCallReceiver;
- privateITelephonymITelephony;
- privateAudioManagermAudioManager;
- //占线时转移,这里13800000000是空号,所以会提示所拨的号码为空号
- privatefinalStringENABLE_SERVICE="tel:**67*13800000000%23";
- //占线时转移
- privatefinalStringDISABLE_SERVICE="tel:%23%2367%23";
- privatefinalstaticintOP_REGISTER=100;
- privatefinalstaticintOP_CANCEL=200;
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- mIncomingCallReceiver=newIncomingCallReceiver();
- IntentFiltermIntentFilter=newIntentFilter();
- //拦截电话
- 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方法
- TelephonyManagermTelephonyManager=(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
- try{
- MethodgetITelephonyMethod=TelephonyManager.class.getDeclaredMethod("getITelephony",(Class[])null);
- getITelephonyMethod.setAccessible(true);
- mITelephony=(ITelephony)getITelephonyMethod.invoke(mTelephonyManager,(Object[])null);
- }catch(Exceptione){
- e.printStackTrace();
- }
- findViewById(R.id.enableCallTransfer).setOnClickListener(newOnClickListener(){
- publicvoidonClick(Viewview){
- //设置呼叫转移
- Messagemessage=mHandler.obtainMessage();
- message.what=OP_REGISTER;
- mHandler.dispatchMessage(message);
- }
- });
- findViewById(R.id.disableCallTransfer).setOnClickListener(newOnClickListener(){
- publicvoidonClick(Viewview){
- //取消呼叫转移
- Messagemessage=mHandler.obtainMessage();
- message.what=OP_CANCEL;
- mHandler.dispatchMessage(message);
- }
- });
- }
- privateclassIncomingCallReceiverextendsBroadcastReceiver{
- @Override
- publicvoidonReceive(Contextcontext,Intentintent){
- Stringaction=intent.getAction();
- Log.d("mayingcai","Action:"+action);
- if("Android.intent.action.PHONE_STATE".equals(action)){//拦截电话
- Stringstate=intent.getStringExtra(TelephonyManager.EXTRA_STATE);
- Log.i("mayingcai","State:"+state);
- Stringnumber=intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
- Log.d("mayingcai","IncomngNumber:"+number);
- if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_RINGING)){//电话正在响铃
- if(number.equals(BLOCKED_NUMBER)){//拦截指定的电话号码
- //先静音处理
- mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
- Log.d("mayingcai","TurnRingtoneSilent");
- try{
- //挂断电话
- mITelephony.endCall();
- }catch(Exceptione){
- e.printStackTrace();
- }
- //再恢复正常铃声
- mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
- }
- }
- }elseif("Android.provider.Telephony.SMS_RECEIVED".equals(action)){//拦截短信
- SmsMessagesms=getMessagesFromIntent(intent)[0];
- Stringnumber=sms.getOriginatingAddress();
- Log.d("mayingcai","IncomngNumber:"+number);
- number=trimSmsNumber("+86",number);//把国家代码去除掉
- if(number.equals(BLOCKED_NUMBER)){
- abortBroadcast();//这句很重要,中断广播后,其他要接收短信的应用都没法收到短信广播了
- }
- }
- }
- }
- publicfinalstaticSmsMessage[]getMessagesFromIntent(Intentintent){
- Object[]messages=(Object[])intent.getSerializableExtra("pdus");
- byte[][]pduObjs=newbyte[messages.length][];
- for(inti=0;i<messages.length;i++){
- pduObjs[i]=(byte[])messages[i];
- }
- byte[][]pdus=newbyte[pduObjs.length][];
- intpduCount=pdus.length;
- SmsMessage[]msgs=newSmsMessage[pduCount];
- for(inti=0;i<pduCount;i++){
- pdus[i]=pduObjs[i];
- msgs[i]=SmsMessage.createFromPdu(pdus[i]);
- }
- returnmsgs;
- }
- publicfinalstaticStringtrimSmsNumber(Stringprefix,Stringnumber){
- Strings=number;
- if(prefix.length()>0&&number.startsWith(prefix)){
- s=number.substring(prefix.length());
- }
- returns;
- }
- privateHandlermHandler=newHandler(){
- publicvoidhandleMessage(Messageresponse){
- intwhat=response.what;
- switch(what){
- caseOP_REGISTER:{
- Intenti=newIntent(Intent.ACTION_CALL);
- i.setData(Uri.parse(ENABLE_SERVICE));
- startActivity(i);
- break;
- }
- caseOP_CANCEL:{
- Intenti=newIntent(Intent.ACTION_CALL);
- i.setData(Uri.parse(DISABLE_SERVICE));
- startActivity(i);
- break;
- }
- }
- }
- };
- }
更多相关文章
- Android接收短信
- Android 电话博大流程源码分析
- android 中管理短信
- 浅析Android手机卫士接收短信指令执行相应操作
- Android电话拨打流程源码分析
- 向Android模拟器发短信打电话
- android 获取 imei号码