电话拦截

首先需要 android 源码文件NeighboringCellInfo.aidl和ITelephony.aidl,新建文件夹android.telephony(文件名必须为这个名称),将文件NeighboringCellInfo.aidl拷贝到该文件夹下,在新建另一个文件夹com.android.internal.telephony(不必须名称),将文件ITelephony.aidl放入刷新项目目录,会看到在gen目录下生成相应类代码。

项目目录图:

详细代码如下:

[html] view plaincopy

  1. package com.internal.telephony;  
  2.   
  3. import java.lang.reflect.Method;  
  4.   
  5. import android.content.BroadcastReceiver;  
  6. import android.content.Context;  
  7. import android.content.Intent;  
  8. import android.media.AudioManager;  
  9. import android.os.IBinder;  
  10. import android.telephony.TelephonyManager;  
  11. import android.util.Log;  
  12.   
  13. import com.android.internal.telephony.ITelephony;  
  14. import com.internal.main.BlockList;  
  15.   
  16. public class TelInternal extends BroadcastReceiver {  
  17.   
  18.     @Override  
  19.     public void onReceive(Context context, Intent intent) {  
  20.   
  21.         AudioManager mAudioManager=(AudioManager)context.getSystemService(Context.AUDIO_SERVICE);  
  22.         BlockList b=new BlockList(context);   
  23.           
  24.         if(intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)){//  Log.e("msg", "calling");     
  25.             
  26.         //如果是去电(拨出)    
  27.             String num=getResultData();  
  28.               
  29.             if(num.equals("12345")){  
  30.             setResultData(null); //清除电话  
  31.             break;  
  32.             }  
  33.               
  34.               
  35.         }else{ //由于android没有来点广播所以,去掉拨打电话就是来电状态了  
  36.             // Log.e("msg", "coming");     
  37.               
  38.              String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);     
  39.            //  Log.e("msg", "State: "+ state);     
  40.                   
  41.              String number = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);     
  42.            //  Log.e("msg", "Incomng Number: " + number);     
  43.                   
  44.              if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_RINGING)){Log.e("msg", "ring");  
  45.               
  46.                  if(number.equals("12345")){//拦截指定的电话号码     
  47.                      //先静音处理     
  48.                      mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);     
  49.               //       Log.e("msg", "Turn Ringtone Silent");     
  50.                           
  51.                      try {     
  52.                         /* //挂断电话   方法一  
  53.                          Method method = Class.forName(  
  54.                                 "android.os.ServiceManager").getMethod(  
  55.                                 "getService", String.class);  
  56.                             // 获取远程TELEPHONY_SERVICE的IBinder对象的代理  
  57.                             IBinder binder = (IBinder) method.invoke(null,  
  58.                                 new Object[] { Context.TELEPHONY_SERVICE });  
  59.                             // 将IBinder对象的代理转换为ITelephony对象  
  60.                             ITelephony telephony = ITelephony.Stub  
  61.                                 .asInterface(binder);  
  62.                             // 挂断电话  
  63.                             telephony.endCall();  Log.e("msg", "end"); */   
  64.                         //挂断电话   方法二  
  65.                          ITelephony  iTelephony = getITelephony(context); //获取电话接口  
  66.                           iTelephony.endCall(); // 挂断电话  
  67.                           Log.e("msg", "end");  
  68.                      } catch (Exception e) {     
  69.                          e.printStackTrace();     
  70.                      }     
  71.                      //再恢复正常铃声     
  72.                      mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);     
  73.                      break;  
  74.                  }     
  75.                
  76.              }  
  77.          }  
  78.     }  
  79.     /**  
  80.      * 根据反射获取end()方法2  
  81.      * @param context  
  82.      * @return  
  83.      */  
  84.      private static ITelephony getITelephony(Context context) {  
  85.          ITelephony iTelephony=null;  
  86.             TelephonyManager mTelephonyManager = (TelephonyManager) context  
  87.                     .getSystemService(Context.TELEPHONY_SERVICE);  
  88.             Class<TelephonyManager> c = TelephonyManager.class;  
  89.             Method getITelephonyMethod = null;  
  90.             try {  
  91.                 getITelephonyMethod = c.getDeclaredMethod("getITelephony",  
  92.                         (Class[]) null); // 获取声明的方法  
  93.                 getITelephonyMethod.setAccessible(true);  
  94.             } catch (SecurityException e) {  
  95.                 e.printStackTrace();  
  96.             } catch (NoSuchMethodException e) {  
  97.                 e.printStackTrace();  
  98.             }  
  99.   
  100.             try {  
  101.                 iTelephony = (ITelephony) getITelephonyMethod.invoke(  
  102.                         mTelephonyManager, (Object[]) null); // 获取实例  
  103.                 return iTelephony;  
  104.             } catch (Exception e) {  
  105.                 e.printStackTrace();  
  106.             }  
  107.             return iTelephony;  
  108.         }  
  109.        
  110. }  

