这里,我们要实现黑名单中电话拦截的功能,为了侦听电话状态,我们需要获得系统的电话管理器等
// 获取到电话管理者 mTelephonyManager = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE); // 初始化电话状态监听 listener = new MyPhoneStateListener(); // 设置电话监听 // 第一个参数:表示电话状态的监听 // 第二个参数:表示打电话的状态 mTelephonyManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);这是我们自定义的一个电话状态监听
private class MyListener extends PhoneStateListener { @Override public void onCallStateChanged(int state, String incomingNumber) { switch (state) { case TelephonyManager.CALL_STATE_RINGING:// 响铃状态。 String result = dao.findmode(incomingNumber); if ("1".equals(result) || "3".equals(result)) { Log.i(TAG, "挂断电话。。。。"); endCall(); } break; } super.onCallStateChanged(state, incomingNumber); } }当电话铃响时需要挂断电话并且不让该记录显示在界面上,而 Google 工程师为了手机的安全性隐藏
public void endCall() { // IBinder iBinder = ServiceManager.getService(TELEPHONY_SERVICE); try { // 加载servicemanager的字节码 Class clazz = CallBlackSmsService.class.getClassLoader().loadClass( "android.os.ServiceManager"); Method method = clazz.getDeclaredMethod("getService", String.class); IBinder ibinder = (IBinder) method.invoke(null, TELEPHONY_SERVICE); ITelephony.Stub.asInterface(ibinder).endCall(); } catch (Exception e) { e.printStackTrace(); } }endCall()方法用于挂断黑名单的呼入电话,该段代码中首先通过反射获取到 ServiceManager 字节码,