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

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns: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. <Button
  8. Android:id="@+id/enableCallTransfer"
  9. Android:layout_width="wrap_content"
  10. Android:layout_height="wrap_content"
  11. Android:text="设置呼叫转移"
  12. />
  13. <Button
  14. Android:id="@+id/disableCallTransfer"
  15. Android:layout_width="wrap_content"
  16. Android:layout_height="wrap_content"
  17. Android:text="取消呼叫转移"
  18. />
  19. </LinearLayout>

(2) 主Activity实现:

  1. packagecom.focus.manager;
  2. importjava.lang.reflect.Method;
  3. importAndroid.app.Activity;
  4. importAndroid.content.BroadcastReceiver;
  5. importAndroid.content.Context;
  6. importAndroid.content.Intent;
  7. importAndroid.content.IntentFilter;
  8. importAndroid.media.AudioManager;
  9. importAndroid.net.Uri;
  10. importAndroid.os.Bundle;
  11. importAndroid.os.Handler;
  12. importAndroid.os.Message;
  13. importAndroid.telephony.SmsMessage;
  14. importAndroid.telephony.TelephonyManager;
  15. importAndroid.util.Log;
  16. importAndroid.view.View;
  17. importAndroid.view.View.OnClickListener;
  18. importcom.Android.internal.telephony.ITelephony;
  19. publicclassCallAndSMSInterceptorActivityextendsActivity{
  20. //要拦截的号码
  21. privatefinalstaticStringBLOCKED_NUMBER="15555215556";
  22. privateIncomingCallReceivermIncomingCallReceiver;
  23. privateITelephonymITelephony;
  24. privateAudioManagermAudioManager;
  25. //占线时转移,这里13800000000是空号,所以会提示所拨的号码为空号
  26. privatefinalStringENABLE_SERVICE="tel:**67*13800000000%23";
  27. //占线时转移
  28. privatefinalStringDISABLE_SERVICE="tel:%23%2367%23";
  29. privatefinalstaticintOP_REGISTER=100;
  30. privatefinalstaticintOP_CANCEL=200;
  31. @Override
  32. publicvoidonCreate(BundlesavedInstanceState){
  33. super.onCreate(savedInstanceState);
  34. setContentView(R.layout.main);
  35. mIncomingCallReceiver=newIncomingCallReceiver();
  36. IntentFiltermIntentFilter=newIntentFilter();
  37. //拦截电话
  38. mIntentFilter.addAction("Android.intent.action.PHONE_STATE");
  39. //拦截短信
  40. mIntentFilter.addAction("Android.provider.Telephony.SMS_RECEIVED");
  41. //注册BroadcastReceiver
  42. registerReceiver(mIncomingCallReceiver,mIntentFilter);
  43. mAudioManager=(AudioManager)getSystemService(Context.AUDIO_SERVICE);
  44. //利用反射获取隐藏的endcall方法
  45. TelephonyManagermTelephonyManager=(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
  46. try{
  47. MethodgetITelephonyMethod=TelephonyManager.class.getDeclaredMethod("getITelephony",(Class[])null);
  48. getITelephonyMethod.setAccessible(true);
  49. mITelephony=(ITelephony)getITelephonyMethod.invoke(mTelephonyManager,(Object[])null);
  50. }catch(Exceptione){
  51. e.printStackTrace();
  52. }
  53. findViewById(R.id.enableCallTransfer).setOnClickListener(newOnClickListener(){
  54. publicvoidonClick(Viewview){
  55. //设置呼叫转移
  56. Messagemessage=mHandler.obtainMessage();
  57. message.what=OP_REGISTER;
  58. mHandler.dispatchMessage(message);
  59. }
  60. });
  61. findViewById(R.id.disableCallTransfer).setOnClickListener(newOnClickListener(){
  62. publicvoidonClick(Viewview){
  63. //取消呼叫转移
  64. Messagemessage=mHandler.obtainMessage();
  65. message.what=OP_CANCEL;
  66. mHandler.dispatchMessage(message);
  67. }
  68. });
  69. }
  70. privateclassIncomingCallReceiverextendsBroadcastReceiver{
  71. @Override
  72. publicvoidonReceive(Contextcontext,Intentintent){
  73. Stringaction=intent.getAction();
  74. Log.d("mayingcai","Action:"+action);
  75. if("Android.intent.action.PHONE_STATE".equals(action)){//拦截电话
  76. Stringstate=intent.getStringExtra(TelephonyManager.EXTRA_STATE);
  77. Log.i("mayingcai","State:"+state);
  78. Stringnumber=intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
  79. Log.d("mayingcai","IncomngNumber:"+number);
  80. if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_RINGING)){//电话正在响铃
  81. if(number.equals(BLOCKED_NUMBER)){//拦截指定的电话号码
  82. //先静音处理
  83. mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
  84. Log.d("mayingcai","TurnRingtoneSilent");
  85. try{
  86. //挂断电话
  87. mITelephony.endCall();
  88. }catch(Exceptione){
  89. e.printStackTrace();
  90. }
  91. //再恢复正常铃声
  92. mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
  93. }
  94. }
  95. }elseif("Android.provider.Telephony.SMS_RECEIVED".equals(action)){//拦截短信
  96. SmsMessagesms=getMessagesFromIntent(intent)[0];
  97. Stringnumber=sms.getOriginatingAddress();
  98. Log.d("mayingcai","IncomngNumber:"+number);
  99. number=trimSmsNumber("+86",number);//把国家代码去除掉
  100. if(number.equals(BLOCKED_NUMBER)){
  101. abortBroadcast();//这句很重要,中断广播后,其他要接收短信的应用都没法收到短信广播了
  102. }
  103. }
  104. }
  105. }
  106. publicfinalstaticSmsMessage[]getMessagesFromIntent(Intentintent){
  107. Object[]messages=(Object[])intent.getSerializableExtra("pdus");
  108. byte[][]pduObjs=newbyte[messages.length][];
  109. for(inti=0;i<messages.length;i++){
  110. pduObjs[i]=(byte[])messages[i];
  111. }
  112. byte[][]pdus=newbyte[pduObjs.length][];
  113. intpduCount=pdus.length;
  114. SmsMessage[]msgs=newSmsMessage[pduCount];
  115. for(inti=0;i<pduCount;i++){
  116. pdus[i]=pduObjs[i];
  117. msgs[i]=SmsMessage.createFromPdu(pdus[i]);
  118. }
  119. returnmsgs;
  120. }
  121. publicfinalstaticStringtrimSmsNumber(Stringprefix,Stringnumber){
  122. Strings=number;
  123. if(prefix.length()>0&&number.startsWith(prefix)){
  124. s=number.substring(prefix.length());
  125. }
  126. returns;
  127. }
  128. privateHandlermHandler=newHandler(){
  129. publicvoidhandleMessage(Messageresponse){
  130. intwhat=response.what;
  131. switch(what){
  132. caseOP_REGISTER:{
  133. Intenti=newIntent(Intent.ACTION_CALL);
  134. i.setData(Uri.parse(ENABLE_SERVICE));
  135. startActivity(i);
  136. break;
  137. }
  138. caseOP_CANCEL:{
  139. Intenti=newIntent(Intent.ACTION_CALL);
  140. i.setData(Uri.parse(DISABLE_SERVICE));
  141. startActivity(i);
  142. break;
  143. }
  144. }
  145. }
  146. };
  147. }

更多相关文章

  1. Android接收短信
  2. Android 电话博大流程源码分析
  3. android 中管理短信
  4. 浅析Android手机卫士接收短信指令执行相应操作
  5. Android电话拨打流程源码分析
  6. 向Android模拟器发短信打电话
  7. android 获取 imei号码

随机推荐

  1. Android中launchMode模式详解
  2. Parcelable序列化
  3. 适配不同的Android屏幕
  4. Application.mk文件详解
  5. android之ListView和BaseAdapter的组合使
  6. android开机自启动失败的原因
  7. 上官网学android之四(Supporting Differen
  8. Android(安卓)handler使用方法
  9. 2019-01-28 Android(安卓)自定义view
  10. Android的framework层是如何对铃声的音量