008 功能实现-自动化权限配置

作者: 凤邪摩羯 | 来源:发表于2022-01-07 09:25 被阅读0次

    1、新建辅助功能类

    • 新建一个类继承AccessibilityService,再使用单例模式返回实例
    public class AccessibilityServiceMonitor extends AccessibilityService {
        private static AccessibilityServiceMonitor mAccessibilityServiceMonitor;
        public static AccessibilityServiceMonitor getInstance() {
            if (mAccessibilityServiceMonitor == null) {
    //            Toast.makeText(MyApplication.getInstance(), "辅助服务未开启", Toast.LENGTH_SHORT).show();
            }
            return mAccessibilityServiceMonitor;
        }
        @Override
        public void onCreate() {
            mAccessibilityServiceMonitor = this;
        }
        @Override
        public void onServiceConnected() {
            super.onServiceConnected();
            //可以做一些开启后的操作比如点两下返回
            Log.d(TAG, "onServiceConnected: ");
            mAccessibilityServiceMonitor = this;
        }
    }
    
    

    2、Manifest文件配置

    • 在AndroidManifest.xml文件中配置服务
    <service
                android:name="com.example.autopermission.server.AccessibilityServiceMonitor"
                android:enabled="true"
                android:exported="true"
                android:label="@string/asm_name"
                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/accessibility_config">
    
                </meta-data>
            </service>
    
    
    • 这里有几个参数需要注意:
    android:label 是显示在系统设置里面的辅助模式列表的标题提示
    android:resource 这里是当前辅助模式的配置文件,具体配置看下一步
    

    3、辅助配置文件

    • 在res文件夹下新建xml文件夹,然后新建文件accessibility_config.xml
    <accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
        android:accessibilityEventTypes="typeAllMask"
        android:accessibilityFeedbackType="feedbackGeneric"
        android:accessibilityFlags="flagReportViewIds"
        android:canRetrieveWindowContent="true"
        android:description="@string/readme"
        android:notificationTimeout="100" />
    
    • 同样这里需要说明一下这些参数的含义
    android:accessibilityEventTypes 可以模拟哪些事件
    typeAllMask 全局事件
    typeViewClicked 点击事件
    android:accessibilityFeedbackType 反馈的类型
    feedbackGeneric 通用反馈
    feedbackAudible 声音反馈
    feedbackSpoken 语音反馈
    android:accessibilityFlags 配置之后可以通过node节点来getViewIdResourceName()获取对应的节点的id
    android:canRetrieveWindowContent 是否允许我们的程序读取窗口中的节点和内容,当然是true
    android:description 在开启辅助功能设置界面的简介,用于介绍应用需要使用辅助功能来干嘛
    android:packageNames 指定监听哪些应用的包名,这里没配置代表监听所有应用的窗口活动
    
    • 接上一段,我们已经知道有至少两种行为,一个是跳转,一个是点击,然后可以想到还有一个就是结束消息。所以这里定义三个消息类型
        public static final int WHAT_JUMP = 1;//跳转
        public static final int WHAT_FIND = 2;//查找节点,用于点击
        public static final int WHAT_COMPLETE = 3;//当前流程结束
    
    
    • 定义完消息之后,在handler的handleMessage方法里面来做处理
    class DelayedHandler extends Handler {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                switch (msg.what) {
                    case WHAT_JUMP:
                    break;
                    case WHAT_FIND:
                    break;
                    case WHAT_COMPLETE:
                    break;
                }
            }
        }
    }
    

    4、定义具体的行为

    • 在知道如何实现流程之后,又遇到一个问题,就是怎么来定义所有的动作。不同的权限需要打开不同的界面,不同的手机的按钮id也不一定是相同的,还要执行返回操作。这就必然需要一个配置文件来配置整个流程,所以我们可以用一个json文件来定义整个流程,所有的行为。在新建资源文件夹assets,然后新建一个json文件step.json
    [
      {
        "delay_time": 600,
        "type_id": 5,
        "describe": "显示在其他应用上面",
        "intent": {
          "uriData": "package&com.example.autopermission",
          "actionName": "android.settings.action.MANAGE_OVERLAY_PERMISSION"
        },
        "step": [
          {
            "delay_time": 600,
            "find_text": "其他应用",
            "action_type": "ACTION_CLICK",
            "click_type": "child",
            "reality_node_name": "android.widget.TextView",
            "reality_node_id": ":id/checkbox&:id/switch_widget&switch"
          },
          {
            "click_type": "system",
            "delay_time": 600,
            "action_type": "GLOBAL_ACTION_BACK"
          }
        ]
      },
      {
        "delay_time": 600,
        "type_id": 5,
        "describe": "允许修改系统设置",
        "intent": {
          "uriData": "package&com.example.autopermission",
          "actionName": "android.settings.action.MANAGE_WRITE_SETTINGS"
        },
        "step": [
          {
            "delay_time": 600,
            "find_text": "修改系统设置",
            "action_type": "ACTION_CLICK",
            "click_type": "child",
            "reality_node_name": "android.widget.TextView",
            "reality_node_id": ":id/checkbox&:id/switch_widget&switch"
          },
          {
            "click_type": "system",
            "delay_time": 600,
            "action_type": "GLOBAL_ACTION_BACK"
          }
        ]
      }
    ]
    
    
    • 这里面定义了开启显示在其它应用上面和修改系统设置两个权限,具体步骤如下
    1. 使用action跳转显示在其他应用上面界面
    2. 查找包含其他应用文字的textview,然后点击同视图层级的switch或者checkbox(这里用&符号配置不同的控件名称)
    3. 执行ACTION_CLICK点击按钮开启
    4. 执行GLOBAL_ACTION_BACK返回到我们的应用
    5. 重复之上动作开启修改系统设置权限

    至此我们就自动开启了两个权限,并且还需要其它权限的话也可以自己配置在json文件中。所有权限开起来也不是不可以。

    5、怎样知道不同手机的控件名称呢

    刚才我们发现了配置文件里面配置了三种类型的switch按钮,那是怎么知道不同手机的开关按钮的名称是什么呢,这个时候就需要视图分析工具了。这个工具在sdk文件夹的monitor.bat文件,就可以打开monitor工具,然后就可以分析应用的视图树。


    image.png

    相关文章

      网友评论

        本文标题:008 功能实现-自动化权限配置

        本文链接:https://www.haomeiwen.com/subject/zstyqrtx.html