安卓学习笔记之骚扰拦截
1、监听电话状态
2、检测来电号码是否匹配拦截条件
3、若匹配,则挂断电话
实例代码:
获取TelephonyManager 对象,并监听来电状态
TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);MPhoneStateListener listener = new MPhoneStateListener();tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
MPhoneStateListener电话状态监听类
class MPhoneStateListener extends PhoneStateListener {@Overridepublic void onCallStateChanged(int state, String incomingNumber) {super.onCallStateChanged(state, incomingNumber);switch (state) {case TelephonyManager.CALL_STATE_RINGING:if (db.isNumberExist(incomingNumber)) {String mode = db.getMode(incomingNumber);if (mode.equals(MODE_PHONE_TEXT) | mode.equals(MODE_ONLY_PHONE)) {//挂断电话endCall();Uri uri = Uri.parse("content://call_log/calls");getContentResolver().registerContentObserver(uri , true,new MContentObserver(new Handler(),incomingNumber));}};break;}}}
class MContentObserver extends ContentObserver{private String inCompingNumber;/*** @param handler* @param inCompingNumber*/public MContentObserver(Handler handler, String inCompingNumber) {super(handler);this.inCompingNumber = inCompingNumber;}//当数据改变时,调用此方法@Overridepublic void onChange(boolean selfChange) {super.onChange(selfChange);deleteCallLog(inCompingNumber);getContentResolver().unregisterContentObserver(this);}
/*** 删除来电号码记录* @param inCompingNumber * */private void deleteCallLog(String inCompingNumber) {Uri uri = Uri.parse("content://call_logs/call");getContentResolver().delete(uri, "number=?", new String[]{inCompingNumber});}
/*** 挂断电话*/private void endCall() {try {//通过类加载器拿到ServiceManagerClass<?> classs = getClassLoader().loadClass("android.os.ServiceManager");// 通过反射拿到当前方法getServiceMethod method = classs.getDeclaredMethod("getService", String.class);// getService的返回值为IBinder对象 即TelephonyManagerIBinder binder = (IBinder) method.invoke(null, TELEPHONY_SERVICE);ITelephony iTelephony = ITelephony.Stub.asInterface(binder);// 挂断电话iTelephony.endCall();} catch (ClassNotFoundException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();} catch (RemoteException e) {e.printStackTrace();}}
需要权限
<uses-permission android:name="android.permission.READ_PHONE_STATE"/><uses-permission android:name="android.permission.CALL_PHONE"/>
还要添加两个aidl文件