首先 需要知道 关于电话的操作 都在 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()