拦截电话---> 关于利用反射 调用系统 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()



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值