Android电话和短信拦截器

Android电话和短信拦截器

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>   

    (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.  }  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值