注册广播:

[html] view plaincopy

  1. <receiver android:name="com.internal.telephony.TelInternal" android:enabled="true">  
  2.          <intent-filter>  
  3.           <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>  
  4.           <action android:name="android.intent.action.PHONE_STATE"/>  
  5.          </intent-filter>  
  6.        </receiver>  

相关权限:

 <uses-permission android:name = "android.permission.READ_PHONE_STATE"/>

为了方便大家我把文件NeighboringCellInfo.aidl和ITelephony.aidl源码复制到这里供大家使用:

文件NeighboringCellInfo.aidl源码:

[html] view plaincopy

  1. /* //device/java/android/android/content/Intent.aidl  
  2. **  
  3. ** Copyright 2007, The Android Open Source Project  
  4. **  
  5. ** Licensed under the Apache License, Version 2.0 (the "License");  
  6. ** you may not use this file except in compliance with the License.  
  7. ** You may obtain a copy of the License at  
  8. **  
  9. **     http://www.apache.org/licenses/LICENSE-2.0  
  10. **  
  11. ** Unless required by applicable law or agreed to in writing, software  
  12. ** distributed under the License is distributed on an "AS IS" BASIS,  
  13. ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  
  14. ** See the License for the specific language governing permissions and  
  15. ** limitations under the License.  
  16. */  
  17.   
  18. package android.telephony;  
  19.   
  20. parcelable NeighboringCellInfo;  

文件ITelephony.aidl源码:

