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