Android电话和短信拦截器

本文介绍了一个Android应用程序,能够实现电话和短信的拦截功能。该应用通过注册BroadcastReceiver监听电话状态变化和短信接收事件,对特定号码进行拦截处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

1. 引言

     在Android中实现电话和短信拦截器功能,这个是我从网上找的,并非自己实现,使用时需要修改一下代码(需要拦截的号码),测试已经通过,工程結构和实现如下。

 

2. 工程结构

    工程结构

3. 功能实现

 

    (1) 主界面(main.xml)实现:

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"  
  3.     android:orientation = "vertical"  
  4.     android:layout_width = "fill_parent"  
  5.     android:layout_height = "fill_parent"  
  6.     >  
  7.       
  8.     <Button   
  9.         android:id = "@+id/enableCallTransfer"   
  10.         android:layout_width = "wrap_content"   
  11.         android:layout_height = "wrap_content"   
  12.         android:text = "设置呼叫转移"  
  13.         />  
  14.           
  15.     <Button   
  16.         android:id = "@+id/disableCallTransfer"   
  17.         android:layout_width = "wrap_content"   
  18.         android:layout_height = "wrap_content"   
  19.         android:text = "取消呼叫转移"  
  20.         />     
  21.           
  22. </LinearLayout>   

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns: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实现:

  1. package com.focus.manager;  
  2. import java.lang.reflect.Method;  
  3. import android.app.Activity;  
  4. import android.content.BroadcastReceiver;  
  5. import android.content.Context;  
  6. import android.content.Intent;  
  7. import android.content.IntentFilter;  
  8. import android.media.AudioManager;  
  9. import android.net.Uri;  
  10. import android.os.Bundle;  
  11. import android.os.Handler;  
  12. import android.os.Message;  
  13. import android.telephony.SmsMessage;  
  14. import android.telephony.TelephonyManager;  
  15. import android.util.Log;  
  16. import android.view.View;  
  17. import android.view.View.OnClickListener;  
  18. import com.android.internal.telephony.ITelephony;  
  19. public class CallAndSMSInterceptorActivity extends Activity {  
  20.     //要拦截的号码   
  21.     private final static String BLOCKED_NUMBER = "15555215556";  
  22.       
  23.     private IncomingCallReceiver mIncomingCallReceiver;  
  24.     private ITelephony mITelephony;  
  25.     private AudioManager mAudioManager;  
  26.     //占线时转移,这里13800000000是空号,所以会提示所拨的号码为空号   
  27.     private final String ENABLE_SERVICE = "tel:**67*13800000000%23";  
  28.       
  29.     //占线时转移   
  30.     private final String DISABLE_SERVICE = "tel:%23%2367%23";  
  31.     private final static int OP_REGISTER = 100;  
  32.     private final static int OP_CANCEL = 200;  
  33.       
  34.     @Override  
  35.     public void onCreate(Bundle savedInstanceState) {  
  36.         super.onCreate(savedInstanceState);  
  37.         setContentView(R.layout.main);  
  38.           
  39.         mIncomingCallReceiver = new IncomingCallReceiver();  
  40.           
  41.         IntentFilter mIntentFilter = new IntentFilter();  
  42.         //拦截电话   
  43.         mIntentFilter.addAction("android.intent.action.PHONE_STATE");  
  44.         //拦截短信   
  45.         mIntentFilter.addAction("android.provider.Telephony.SMS_RECEIVED");  
  46.         //注册BroadcastReceiver   
  47.         registerReceiver(mIncomingCallReceiver, mIntentFilter);   
  48.         mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);  
  49.         //利用反射获取隐藏的endcall方法   
  50.         TelephonyManager mTelephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);  
  51.           
  52.         try {  
  53.             Method getITelephonyMethod = TelephonyManager.class.getDeclaredMethod("getITelephony", (Class[]) null);  
  54.             getITelephonyMethod.setAccessible(true);  
  55.             mITelephony = (ITelephony) getITelephonyMethod.invoke(mTelephonyManager, (Object[]) null);  
  56.         } catch (Exception e) {  
  57.             e.printStackTrace();  
  58.         }  
  59.         findViewById(R.id.enableCallTransfer).setOnClickListener(new OnClickListener(){  
  60.             public void onClick(View view) {  
  61.                 //设置呼叫转移   
  62.                 Message message = mHandler.obtainMessage();  
  63.                 message.what = OP_REGISTER;  
  64.                 mHandler.dispatchMessage(message);  
  65.             }  
  66.         });  
  67.           
  68.         findViewById(R.id.disableCallTransfer).setOnClickListener(new OnClickListener(){  
  69.             public void onClick(View view) {  
  70.                 //取消呼叫转移   
  71.                 Message message = mHandler.obtainMessage();  
  72.                 message.what = OP_CANCEL;  
  73.                 mHandler.dispatchMessage(message);  
  74.             }  
  75.         });  
  76.           
  77.     }  
  78.     private class IncomingCallReceiver extends BroadcastReceiver{  
  79.           
  80.         @Override  
  81.         public void onReceive(Context context, Intent intent) {  
  82.             String action = intent.getAction();  
  83.             Log.d("mayingcai""Action:" + action);  
  84.               
  85.             if("android.intent.action.PHONE_STATE".equals(action)){//拦截电话   
  86.                 String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);  
  87.                 Log.i("mayingcai""State: "+ state);  
  88.                   
  89.                 String number = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);  
  90.                 Log.d("mayingcai""Incomng Number: " + number);  
  91.                   
  92.                 if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_RINGING)){//电话正在响铃   
  93.                     if(number.equals(BLOCKED_NUMBER)){//拦截指定的电话号码   
  94.                         //先静音处理   
  95.                         mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);  
  96.                         Log.d("mayingcai""Turn Ringtone Silent");  
  97.                           
  98.                         try {  
  99.                             //挂断电话   
  100.                             mITelephony.endCall();  
  101.                         } catch (Exception e) {  
  102.                             e.printStackTrace();  
  103.                         }  
  104.                           
  105.                         //再恢复正常铃声   
  106.                         mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);  
  107.                     }  
  108.                 }  
  109.             }else if("android.provider.Telephony.SMS_RECEIVED".equals(action)){//拦截短信   
  110.                 SmsMessage sms = getMessagesFromIntent(intent)[0];  
  111.                 String number = sms.getOriginatingAddress();  
  112.                 Log.d("mayingcai""Incomng Number: " + number);  
  113.                 number = trimSmsNumber("+86", number);//把国家代码去除掉   
  114.                 if(number.equals(BLOCKED_NUMBER)){  
  115.                     abortBroadcast();//这句很重要,中断广播后,其他要接收短信的应用都没法收到短信广播了   
  116.                 }  
  117.             }  
  118.         }  
  119.     }  
  120.     public final static SmsMessage[] getMessagesFromIntent(Intent intent) {  
  121.         Object[] messages = (Object[]) intent.getSerializableExtra("pdus");  
  122.         byte[][] pduObjs = new byte[messages.length][];  
  123.         for (int i = 0; i < messages.length; i++) {  
  124.             pduObjs[i] = (byte[]) messages[i];  
  125.         }  
  126.           
  127.         byte[][] pdus = new byte[pduObjs.length][];  
  128.         int pduCount = pdus.length;  
  129.         SmsMessage[] msgs = new SmsMessage[pduCount];  
  130.           
  131.         for (int i = 0; i < pduCount; i++) {  
  132.             pdus[i] = pduObjs[i];  
  133.             msgs[i] = SmsMessage.createFromPdu(pdus[i]);  
  134.         }  
  135.           
  136.         return msgs;  
  137.     }  
  138.       
  139.     public final static String trimSmsNumber(String prefix, String number){  
  140.         String s = number;  
  141.           
  142.         if(prefix.length()>0 && number.startsWith(prefix)){  
  143.             s = number.substring(prefix.length());  
  144.         }  
  145.           
  146.         return s;  
  147.     }  
  148.     private Handler mHandler = new Handler() {  
  149.         public void handleMessage(Message response) {  
  150.             int what = response.what;             
  151.             switch(what) {  
  152.                 case OP_REGISTER:{  
  153.                     Intent i = new Intent(Intent.ACTION_CALL);  
  154.                     i.setData(Uri.parse(ENABLE_SERVICE));  
  155.                     startActivity(i);  
  156.                     break;  
  157.                 }  
  158.                 case OP_CANCEL:{  
  159.                     Intent i = new Intent(Intent.ACTION_CALL);  
  160.                     i.setData(Uri.parse(DISABLE_SERVICE));  
  161.                     startActivity(i);  
  162.                     break;  
  163.                 }  
  164.             }  
  165.         }  
  166.     };  
  167.       
  168. }  

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; } } } }; }

 

ITelephony.aidl

package com.android.internal.telephony;  
interface ITelephony {  
    boolean endCall();  
    }  

 权限:

 

    <uses-permission android:name="android.permission.BROADCAST_SMS"/>
    <uses-permission android:name="android.permission.RECEIVE_SMS"/>
    <uses-permission android:name="android.permission.CALL_PHONE"/>
    <uses-permission android:name="android.permission.CALL_PRIVILEGED"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
    <uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>
    <uses-permission android:name="android.permission.WRITE_SMS"></uses-permission>
    <uses-permission android:name="android.permission.WRITE_CONTACTS"></uses-permission>

 

 

 

 转自:http://blog.youkuaiyun.com/mayingcai1987/article/details/6342261

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值