2021-01-24

package com.xingag.xianyu.service;

import android.app.Notification;
import android.app.PendingIntent;
import android.provider.SyncStateContract;
import android.text.TextUtils;
import android.util.Log;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;

import com.xingag.base.BaseService;
import com.xingag.util.AppUtils;
import com.xingag.xianyu.Constants;
import com.xingag.xianyu.Ids;

import java.util.ArrayList;
import java.util.List;

public class XianYuService extends BaseService
{
    private static final String TAG = "xag";

    //默认的TopActivity
    private String topActivity = Constants.class_name_xianyu;

    @Override
    public void onAccessibilityEvent(AccessibilityEvent event)
    {
        //事件类型
        int eventType = event.getEventType();
        //获取包名
        String packageName = event.getPackageName().toString();
        //类名
        String className = event.getClassName().toString();

//        Log.e("xxx", packageName + className);

        //只筛选下面三个事件,其他事件过滤掉
        if (eventType != AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED && eventType != AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED && eventType != AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED)
        {
            Log.e("xxx","eventType:"+eventType);
            return;
        }

        switch (eventType)
        {
            //状态栏变化
            case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED:
                Log.e(TAG, "TYPE_NOTIFICATION_STATE_CHANGED," + packageName + className);
                //跳到聊天界面
                Log.e(TAG, "通知栏消息,点击跳入");
                handleNotificationEventMet(event);
                break;
            //窗口切换的时候回调
            case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED:
                Log.e(TAG, "TYPE_WINDOW_STATE_CHANGED," + packageName + className);

                //设置TopActivity
                topActivity = className;
                try
                {
                    Thread.sleep(1000);
                } catch (InterruptedException e)
                {
                    e.printStackTrace();
                }

                if (null == event.getSource())
                {
                    Log.e(TAG, "TYPE_WINDOW_STATE_CHANGED:事件过滤掉");
                    return;
                }

                //判断className
                //主页
                if (TextUtils.equals(className, Constants.class_name_xianyu) && AppUtils.judgeIsMainPage(getRootInActiveWindow()))
                {
                    handleMainMsg(event);
                }
                //聊天界面
                else if (TextUtils.equals(className, Constants.class_name_chat) && AppUtils.judgeIsChatPage(event.getSource()))
                {
                    handleChatMet(event);
                } else
                {
                    //其他界面,不进行处理
                    Log.e(TAG, "界面变更在其他界面:" + className + ",不处理!!!");
                }
                break;
            //窗口内容变化
            case AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED:
                //注意:此处的className(com.taobao.idlefishandroid.widget.TextView)和TopActivity不一样
                Log.e(TAG, "TYPE_WINDOW_CONTENT_CHANGED," + packageName + className + ",topActivity:" + topActivity);

                //过滤掉一下特殊的事件
                if (null == event.getSource())
                {
                    Log.e(TAG, "TYPE_WINDOW_CONTENT_CHANGED:事件过滤掉");
                    return;
                }

                if (TextUtils.equals(topActivity, Constants.class_name_xianyu) && AppUtils.judgeIsMainPage(getRootInActiveWindow()))
                {
                    handleMainMsg(event);
                } else if (TextUtils.equals(topActivity, Constants.class_name_chat) && AppUtils.judgeIsChatPage(event.getSource()))
                {
                    handleChatMet(event);
                } else
                {
                    Log.e(TAG, "当前窗口内容变化的类名:" + className + ",不处理");
                }
                break;
        }
    }

