zoukankan      html  css  js  c++  java
  • Android实现屏蔽微信拉黑和删除联系人功能

    实现效果:

    让微信永远弹不出那个删除的对话框不就相当于屏蔽掉该功能了吗?哈哈效果如图:

                

    实现原理:

    同样是利用AccessibilityService辅助服务,关于这个服务类还不了解的同学可以先看下我前两篇的博客,原理都一样:

    http://www.cnblogs.com/cxk1995/p/6363574.html(抢红包)

    http://www.cnblogs.com/cxk1995/p/6366273.html(监听微信聊天)

    1.我们知道,其实微信每次删除联系人都会弹出此页面

    2.如果你对AccessibilityService有过了解或者有看过我之前的两篇博客,你会知道,其实每次弹出这个框,都会触发AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED这个事件,所以我们只要在每次触发该事件的时候进行判断当前页面是不是处于删除联系人对话框,如果是,我们模拟点击取消按钮。思路什么的其实都很简单,可以直接看下代码:

    package com.cxk.wechatdeletefail;
    
    import android.accessibilityservice.AccessibilityService;
    import android.content.Intent;
    import android.text.TextUtils;
    import android.view.accessibility.AccessibilityEvent;
    import android.view.accessibility.AccessibilityNodeInfo;
    import android.widget.Toast;
    
    /**
     * Created by cxk on 2017/2/9.
     * <p>
     * email:471497226@qq.com
     * <p>
     * 屏蔽微信"删除联系人"和"拉黑"功能
     */
    
    public class DeleteFailService extends AccessibilityService {
    
        /**
         * 判断是不是删除联系人弹框
         */
        private boolean isDeleteDialog;
        /**
         * 判断是不是拉黑联系人弹框
         */
        private boolean isDefriendDialog;
    
        @Override
        public void onAccessibilityEvent(AccessibilityEvent event) {
            int eventType = event.getEventType();
            switch (eventType) {
                //进入聊天页面会触发该事件
                case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED:
                    //获取当前聊天页面根布局
                    AccessibilityNodeInfo rootNode = getRootInActiveWindow();
                    //屏蔽微信"删除联系人"和"拉黑"功能
                    DeleteFail(rootNode);
                    break;
    
            }
    
        }
    
        /**
         * 遍历所有控件,判断是不是删除联系人界面或者拉黑界面,如果是则模拟点击"取消",让它消失。
         *
         * @param rootNode
         */
        private void DeleteFail(AccessibilityNodeInfo rootNode) {
            if(rootNode!=null){
                for (int i = 0; i < rootNode.getChildCount(); i++) {
                    AccessibilityNodeInfo node = rootNode.getChild(i);
                    //判断是不是删除联系人弹出框
                    if("android.widget.TextView".equals(node.getClassName().toString())){
                        if(!TextUtils.isEmpty(node.getText())){
                            if(node.getText().toString().contains("将同时删除与该联系人的聊天记录")){
                                isDeleteDialog=true;
                            }
                        }
                    }
    
                    //判断是不是拉黑联系人弹出框
                    if("android.widget.TextView".equals(node.getClassName().toString())){
                        if(!TextUtils.isEmpty(node.getText())){
                            if(node.getText().toString().contains("你将不再收到对方的消息,并且你们相互看不到对方朋友圈的更新")){
                                isDefriendDialog=true;
                            }
                        }
                    }
    
                    //模拟点击取消按钮让对话框消失
                    if("android.widget.Button".equals(node.getClassName().toString())){
                        if(isDeleteDialog||isDefriendDialog){
                            if(!TextUtils.isEmpty(node.getText())){
                                if(node.getText().toString().equals("取消")){
                                    node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
                                }
                            }
                        }
                    }
                }
            }
        }
    
        /**
         * 必须重写的方法:系统要中断此service返回的响应时会调用。在整个生命周期会被调用多次。
         */
        @Override
        public void onInterrupt() {
            Toast.makeText(this, "我快被终结了啊-----", Toast.LENGTH_SHORT).show();
        }
    
        /**
         * 服务开始连接
         */
        @Override
        protected void onServiceConnected() {
            Toast.makeText(this, "服务已开启", Toast.LENGTH_SHORT).show();
            super.onServiceConnected();
        }
    
        /**
         * 服务断开
         *
         * @param intent
         * @return
         */
        @Override
        public boolean onUnbind(Intent intent) {
            Toast.makeText(this, "服务已被关闭", Toast.LENGTH_SHORT).show();
            return super.onUnbind(intent);
        }
    }

    使用方法:

    设置-辅助功能-无障碍-点击WechatDeletefail开启即可(或者在设置中查找辅助功能等)

    写在最后:

    AccessibilityService服务类很好玩,如果你对他了解的话其实可以做很多事哈哈。

    其实这只是一个小例子而已,例如你想让微信加不了好友或者发不了红包等等其实都跟上面的方法类似。

    个人兴趣研究,不建议用在非法途径上!!

    欢迎一起讨论学习:471497226@qq.com

  • 相关阅读:
    项目中正在使用,整理出来的logback配置文件模板
    springboot集成redis 报错@Bean definition illegally overridden by existing bean definition@bean定义被现有bean定义非法重写
    SpringBoot2.0+ 使用Log4j2日志输出
    springboot启动报 A child container failed during start 错误解决过程
    java反射获取和设置实体类的属性值 递归所有父类
    springboot集成websocket实现向前端浏览器发送一个对象,发送消息操作手动触发
    SpringBoot整合MongoDB,在多数据源下实现事务回滚。
    spring boot项目开发中遇到问题,持续更新
    identifier of an instance of xx.entity was altered from xxKey@249e3cb2 to xxKey@74e8f4a3; nested exception is org.hibernate.HibernateException: identifier of an instance of xxentity was altered from错误
    Spring Boot启动 Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: Could not instantiate id generator错误
  • 原文地址:https://www.cnblogs.com/cxk1995/p/6384114.html
Copyright © 2011-2022 走看看