[html] view plaincopy

  1. /*  
  2.  * Copyright (C) 2007 The Android Open Source Project  
  3.  *  
  4.  * Licensed under the Apache License, Version 2.0 (the "License");  
  5.  * you may not use this file except in compliance with the License.  
  6.  * You may obtain a copy of the License at  
  7.  *  
  8.  *      http://www.apache.org/licenses/LICENSE-2.0  
  9.  *  
  10.  * Unless required by applicable law or agreed to in writing, software  
  11.  * distributed under the License is distributed on an "AS IS" BASIS,  
  12.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  
  13.  * See the License for the specific language governing permissions and  
  14.  * limitations under the License.  
  15.  */  
  16.   
  17. package com.android.internal.telephony;  
  18.   
  19. import android.os.Bundle;  
  20. import java.util.List;  
  21. import android.telephony.NeighboringCellInfo;  
  22.   
  23. /**  
  24.  * Interface used to interact with the phone.  Mostly this is used by the   
  25.  * TelephonyManager class.  A few places are still using this directly.  
  26.  * Please clean them up if possible and use TelephonyManager insteadl.  
  27.  *  
  28.  * {@hide}  
  29.  */  
  30. interface ITelephony {  
  31.   
  32.     /**  
  33.      * Dial a number. This doesn't place the call. It displays  
  34.      * the Dialer screen.  
  35.      * @param number the number to be dialed. If null, this  
  36.      * would display the Dialer screen with no number pre-filled.  
  37.      */  
  38.     void dial(String number);  
  39.   
  40.     /**  
  41.      * Place a call to the specified number.  
  42.      * @param number the number to be called.  
  43.      */  
  44.     void call(String number);  
  45.   
  46.     /**  
  47.      * If there is currently a call in progress, show the call screen.  
  48.      * The DTMF dialpad may or may not be visible initially, depending on  
  49.      * whether it was up when the user last exited the InCallScreen.  
  50.      *  
  51.      * @return true if the call screen was shown.  
  52.      */  
  53.     boolean showCallScreen();  
  54.   
  55.     /**  
  56.      * Variation of showCallScreen() that also specifies whether the  
  57.      * DTMF dialpad should be initially visible when the InCallScreen  
  58.      * comes up.  
  59.      *  
  60.      * @param showDialpad if true, make the dialpad visible initially,  
  61.      *                    otherwise hide the dialpad initially.  
  62.      * @return true if the call screen was shown.  
  63.      *  
  64.      * @see showCallScreen  
  65.      */  
  66.     boolean showCallScreenWithDialpad(boolean showDialpad);  
  67.   
  68.     /**  
  69.      * End call or go to the Home screen  
  70.      *  
  71.      * @return whether it hung up  
  72.      */  
  73.     boolean endCall();  
  74.   
  75.     /**  
  76.      * Answer the currently-ringing call.  
  77.      *  
  78.      * If there's already a current active call, that call will be  
  79.      * automatically put on hold.  If both lines are currently in use, the  
  80.      * current active call will be ended.  
  81.      *  
  82.      * TODO: provide a flag to let the caller specify what policy to use  
  83.      * if both lines are in use.  (The current behavior is hardwired to  
  84.      * "answer incoming, end ongoing", which is how the CALL button  
  85.      * is specced to behave.)  
  86.      *  
  87.      * TODO: this should be a oneway call (especially since it's called  
  88.      * directly from the key queue thread).  
  89.      */  
  90.     void answerRingingCall();  
  91.   
  92.     /**  
  93.      * Silence the ringer if an incoming call is currently ringing.  
  94.      * (If vibrating, stop the vibrator also.)  
  95.      *  
  96.      * It's safe to call this if the ringer has already been silenced, or  
  97.      * even if there's no incoming call.  (If so, this method will do nothing.)  
  98.      *  
  99.      * TODO: this should be a oneway call too (see above).  
  100.      *       (Actually *all* the methods here that return void can  
  101.      *       probably be oneway.)  
  102.      */  
  103.     void silenceRinger();  
  104.   
  105.     /**  
  106.      * Check if we are in either an active or holding call  
  107.      * @return true if the phone state is OFFHOOK.  
  108.      */  
  109.     boolean isOffhook();  
  110.   
  111.     /**  
  112.      * Check if an incoming phone call is ringing or call waiting.  
  113.      * @return true if the phone state is RINGING.  
  114.      */  
  115.     boolean isRinging();  
  116.   
  117.     /**  
  118.      * Check if the phone is idle.  
  119.      * @return true if the phone state is IDLE.  
  120.      */  
  121.     boolean isIdle();  
  122.   
  123.     /**  
  124.      * Check to see if the radio is on or not.  
  125.      * @return returns true if the radio is on.  
  126.      */  
  127.     boolean isRadioOn();  
  128.   
  129.     /**  
  130.      * Check if the SIM pin lock is enabled.  
  131.      * @return true if the SIM pin lock is enabled.  
  132.      */  
  133.     boolean isSimPinEnabled();  
  134.   
  135.     /**  
  136.      * Cancels the missed calls notification.  
  137.      */  
  138.     void cancelMissedCallsNotification();   
  139.   
  140.     /**  
  141.      * Supply a pin to unlock the SIM.  Blocks until a result is determined.  
  142.      * @param pin The pin to check.  
  143.      * @return whether the operation was a success.  
  144.      */  
  145.     boolean supplyPin(String pin);  
  146.   
  147.     /**  
  148.      * Handles PIN MMI commands (PIN/PIN2/PUK/PUK2), which are initiated  
  149.      * without SEND (so <code>dial</code> is not appropriate).  
  150.      *   
  151.      * @param dialString the MMI command to be executed.  
  152.      * @return true if MMI command is executed.  
  153.      */  
  154.     boolean handlePinMmi(String dialString);  
  155.   
  156.     /**  
  157.      * Toggles the radio on or off.  
  158.      */  
  159.     void toggleRadioOnOff();  
  160.   
  161.     /**  
  162.      * Set the radio to on or off  
  163.      */  
  164.     boolean setRadio(boolean turnOn);  
  165.   
  166.     /**  
  167.      * Request to update location information in service state  
  168.      */  
  169.     void updateServiceLocation();  
  170.   
  171.     /**  
  172.      * Enable location update notifications.  
  173.      */  
  174.     void enableLocationUpdates();  
  175.   
  176.     /**  
  177.      * Disable location update notifications.  
  178.      */  
  179.     void disableLocationUpdates();  
  180.   
  181.     /**  
  182.      * Enable a specific APN type.  
  183.      */  
  184.     int enableApnType(String type);  
  185.   
  186.     /**  
  187.      * Disable a specific APN type.  
  188.      */  
  189.     int disableApnType(String type);  
  190.   
  191.     /**  
  192.      * Allow mobile data connections.  
  193.      */  
  194.     boolean enableDataConnectivity();  
  195.   
  196.     /**  
  197.      * Disallow mobile data connections.  
  198.      */  
  199.     boolean disableDataConnectivity();  
  200.   
  201.     /**  
  202.      * Report whether data connectivity is possible.  
  203.      */  
  204.     boolean isDataConnectivityPossible();  
  205.   
  206.     Bundle getCellLocation();  
  207.   
  208.     /**  
  209.      * Returns the neighboring cell information of the device.  
  210.      */  
  211.     List<NeighboringCellInfo> getNeighboringCellInfo();  
  212.   
  213.      int getCallState();  
  214.      int getDataActivity();  
  215.      int getDataState();  
  216. }  

最后千万别忘了添加权限呀!

[java] view plaincopy

  1. <uses-permission android:name="android.permission.CALL_PHONE"/>    
  2.     <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>  

ok,希望对大家有帮助!

时间: 2024-11-05 16:41:55

电话拦截的相关文章