    /***
     * 处理聊天消息
     * @param event
     */
    private void handleChatMet(AccessibilityEvent event)
    {
        String eventClassName = event.getClassName().toString();

        Log.e(TAG, "聊天界面!处理聊天界面消息");

        //滑动到最底部
        performScrollBackward();

        //聊天列表
        AccessibilityNodeInfo chat_lv = findViewByID(Ids.id_chat_listview);

        int chat_count = chat_lv.getChildCount();

        //注意:包含自己发送的消息、收到的消息、公共提示消息,比如:一直未回复?试试语音/视频通话
        Log.e(TAG, "一共有:" + chat_count + "条聊天记录");

        //所有聊天记录
//        List<AccessibilityNodeInfo> chat_nodes = new ArrayList<>();

        //系统聊天信息,可以忽略
        List<String> chat_msgs_common = new ArrayList<>();
        //收到的信息
        List<String> chat_msgs_from = new ArrayList<>();
        //发出去的信息
        List<String> chat_msgs_to = new ArrayList<>();


        for (int i = 0; i < chat_count; i++)
        {

            AccessibilityNodeInfo tempChatAccessibilityNodeInfo = chat_lv.getChild(i);
            //注意:通过判断是否有头像元素、昵称元素来判断是哪种聊天记录

            //获取头像元素【左】【发送者】
            AccessibilityNodeInfo headPortraitAccessibilityNodeInfoLeft = findViewByID(tempChatAccessibilityNodeInfo, Ids.id_chat_head_portrait_left);

            //获取头像元素【右】【接受者】
            AccessibilityNodeInfo headPortraitAccessibilityNodeInfoRight = findViewByID(tempChatAccessibilityNodeInfo, Ids.id_chat_head_portrait_right);

            //获取文字内容
            AccessibilityNodeInfo tempTextAccessibilityNodeInfo = findViewByID(tempChatAccessibilityNodeInfo, Ids.id_chat_text);

            if (null == tempTextAccessibilityNodeInfo || null == tempTextAccessibilityNodeInfo.getText())
            {
                Log.e(TAG, "索引" + i + ",聊天内容为空");
                continue;
            }
            String chatText = tempTextAccessibilityNodeInfo.getText().toString();

            Log.e(TAG, "聊天内容为:" + chatText);

            if (null != headPortraitAccessibilityNodeInfoLeft)
            {
                chat_msgs_from.add(0, chatText);
            } else if (null != headPortraitAccessibilityNodeInfoRight)
            {
                chat_msgs_to.add(0, chatText);
            } else
            {
                chat_msgs_common.add(0, chatText);
            }
        }

        Log.e(TAG, "*************************************");
        Log.e(TAG, "聊天内容如下【接受】:");
        Log.e(TAG, chat_msgs_from.toString());
        Log.e(TAG, "聊天内容如下【发送】:");
        Log.e(TAG, chat_msgs_to.toString());
        Log.e(TAG, "聊天内容如下【公共】:");
        Log.e(TAG, chat_msgs_common.toString());
        Log.e(TAG, "*************************************");

        // 初次聊天就发送默认的信息
        if (chat_msgs_from.size() == 1 && chat_msgs_to.size() == 0)
        {
            //输入之后,返回,退出输入框
            Log.e(TAG, "第一次收到信息,回复默认准备的内容");
            reply_content(event, Constants.reply_first);

        } else if (chat_msgs_from.size() > 0)
        {
            //第一条文本内容
            String first_msg = chat_msgs_from.get(0);
            if ("11".equals(first_msg))
            {
                reply_content(event, Constants.reply_11);
            } else if ("22".equals(first_msg))
            {
                reply_content(event, Constants.reply_22);
            } else
            {
                reply_content(event, Constants.reply_other);
            }

        } else
        {
            Log.e(TAG, "对方没有应答,不处理");
        }
        //返回到聊天界面
        performBackClick();
    }

    /***
     * 回复消息
     * @param event
     */
    private void reply_content(AccessibilityEvent event, String content)
    {
        //元素:输入框
        AccessibilityNodeInfo chat_edit = findViewByID(Ids.id_edittext);

        //把文本输入进去
        inputText(chat_edit, content);

        //元素:发送按钮
        AccessibilityNodeInfo chat_send = findViewByID(Ids.id_sendtext);

        Log.e(TAG,"准备回复的内容是:"+content);

        try
        {
            Thread.sleep(5000);
        } catch (InterruptedException e)
        {
            e.printStackTrace();
        }
        //发送按钮
        performViewClick(chat_send);
    }

