zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

电话拦截详解手机开发

手机开发 详解 拦截 电话
2023-06-13 09:20:14 时间

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

项目目录图:

电话拦截详解手机开发

详细代码如下:


[html]
view plain
copy package com.internal.telephony;    import java.lang.reflect.Method;    import android.content.BroadcastReceiver;  import android.content.Context;  import android.content.Intent;  import android.media.AudioManager;  import android.os.IBinder;  import android.telephony.TelephonyManager;  import android.util.Log;    import com.android.internal.telephony.ITelephony;  import com.internal.main.BlockList;    public class TelInternal extends BroadcastReceiver {     @Override   public void onReceive(Context context, Intent intent) {     AudioManager mAudioManager=(AudioManager)context.getSystemService(Context.AUDIO_SERVICE);   BlockList b=new BlockList(context);     if(intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)){// Log.e( msg ,  calling );     //如果是去电(拨出)   String num=getResultData();     if(num.equals( 12345 )){   setResultData(null); //清除电话   break;   }       }else{ //由于android没有来点广播所以,去掉拨打电话就是来电状态了   // Log.e( msg ,  coming );     String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);   // Log.e( msg ,  State:  + state);     String number = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);   // Log.e( msg ,  Incomng Number:   + number);     if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_RINGING)){Log.e( msg ,  ring );     if(number.equals( 12345 )){//拦截指定的电话号码   //先静音处理   mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);   // Log.e( msg ,  Turn Ringtone Silent );     try {   /* //挂断电话 方法一   Method method = Class.forName(    android.os.ServiceManager ).getMethod(    getService , String.class);   // 获取远程TELEPHONY_SERVICE的IBinder对象的代理   IBinder binder = (IBinder) method.invoke(null,   new Object[] { Context.TELEPHONY_SERVICE });   // 将IBinder对象的代理转换为ITelephony对象   ITelephony telephony = ITelephony.Stub   .asInterface(binder);   // 挂断电话   telephony.endCall(); Log.e( msg ,  end ); */   //挂断电话 方法二   ITelephony iTelephony = getITelephony(context); //获取电话接口   iTelephony.endCall(); // 挂断电话   Log.e( msg ,  end );   } catch (Exception e) {   e.printStackTrace();   }   //再恢复正常铃声   mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);   break;   }     }   }   }   /**   * 根据反射获取end()方法2   * @param context   * @return   */   private static ITelephony getITelephony(Context context) {   ITelephony iTelephony=null;   TelephonyManager mTelephonyManager = (TelephonyManager) context   .getSystemService(Context.TELEPHONY_SERVICE);   Class TelephonyManager  c = TelephonyManager.class;   Method getITelephonyMethod = null;   try {   getITelephonyMethod = c.getDeclaredMethod( getITelephony ,   (Class[]) null); // 获取声明的方法   getITelephonyMethod.setAccessible(true);   } catch (SecurityException e) {   e.printStackTrace();   } catch (NoSuchMethodException e) {   e.printStackTrace();   }     try {   iTelephony = (ITelephony) getITelephonyMethod.invoke(   mTelephonyManager, (Object[]) null); // 获取实例   return iTelephony;   } catch (Exception e) {   e.printStackTrace();   }   return iTelephony;   }    } 
[html]
view plain
copy receiver android:name= com.internal.telephony.TelInternal  android:enabled= true     intent-filter     action android:name= android.intent.action.NEW_OUTGOING_CALL /     action android:name= android.intent.action.PHONE_STATE /     /intent-filter     /receiver  

相关权限:

  uses-permission android:name = android.permission.READ_PHONE_STATE /

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

文件NeighboringCellInfo.aidl源码:


[html]
view plain
copy /* //device/java/android/android/content/Intent.aidl  **  ** Copyright 2007, The Android Open Source Project  **  ** Licensed under the Apache License, Version 2.0 (the  License );  ** you may not use this file except in compliance with the License.  ** You may obtain a copy of the License at  **  ** http://www.apache.org/licenses/LICENSE-2.0  **  ** Unless required by applicable law or agreed to in writing, software  ** distributed under the License is distributed on an  AS IS  BASIS,  ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  ** See the License for the specific language governing permissions and  ** limitations under the License.  */    package android.telephony;    parcelable NeighboringCellInfo; 
[html]
view plain
copy /*   * Copyright (C) 2007 The Android Open Source Project   *   * Licensed under the Apache License, Version 2.0 (the  License );   * you may not use this file except in compliance with the License.   * You may obtain a copy of the License at   *   * http://www.apache.org/licenses/LICENSE-2.0   *   * Unless required by applicable law or agreed to in writing, software   * distributed under the License is distributed on an  AS IS  BASIS,   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   * See the License for the specific language governing permissions and   * limitations under the License.   */    package com.android.internal.telephony;    import android.os.Bundle;  import java.util.List;  import android.telephony.NeighboringCellInfo;    /**   * Interface used to interact with the phone. Mostly this is used by the   * TelephonyManager class. A few places are still using this directly.   * Please clean them up if possible and use TelephonyManager insteadl.   *   * [email protected]}   */  interface ITelephony {     /**   * Dial a number. This doesn t place the call. It displays   * the Dialer screen.   * @param number the number to be dialed. If null, this   * would display the Dialer screen with no number pre-filled.   */   void dial(String number);     /**   * Place a call to the specified number.   * @param number the number to be called.   */   void call(String number);     /**   * If there is currently a call in progress, show the call screen.   * The DTMF dialpad may or may not be visible initially, depending on   * whether it was up when the user last exited the InCallScreen.   *   * @return true if the call screen was shown.   */   boolean showCallScreen();     /**   * Variation of showCallScreen() that also specifies whether the   * DTMF dialpad should be initially visible when the InCallScreen   * comes up.   *   * @param showDialpad if true, make the dialpad visible initially,   * otherwise hide the dialpad initially.   * @return true if the call screen was shown.   *   * @see showCallScreen   */   boolean showCallScreenWithDialpad(boolean showDialpad);     /**   * End call or go to the Home screen   *   * @return whether it hung up   */   boolean endCall();     /**   * Answer the currently-ringing call.   *   * If there s already a current active call, that call will be   * automatically put on hold. If both lines are currently in use, the   * current active call will be ended.   *   * TODO: provide a flag to let the caller specify what policy to use   * if both lines are in use. (The current behavior is hardwired to   *  answer incoming, end ongoing , which is how the CALL button   * is specced to behave.)   *   * TODO: this should be a oneway call (especially since it s called   * directly from the key queue thread).   */   void answerRingingCall();     /**   * Silence the ringer if an incoming call is currently ringing.   * (If vibrating, stop the vibrator also.)   *   * It s safe to call this if the ringer has already been silenced, or   * even if there s no incoming call. (If so, this method will do nothing.)   *   * TODO: this should be a oneway call too (see above).   * (Actually *all* the methods here that return void can   * probably be oneway.)   */   void silenceRinger();     /**   * Check if we are in either an active or holding call   * @return true if the phone state is OFFHOOK.   */   boolean isOffhook();     /**   * Check if an incoming phone call is ringing or call waiting.   * @return true if the phone state is RINGING.   */   boolean isRinging();     /**   * Check if the phone is idle.   * @return true if the phone state is IDLE.   */   boolean isIdle();     /**   * Check to see if the radio is on or not.   * @return returns true if the radio is on.   */   boolean isRadioOn();     /**   * Check if the SIM pin lock is enabled.   * @return true if the SIM pin lock is enabled.   */   boolean isSimPinEnabled();     /**   * Cancels the missed calls notification.   */   void cancelMissedCallsNotification();     /**   * Supply a pin to unlock the SIM. Blocks until a result is determined.   * @param pin The pin to check.   * @return whether the operation was a success.   */   boolean supplyPin(String pin);     /**   * Handles PIN MMI commands (PIN/PIN2/PUK/PUK2), which are initiated   * without SEND (so  code dial /code  is not appropriate).   *   * @param dialString the MMI command to be executed.   * @return true if MMI command is executed.   */   boolean handlePinMmi(String dialString);     /**   * Toggles the radio on or off.   */   void toggleRadioOnOff();     /**   * Set the radio to on or off   */   boolean setRadio(boolean turnOn);     /**   * Request to update location information in service state   */   void updateServiceLocation();     /**   * Enable location update notifications.   */   void enableLocationUpdates();     /**   * Disable location update notifications.   */   void disableLocationUpdates();     /**   * Enable a specific APN type.   */   int enableApnType(String type);     /**   * Disable a specific APN type.   */   int disableApnType(String type);     /**   * Allow mobile data connections.   */   boolean enableDataConnectivity();     /**   * Disallow mobile data connections.   */   boolean disableDataConnectivity();     /**   * Report whether data connectivity is possible.   */   boolean isDataConnectivityPossible();     Bundle getCellLocation();     /**   * Returns the neighboring cell information of the device.   */   List NeighboringCellInfo  getNeighboringCellInfo();     int getCallState();   int getDataActivity();   int getDataState();  } 
[java]
view plain
copy uses-permission android:name= android.permission.CALL_PHONE /     uses-permission android:name= android.permission.PROCESS_OUTGOING_CALLS /