IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 安卓辅助功能无障碍实现app自动化操作 -> 正文阅读

[移动开发]安卓辅助功能无障碍实现app自动化操作

工具:android studio ,Android Device Monitor(在安卓sdk目录下的tool目录下有一个monitor.bat文件,点击启动)

第一步:创建安卓应用。

目录结构:

wechat.xml

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeAllMask"
    android:accessibilityFeedbackType="feedbackGeneric"
    android:accessibilityFlags="flagReportViewIds|flagRetrieveInteractiveWindows"
    android:canPerformGestures="true"
    android:canRetrieveWindowContent="true"
    android:description="@string/wechat"
    android:notificationTimeout="100"
    android:packageNames="com.tencent.mm"
    ></accessibility-service>

? ? android:packageNames="com.tencent.mm"指监听的应用包名,多个逗号隔开。

创建service并实现里面的两个方法

public class weChatService extends AccessibilityService {

}

?在AndroidManifest.xml中注册service

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapplication">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.MyApplication">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service
            android:name="com.example.myapplication.weChatService"
            android:enabled="true"
            android:exported="true"
            android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
            <intent-filter>
                <action android:name="android.accessibilityservice.AccessibilityService"/>
            </intent-filter>
            <meta-data
                android:name="android.accessibilityservice"
                android:resource="@xml/wechat"/>
        </service>

    </application>

</manifest>

使用monitor获取界面元素的id

第一步:把手机显示的界面加载过来

在界面上点击元素,右边就可以看见该元素的结构和id

?代码:

在刚刚实现的代码中的写自己的逻辑

 @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        int eventType = event.getEventType();

可以通过eventtype判断界面的事件,这个可以百度搜一下AccessibilityEvent

我这边没有判断直接在里面写代码,首先是通过

 AccessibilityNodeInfo rootInfo = getRootInActiveWindow();

?方法拿到界面所有的元素,然后通过方法搜索元素

findByID(rootInfo, "com.tencent.mm:id/bxz",0);
 private void findByID(AccessibilityNodeInfo rootInfo, String text,int type) {
        if(rootInfo==null){
            return;
        }
        if (rootInfo.getChildCount() > 0) {
            for (int i = 0; i < rootInfo.getChildCount(); i++) {
                AccessibilityNodeInfo child = rootInfo.getChild(i);
                try {
                    if (child.findAccessibilityNodeInfosByViewId(text).size() > 0) {
                        for (AccessibilityNodeInfo info : child.findAccessibilityNodeInfosByViewId(text)) {



                                if(type==0){
                                    //在输入框输入111111.....
                                    changeInput(info,"1111111111111111111");
                                    try {
                                        TimeUnit.SECONDS.sleep(3);
                                    } catch (InterruptedException e) {
                                        e.printStackTrace();
                                    }
                                    findByID(getRootInActiveWindow(), "com.tencent.mm:id/hdm",1);
                                }else if(type == 1){
                                    //输入框的点击事件
                                    getClickable(info).performAction(AccessibilityNodeInfo.ACTION_CLICK);
                                }else if(type == 2){
                                    //获取元素的文字信息
                                    System.out.println("昵称"+info.getText().toString());
                                   
                                }else if(type ==3){
                                    System.out.println("地区"+info.getText().toString());
                                    findByID(getRootInActiveWindow(), "com.tencent.mm:id/ei",4);
                                   
                                }else if(type ==4){
//点击事件
                                    getClickable(info).performAction(AccessibilityNodeInfo.ACTION_CLICK);
                                }
                        }
                    }
                } catch (NullPointerException e) {
                }
                findByID(child, text,type);//递归一直找一层层的全部遍历
            }
        }
    }

//有些节点不可点击 点击交给父级甚至父级的父级...来做的。
    private AccessibilityNodeInfo getClickable(AccessibilityNodeInfo info) {
//        Log.i(TAG, info.getClassName() + ": " + info.isClickable());
        if (info.isClickable()) {
            return info;//如果可以点击就返回
        } else {//不可点击就检查父级 一直递归
            return getClickable(info.getParent());
        }
    }


 private void changeInput(AccessibilityNodeInfo info,String text) {  //改变editText的内容
        Bundle arguments = new Bundle();
        arguments.putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE,
                text);
        info.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, arguments);
    }

代码很乱,只是简单测试用。可以通过这种方式实现一些app的自动化操作或脚本。另外其中有部分方法也是百度搜索拼接起来的。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-08-09 10:21:10  更:2021-08-09 10:22:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 12:55:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码