    /***
     * 处理通知栏消息
     * @param event
     */
    private void handleNotificationEventMet(AccessibilityEvent event)
    {
        if (event.getParcelableData() != null && event.getParcelableData() instanceof Notification)
        {
            Notification notification = (Notification) event.getParcelableData();
            if (notification == null)
            {
                return;
            }
            PendingIntent pendingIntent = notification.contentIntent;
            if (pendingIntent == null)
            {
                return;
            }
            try
            {
                //注意:通知栏的文字消息没有参考意义
                //跳转到聊天信息界面
                Log.e("xag", "准备跳转到聊天界面");
                pendingIntent.send();
            } catch (PendingIntent.CanceledException e)
            {
                e.printStackTrace();
            }
        }

    }

    /***
     * 处理主界面的消息
     */
    private void handleMainMsg(AccessibilityEvent event)
    {
        try
        {
            Thread.sleep(1000);
        } catch (InterruptedException e)
        {
            e.printStackTrace();
        }
        Log.e(TAG, "主界面!处理主界面消息");

        Constants.HOME_TAB currentTab = AppUtils.getCurrentTab(getRootInActiveWindow().findAccessibilityNodeInfosByViewId(Ids.id_tabs).get(0));

        //选中在消息Tab,处理聊天页面
        if (Constants.HOME_TAB.TAB_XIAO_XI == currentTab)
        {
            Log.e(TAG, "当前Tab:消息Tab");
            //判断新消息在哪个位置,然后点击进入
            AccessibilityNodeInfo main_listview_node = findViewByID(Ids.id_main_conversation_listview);

            //未读消息Node
            AccessibilityNodeInfo unread_tag_node = AppUtils.getUnreadMsgNode(main_listview_node);

            if (null != unread_tag_node)
            {
                Log.e(TAG, "点击进入会话");
                //点击进入消息列表
                performViewClick(unread_tag_node);

                //处理聊天信息
                handleChatMet(event);
            } else
            {
                Log.e(TAG, "列表中没有未读消息");
            }
        }
    }

    @Override
    public void onInterrupt()
    {
    }


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
vc++全版本组件大全 VC++运行时(Visual C++ Runtime)是VC++开发环境中用于支持C和C++程序运行的基础库集合。这些库包含了执行C/C++程序所必需的基本函数和数据结构,例如内存管理、字符串操作、输入输出处理、异常处理等。VC++运行时库分为静态库和动态库两种形式,以适应不同类型的项目需求。 静态链接库 vs 动态链接库 静态链接库(Static Linking Libraries):在编译时,静态库的代码会被直接嵌入到最终生成的可执行文件中。这意味着每个使用静态库的程序都会包含库代码的一个副本,导致最终程序的体积较大,但不需要外部库文件支持即可独立运行。在VC++中,静态链接库的例子有LIBC.lib(用于单线程程序)和LIBCMT.lib(用于多线程程序)。 动态链接库(Dynamic Link Libraries):与静态链接相反,动态库的代码并不直接加入到应用程序中,而是在程序运行时被加载。这使得多个程序可以共享同一份库代码,节省了系统资源。VC++的动态运行时库主要通过msvcrt.dll(或其变体,如MSVCRTD.dll用于调试版本)实现,与之配套的导入库(Import Library)如CRTDLL.lib用于链接阶段。 运行时库的版本 VC++运行时库随着Visual Studio版本的更新而发展,每个版本都可能引入新的特性和优化,同时保持向后兼容性。例如,有VC++ 2005、2008、2010直至2019等多个版本的运行时库,每个版本都对应着特定的开发环境和Windows操作系统。 重要性 VC++运行时对于确保程序正确运行至关重要。当程序在没有安装相应运行时库的计算机上执行时,可能会遇到因缺失DLL文件(如MSVCP*.dll, VCRUNTIME*.dll等)而导致的错误。因此,开发完成后,通常需要分发相应的VC++ Redistributable Packages给最终用户安装,以确保程序能够在目标系统上顺利运行。 安装与部署 安装VC++运行时库通常是通过Microsoft提供的Redistributable Packages完成的,这是一个简单的过程,用户只需运行安装程序即可自动安装所需组件。对于开发者而言,了解和管理不同版本的运行时库对于确保应用程序的广泛兼容性和可靠性是必要的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值