拦截电话---> 关于利用反射 调用系统 hiden的 方法

首先 需要知道  关于电话的操作 都在 TelephonyManager这个 类中  


//初始化 TelephonyManager 
TelephonyManager mTelephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
如果想监听 电话事件   需要给 TelephonyManager 设置 一个监听  即  listen方法  

MyPhoneListener myPhoneListener = new MyPhoneListener();
		mTelephonyManager.listen(myPhoneListener,
				PhoneStateListener.LISTEN_CALL_STATE);
需要实现PhoneStateListener  这个监听方法:

class MyPhoneListener extends PhoneStateListener {

		@Override
		public void onCallStateChanged(int state, String incomingNumber) {

			switch (state) {
			case TelephonyManager.CALL_STATE_IDLE:

				break;
			case TelephonyManager.CALL_STATE_OFFHOOK:

				break;
			case TelephonyManager.CALL_STATE_RINGING:
				if (incomingNumber.equals(et.getText().toString().trim())) {
					Toast.makeText(getApplicationContext(), "adfadg", 0).show();
					System.out.println("被哥拦截了");
					// 下面 执行挂断操作
					endCall();

				}

				break;
			default:
				break;
			}
		}

	}
挂断操作  需要调用 endCall()方法 但是 这个方法只在android1.5 之前 可以使用  之后 被隐藏了  所以 若想 使用这个方法 可以使用反射的方法使用  

所谓反射 就是可以调用或者修改 方法的权限  属性 等。。。。

public void endCall() {
		try {
			Class<?> clazz = getClassLoader().loadClass(   //调用类加载器  参数是 要调用的类的  完整包名
					"android.os.ServiceManager");
			Method method = clazz.getDeclaredMethod("getService", String.class); //  参数是  方法的名字 和方法的参数类型 
			IBinder iBinder = (IBinder) method.invoke(null,     
					Context.TELEPHONY_SERVICE);     
			ITelephony iTelephony = ITelephony.Stub.asInterface(iBinder);  //  此处关系到ALDT  还没深究  日后探寻
			iTelephony.endCall();

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
 这样 就可以调用系统隐藏的函数了   endCall()



你可能感兴趣的:(拦截电话---> 关于利用反射 调用系统 hiden的 方法)