android技术Android技术知识Android开发经验谈

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

2022-01-07  本文已影响0人  凤邪摩羯

1、新建辅助功能类

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文件配置

<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、辅助配置文件

<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;//当前流程结束

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、定义具体的行为

[
  {
    "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
上一篇 下一篇

猜你喜欢

热点阅读