360手机卫士怎么设置骚扰电话拦截?

  360手机卫士怎么设置骚扰电话拦截? 1.打开手机桌面的360卫士,在常用功能选项页面里有一个"骚扰拦截"设置选项,点击打开. 2.进入之后,会看到"垃圾短信"."骚扰电话"和"拦截设置"三个选项.在页面下面是"一键清空"和"举报短信"两个选项."垃圾短信"中显示的是拦截的所有短信,对不爽的短信进行举报,虽然至今小编没有得到什么反馈. 3.在"骚扰电话&

android 广播机制,短信电话 拦截

问题描述 android 广播机制,短信电话 拦截 我需要做的是一个安卓小项目,广播机制实现对短信.电话 的拦截,电话短信 均为sqlite数据库的两张表 ,求大神指定? 解决方案 android 关于特定短信电话拦截android短信和广播机制android--广播及短信拦截 解决方案二: 电话 contacts2.db 短信 mmssms.db 解决方案三: http://blog.sina.com.cn/s/blog_a28e3dd901018wky.html

WiFi万能钥匙发布iOS4.0新增骚扰电话拦截功能

近日,连尚网络旗下产品WiFi万能钥匙发布了iOS4.0最新版本.根据用户的需求反馈,WiFi万能钥匙iOS4.0新增了骚扰电话拦截等多个功能.版本更新后,WiFi万能钥匙在连接成功率和使用流畅程度上实现了完美跃升,这也是WiFi万能钥匙继iOS3.3.0版本实现"一键免费连接WiFi"后的又一次突破. 在最新的iOS4.0版本中,连接的稳定性.连接速度更进一步提高,用户在使用上能够有明显的连接更为流畅的感受.目前,WiFi万能钥匙的连接成功率接近80%,远高于同行水平.同时,新版本完

aidl-怎么使用AIDL进行电话拦截?

问题描述 怎么使用AIDL进行电话拦截? 拦截方式都有哪几种啊?现在对这个问题有点不清楚,请大家解释一下,非常感谢! 解决方案 写一个服务吧 利用反射拦截 我做过这个东西

Android 实现电话拦截及拦截提示音功能的开发_Android

  本文所讲的内容是在Android系统中如何写程序进行电话拦截,并发出拦截提示音提醒用户,可以说此功能还是比较实用的.        1.电话拦截        这个功能大家可能都知道了,就是利用反射原理调用ITelephony的隐藏方法来实现.        2.拦截后提示忙音/空号/已关机/已停机        这个功能其实是要用到MMI指令,具体如何设置呼叫转移的指定可以参考这里 http://baike.baidu.com/view/206402.html?fromTaglist.  

魅蓝Note5骚扰电话拦截设置方法 魅蓝note5设置防骚扰电话教程

1)首先打开电话应用,在拨号界面点击右上角的三个小点图标,会出现二级菜单,选择[设置],进入电话设置后点击[骚扰拦截]选项.(如下图)   2)进入骚扰拦截界面点击右上角齿轮图标,然后继续点击[电话拦截].(如下图)   3)接下来只要根据自己需求选择拦截模式开启相应的开关就可以了.(如下图)

android电话拦截

其实大家可以下载 xxx卫士看下,它设置来电拒接模式后,都是会启动设置MMI指令的界面.然后再去"设置->通话设置->来电转接",看看 "占线时转接" 设置好的电话号码,就可以知道空号/已关机/已停机对应的电话号码是什么了.        1.修改一下BLOCKED_NUMBER这个变量值,把它设置为你要测试拦截的电话号码.        2.全部功能是在一个Activity里实现的,所以大家要先运行这个Activity,然后点击"设置呼叫转移

Android开发四大组件之实现电话拦截和电话录音_Android

一.问题描述 使用BordercastReceiver和Service组件实现下述功能: 1.当手机处于来电状态,启动监听服务,对来电进行监听录音. 2.设置电话黑名单,当来电是黑名单电话,则直接挂断. 当拨打电话或电话状态发生改变时,系统就会发出有序广播,因此我们可以使用BordercastReceiver接受广播,因BordercastReceiver执行时间短不能执行耗时任务也不能使用子线程,因此我们应启动一个Service来监听电话并进行处理 二.加入AIDL文件 Android没有对外

android电话、短信黑白名单拦截、电话录音

功能描述:  总的来说这是一个防骚扰的应用,设置黑名单,白名单,通话录音名单.添加到黑名单的联系人或号码将被拒绝来电或短信:添加到白名单的联系人或号码将通过来电或短信(除白名单以外的号码将被拒绝来电或短信),因此逻辑上黑名单和白名单是不能同时开启的:添加到通话录音列表的联系人或号码,连接通话时将会开启录音,挂断时完成录音. 先上图,接着分析实现这几个部分的关键技术点,最后附上安装程序apk和工程源码.     要重点具备的知识: 电话拦截部分:   电话是手机最基本的服务,自然在系统服务中可以获