安卓学习笔记之骚扰拦截

安卓学习笔记之骚扰拦截


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文件
aidl文件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值