利用辅助服务分享多图到朋友圈:AccessibilityService

本文介绍了一种利用Android的AccessibilityService实现微信图文自动发布的解决方案。通过监听特定UI事件,自动填充编辑框,选择图片,以及提交图文消息,实现了微信图文消息的全自动发布流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class AutoCopyService extends AccessibilityService {

    private String TARGET_UI = "";
    private String EDIT_TEXT_ID = "";


    @Override
    public void onAccessibilityEvent(final AccessibilityEvent event) {
        int eventType = event.getEventType();
        if (eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED || eventType == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED) {
            //
            getWeChatSupport();
            if (TARGET_UI.equals(event.getClassName())) {
                //如果当前页面是目标页面
                if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) {
                    final AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();
                    if (nodeInfo == null) {
                        System.out.println(" onAccessibilityEvent error  null");
                        return;
                    }
                    if (TextUtils.isEmpty(EDIT_TEXT_ID)) {
                        Toast.makeText(this, "自动复制失败,并重试!", Toast.LENGTH_SHORT).show();
                        return;
                    }
                    List<AccessibilityNodeInfo> openId = nodeInfo.findAccessibilityNodeInfosByViewId(EDIT_TEXT_ID);
                    if (openId != null && openId.size() > 0) {
                        String timeLineContent = Preference.create(this).getPrefString("TIME_LINE_CONTENT", "");
                        if (!TextUtils.isEmpty(timeLineContent)) {
                            Bundle arguments = new Bundle();
                            arguments.putCharSequence(AccessibilityNodeInfo
                                    .ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, timeLineContent);
                            openId.get(0).performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, arguments);
                        }
                        Preference.create(this).setPrefString("TIME_LINE_CONTENT", "");
                    }


                    //-------------------------673版本處理方案----------------------------------------------
                    /**
                     * 添加按钮的GridView的Item的LinearLayout
                     * 667 com.tencent.mm:id/jz
                     * 673 com.tencent.mm:id/lr
                     */
                    int image_num = Preference.create(getApplicationContext()).getPrefInt("image_num", 0);
                    if (image_num <= 0)
                        return;
                    List<AccessibilityNodeInfo> imageAdd = nodeInfo.findAccessibilityNodeInfosByText("添加照片按钮");
                    if (null == imageAdd || imageAdd.isEmpty())
                        return;

                    List<AccessibilityNodeInfo> alreadyAdd = nodeInfo.findAccessibilityNodeInfosByText("图片");//已经添加的图片
                    //如果已经添加的图片数量 等于  模板图片的数量,则不用点击
                    if (null != alreadyAdd && alreadyAdd.size() == (image_num + 1)) {
                        return;
                    }
                    AccessibilityNodeInfo lin_image_add = imageAdd.get(0).getParent();
                    if (null == lin_image_add) {
                        return;
                    }
                    //点击相机小图片
                    lin_image_add.performAction(AccessibilityNodeInfo.ACTION_CLICK);

                    sleep(600);

                    //点击从相册选择
                    clickToChooseImage();

                }
            }
            //自动选择图片
            if ("com.tencent.mm.plugin.gallery.ui.AlbumPreviewUI".equals(event.getClassName())) {
                int image_num = Preference.create(getApplicationContext()).getPrefInt("image_num", 0);
                if (image_num <= 0) {
                    return;
                }
                sleep(500);
                AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();

                checkImage(nodeInfo);

            }
        }
    }


    //选择图片
    private void checkImage(AccessibilityNodeInfo nodeInfo) {
        //com.tencent.mm:id/bt3
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) {
            /**
             * 图片列表的CheckBoc上层的ImageVIew 代替点击的
             * 667 com.tencent.mm:id/bt4
             * 673 com.tencent.mm:id/bhl
             */
            int image_num = Preference.create(getApplicationContext()).getPrefInt("image_num", 0);
            int compat_num = Preference.create(getApplicationContext()).getPrefInt("compat_num", 0);
            if (null == nodeInfo) {
                if (compat_num > 0) {
                    sleep(1000);
                    performGlobalAction(AccessibilityService.GLOBAL_ACTION_RECENTS);
                    sleep(600);
                    performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK);
                    Preference.create(getApplicationContext()).setPrefInt("compat_num", 0);
                } else {
                    Preference.create(getApplicationContext()).setPrefInt("image_num", 0);
                    Toast.makeText(this, "当前手机不支持自动选择,请从第" + image_num + "个倒序手动选择图片", Toast.LENGTH_SHORT).show();
                }
                return;
            }

            List<AccessibilityNodeInfo> checkList = nodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/bhl");
            if (null == checkList || checkList.isEmpty()) {
                Preference.create(getApplicationContext()).setPrefInt("image_num", 0);
                Toast.makeText(this, "本次操作不支持自动选择,请从第" + image_num + "个倒序手动选择图片", Toast.LENGTH_SHORT).show();
                return;
            }
            if (image_num < checkList.size()) {
                for (int i = image_num - 1; i >= 0; i--) {
                    logger("addimage_click", String.format("点击第%d张", i));
                    checkList.get(i).performAction(AccessibilityNodeInfo.ACTION_CLICK);
                }

                clickSubmitImage(nodeInfo);
            }
        }
    }


    private void clickSubmitImage(AccessibilityNodeInfo nodeInfo) {
//        com.tencent.mm:id/hg
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) {
            /**
             * 完成 的 TextView
             * 667 com.tencent.mm:id/hg
             * 673 com.tencent.mm:id/j0
             */
            Preference.create(getApplicationContext()).setPrefInt("image_num", 0);
            List<AccessibilityNodeInfo> submit = nodeInfo.findAccessibilityNodeInfosByText("完成");
//            List<AccessibilityNodeInfo> submit = nodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/j0");
            if (null == submit || submit.isEmpty()) return;
            submit.get(0).performAction(AccessibilityNodeInfo.ACTION_CLICK);

        }
    }

    private void clickToChooseImage() {
        //
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) {
            final AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();
            if (null != nodeInfo) {
                /**
                 * 点击添加图片的弹出框的ListView
                 * 667 com.tencent.mm:id/i7
                 * 673 com.tencent.mm:id/jq
                 */
                List<AccessibilityNodeInfo> textView = nodeInfo.findAccessibilityNodeInfosByText("从相册选择");
                if (textView.isEmpty()) return;
                try {
                    AccessibilityNodeInfo lin_item = textView.get(0).getParent().getParent();
                    if (TextUtils.equals(lin_item.getClassName(), "android.widget.LinearLayout"))
                        lin_item.performAction(AccessibilityNodeInfo.ACTION_CLICK);
                    logger("addimage_click", "跳转到选择图片列表");
                } catch (Exception e) {
                    logger("addimage_click", e.getMessage());
                }


            }
        }
    }

    private void sleep(long millis) {
        try {
            Thread.sleep(millis);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onInterrupt() {
        logger("addimage_click", "onInterrupt 服务中断了");

    }

    @Override
    protected void onServiceConnected() {
        logger("addimage_click", "onServiceConnected success");
        getWeChatSupport();
        super.onServiceConnected();
    }


    /**
     * 加载微信的相关信息
     */
    private void getWeChatSupport() {
        String install_wechat_version_name = Preference.create(this).getPrefString("install_wechat_version_name", "");
        if (TextUtils.isEmpty(install_wechat_version_name))
            return;
        try {
            WechatSuppertEntity support = App.getDB().findById(WechatSuppertEntity.class, install_wechat_version_name);
            TARGET_UI = support.getTarget_ui();
            EDIT_TEXT_ID = support.getWechat_weiget_id();
        } catch (Exception e) {
            e.printStackTrace();
            TARGET_UI = "";
            EDIT_TEXT_ID = "";
        }
    }

    private void logger(String tag, String message) {
        boolean isDebug = x.isDebug();
        if (isDebug) {
            LoggerPrinter.saveLogger("自动辅助服务:tag:" + tag + "--->message:" + message);
        }
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值