安卓学习笔记之骚扰拦截
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 {
@Override
public 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;
}
//当数据改变时,调用此方法
@Override
public 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 {
//通过类加载器拿到ServiceManager
Class<?> classs = getClassLoader().loadClass("android.os.ServiceManager");
// 通过反射拿到当前方法getService
Method method = classs.getDeclaredMethod("getService", String.class);
// getService的返回值为IBinder对象 即TelephonyManager
IBinder 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文件