当前位置: 代码迷 >> Android >> android电话阻截及短信过滤
  详细解决方案

android电话阻截及短信过滤

热度:62   发布时间:2016-05-01 15:26:47.0
android电话拦截及短信过滤

(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. }?
1 楼 yangyongjielove 2011-09-04  
very good!
2 楼 awp258 2011-11-22  
请问 楼主:mITelephony.endCall(); android 1.0以后是不是就没有用了呢?我用的是2.2的系统测试mITelephony.endCall()没有用呀?
3 楼 suyanbingk 2012-03-08  
AndroidManifest.xml加上来
4 楼 pop1030123 2012-04-09  
这种方法拦截的话,来电时,手机界面会首先闪一下正常的来电界面的,闪动时间大概不到1秒,这样不太好。有没有从系统底层去拦截的?
  相关解决方案