安卓无障碍获取录屏权限

每次需要录屏操作时,都会弹窗需要用户手动授权比较麻烦,可以通过无障碍模拟用户点击进行授权。

方法主要有三种:

1.查找“立即开始”(华为手机是“允许”)节点,模拟点击;

 @Overridepublic void onAccessibilityEvent(AccessibilityEvent event) {Log.i("AccessibilityEvent", event.toString());if (event == null || !event.getPackageName().toString().contains("com.android.systemui"))//不写完整包名,是因为某些手机(如小米)安装器包名是自定义的return;/*某些手机安装页事件返回节点有可能为null,无法获取安装按钮例如华为mate10安装页就会出现event.getSource()为null,所以取巧改变当前页面状态,重新获取节点。该方法在华为mate10上生效,但其它手机没有验证...(目前小米手机没有出现这个问题)*/Log.i(TAG, "onAccessibilityEvent: " + event);AccessibilityNodeInfo eventNode = event.getSource();/*模拟点击->立即开始,只验证了小米5s plus(MIUI 9.8.4.26)、小米Redmi 5A(MIUI 9.2)、华为mate 10其它品牌手机可能还要适配,适配最可恶的就是出现安装广告按钮,误点安装其它垃圾APP(典型就是小米安装后广告推荐按钮,华为安装开始官方安装)*/AccessibilityNodeInfo nodeInfo= getRootInActiveWindow(); //当前窗口根节点if (rootNode == null)return;if (event.getClassName().toString().contains("MediaProjectionPermissionActivity")) {List<AccessibilityNodeInfo> nodes = nodeInfo.findAccessibilityNodeInfosByText("立即开始");Log.i(TAG, "findTxtClick: " + txt + ", " + nodes.size() + ", " + nodes);if (nodes == null || nodes.isEmpty()) {return;}Log.i(TAG, "findTxtClick: " + txt + ", " + nodes.size() + ", " + nodes);for (AccessibilityNodeInfo node : nodes) {node.performAction(AccessibilityNodeInfo.ACTION_CLICK);}// 回收节点实例来重用if (eventNode != null) {eventNode.recycle();}rootNode.recycle();}

2.查找buttonId;经我研究立即开始id是

android:id/button1
 List<AccessibilityNodeInfo> findAccessibilityNodeInfosByViewId = rootNode.findAccessibilityNodeInfosByViewId("android:id/button1");Log.i(TAG, "findTxtClick: 立即开始"   + "button1 " + findAccessibilityNodeInfosByViewId.size());if (findAccessibilityNodeInfosByViewId.size() > 0) {System.out.println("5=====================" + findAccessibilityNodeInfosByViewId.size());Iterator<AccessibilityNodeInfo> it = findAccessibilityNodeInfosByViewId.iterator();while (it.hasNext()) {it.next().performAction(16);}return;}

3.某些手机不给你查找,只能查到”取消“,这时候需要模拟一个区域,计算这个区域位置与”允许“重合,进行点击。

  List<AccessibilityNodeInfo> findAccessibilityNodeInfosByViewId2 = nodeInfo.findAccessibilityNodeInfosByViewId("android:id/button3");System.out.println("findTxtClick取消 " + findAccessibilityNodeInfosByViewId2.size());if (findAccessibilityNodeInfosByViewId2.size() == 0) {return;}AccessibilityNodeInfo accessibilityNodeInfo = findAccessibilityNodeInfosByViewId2.get(0);Rect rect = new Rect();accessibilityNodeInfo.getBoundsInScreen(rect);Path path = new Path();int screenWidth = getScreenWidth(this);int i = screenWidth - ((rect.left + rect.right) / 2);if (i < (screenWidth / 2) + 50 && i > (screenWidth / 2) - 50) {if (getResources().getConfiguration().orientation == 1) {float f = i;int i2 = rect.top;int i3 = rect.bottom;path.moveTo(f, ((i2 + i3) / 2) - (i3 - i2));} else {float f2 = i;int i4 = rect.top;int i5 = rect.bottom;path.moveTo(f2, ((i4 + i5) / 2) - (i5 - i4));}} else if (getResources().getConfiguration().orientation == 1) {path.moveTo(i, (rect.top + rect.bottom) / 2);} else {path.moveTo(i, (rect.top + rect.bottom) / 2);}Gesture(path, 50L, 0L);return;
 public void Gesture(final Path path, final long time, final long delay) {new Thread() { // from class: com.stardust.autojs.core.accessibility.AccessibilityService.1@Override // java.lang.Thread, java.lang.Runnable@SuppressLint({"NewApi"})public void run() {try {if (path.isEmpty()) {return;}if (Looper.myLooper() == null) {Looper.prepare();}Handler handler = new Handler(Looper.myLooper());Log.i(TAG, "findTxtClick: 立即开始"   + ", dispatchGesture" );dispatchGesture(new GestureDescription.Builder().addStroke(new GestureDescription.StrokeDescription(path, delay, time)).build(), new AccessibilityService.GestureResultCallback() { // from class: com.stardust.autojs.core.accessibility.AccessibilityService.1.1@Override // android.accessibilityservice.AccessibilityService.GestureResultCallbackpublic void onCancelled(GestureDescription gestureDescription) {Log.i(TAG, "findTxtClick: 立即开始"   + ", 没点击" );}@Override // android.accessibilityservice.AccessibilityService.GestureResultCallbackpublic void onCompleted(GestureDescription gestureDescription) {Log.i(TAG, "findTxtClick: 立即开始"   + ", 点击了" );MyApplication.getInstance().closetan=false;}}, handler);Looper.loop();} catch (Throwable th) {Log.i(TAG, "findTxtClick: 立即开始"   + ", th"+th.toString());th.printStackTrace();}}}.start();}

即便完成了以上操作,还需要配置不同系统版本的xml权限才能成功。

xml

<accessibility-servicexmlns:android="http://schemas.android.com/apk/res/android"android:description="@string/readme"android:packageNames="com.android.systemui"android:accessibilityEventTypes="typeAllMask"android:accessibilityFeedbackType="feedbackAllMask"android:notificationTimeout="100"android:settingsActivity="com.angcyo.SettingsActivity"android:accessibilityFlags="flagDefault"android:canPerformGestures="true"android:canRetrieveWindowContent="true"/>

xml30

<accessibility-servicexmlns:android="http://schemas.android.com/apk/res/android"android:description="@string/readme"android:packageNames="com.android.systemui"android:settingsActivity="com.angcyo.SettingsActivity"android:canRequestTouchExplorationMode="true"android:accessibilityEventTypes="typeAllMask"android:accessibilityFeedbackType="feedbackAllMask"android:notificationTimeout="10"android:accessibilityFlags="flagRetrieveInteractiveWindows|flagRequestFilterKeyEvents|flagReportViewIds|flagRequestEnhancedWebAccessibility|flagIncludeNotImportantViews"android:canRetrieveWindowContent="true"android:canRequestEnhancedWebAccessibility="true"android:canRequestFilterKeyEvents="false"android:canPerformGestures="true"android:canTakeScreenshot="true"/>

xml31

<accessibility-servicexmlns:android="http://schemas.android.com/apk/res/android"android:description="@string/readme"android:packageNames="com.android.systemui"android:settingsActivity="com.angcyo.SettingsActivity"android:canRequestTouchExplorationMode="true"android:accessibilityEventTypes="typeAllMask"android:accessibilityFeedbackType="feedbackAllMask"android:notificationTimeout="10"android:accessibilityFlags="flagRetrieveInteractiveWindows|flagRequestFilterKeyEvents|flagReportViewIds|flagRequestEnhancedWebAccessibility|flagIncludeNotImportantViews"android:canRetrieveWindowContent="true"android:canRequestEnhancedWebAccessibility="true"android:canRequestFilterKeyEvents="false"android:canPerformGestures="true"android:canTakeScreenshot="true"/>

全部代码我已上传 https://download.csdn.net/download/guodashen007/89874977

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/56772.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【解决办法】git clone报错unable to access ‘xxx‘: SSL certificate problem

git clone 是 Git 版本控制系统中的一个基本命令&#xff0c;用于从远程仓库复制一个完整的版本库到本地。这个命令不仅复制远程仓库中的所有文件&#xff0c;还复制仓库的历史记录&#xff0c;使得你可以在本地进行版本控制操作&#xff0c;如提交&#xff08;commit&#xff…

Electron+Vue实现两种方式的截屏功能

本次介绍的截屏功能一共有两种分别是在electron环境中与非electron环境中 非electron环境 这个环境下会有一些限制&#xff1a; 1.只能截浏览器中的画面 2.如果里面有iframe或者base64的图片会加载不出来&#xff08;这个会有解决办法&#xff09; yarn add -D js-web-scree…

Java爬虫:获取商品评论数据的高效工具

在电子商务的激烈竞争中&#xff0c;商品评论作为消费者购买决策的重要参考&#xff0c;对于商家来说具有极高的价值。它不仅能够帮助商家了解消费者的需求和反馈&#xff0c;还能作为改进产品和服务的依据。Java爬虫技术&#xff0c;以其稳健性和高效性&#xff0c;成为了获取…

基于Spring Cloud的电商系统设计与实现——用户与商品模块的研究(上)

操作系统&#xff1a;Windows Java开发包&#xff1a;JDK1.8 项目管理工具&#xff1a;Maven3.6.0 项目开发工具&#xff1a;IntelliJIDEA 数据库&#xff1a;MySQL Spring Cloud版本&#xff1a;Finchley.SR2 Spring Boot版本&#xff1a;2.0.6.RELEASE 目录 用户模块—user-…

Android 通过计算器暗码启动应用

项目不带通话功能&#xff0c;要求通过计算器输入暗码打开测试应用。 查看布局文件 数字显示控件 packages\apps\ExactCalculator\res\layout\display_one_line.xml ...<com.android.calculator2.CalculatorScrollViewandroid:id"id/formula_container"android:…

golang中的上下文

背景 在Go语言中&#xff0c;使用context包来管理跨API和进程间的请求生命周期是常见的做法。特别是在涉及到并发编程时&#xff0c;如启动协程&#xff08;goroutine&#xff09;来处理异步任务&#xff0c;正确地传递和监听context变得尤为重要。比如&#xff0c;在gin框架中…

YOLO系列入门:1、YOLO V11环境搭建

YOLO了解 yolo检测原理 yolo是目标检测模型&#xff0c;目标检测包含物体分类、位置预测两个内容。目前yolo的开发公司官网为&#xff1a;https://docs.ultralytics.com/zh截止到目前2024年10月&#xff0c;最新的是yolo11。关于YOLO的介绍可以参考这篇文章&#xff1a;https…

NCCL报错

1、报错信息&#xff1a; raise RuntimeError("Distributed package doesnt have NCCL " "built in") RuntimeError: Distributed package doesnt have NCCL built in 2、报错原因&#xff1a; windows系统不支持nccl&#xff0c;采用gloo&#xff1b; …

@PostConstruct和afterPropertiesSet方法执行多次的原因

近日&#xff0c;遇到一个问题&#xff0c;PostConstruct方法会莫名执行多次&#xff0c;单看代码看不出问题&#xff0c;印象中也只会在bean初始化的时候执行一次而已。 然后问AI&#xff0c;问百度&#xff0c;没找到原因。 后面自己猜测&#xff08;现在都是面向猜测编程&am…

Vue3新特性合集

Vue3 简介 ‌‌Vue 3‌ 是‌Vue.js的最新版本&#xff0c;它带来了许多改进和新的特性&#xff0c;旨在提供更好的性能、更强的类型支持以及更灵活的组件开发方式。Vue 3的推出是为了解决Vue 2中存在的一些限制&#xff0c;如响应式系统的限制和虚拟DOM的效率问题。Vue 3在多…

设定义结构变量

在C语言中&#xff0c;可以使用struct关键字来定义结构变量。结构变量是由多个不同类型的成员变量组成的数据类型&#xff0c;可以在一个变量中存储多个相关的数据。 定义结构变量的语法如下&#xff1a; struct 结构名 {数据类型 成员1;数据类型 成员2;... };例如&#xff0…

Python进阶知识2

Python类和对象 Python从设计之初就已经是一门面向对象的语言&#xff0c;正因为如此&#xff0c;在Python中创建一个类和对象是很容易的。 如果你以前没有接触过面向对象的编程语言&#xff0c;那你可能需要先了解一些面向对象语言的一些基本特征&#xff0c;在头脑里头形成…

[Javase]封装、继承、多态与异常处理

文章目录 一、前言二、封装1、封装的思想2、封装代码层面的体现 三、继承1、继承的概念和好处2、继承代码层面的体现 四、多态1、多态的概念2、多态的好处和三要素2、多态代码层面的体现 五、异常处理1、try-catch-finally结构详解2、throw\throws 一、前言 本文章适合有一定面…

#保持每天更新第一天(1)_文本预处理小技巧_中英文翻译分割技巧_从中文右边空格分割,用rsplit(‘ ‘, 1)

-- coding: utf-8 -- “”" Created on Fri Oct 18 20:58:07 2024 author: M.D “”" import pandas as pd df pd.read_csv(“transversalSkillsCollection_翻译.csv”) data df[“altLabels 替代标签”] 原始数据&#xff0c;每条数据由英文和中文组成 data…

10.15.2024刷华为OD C题型(二)

10.15.2024刷华为OD C题型&#xff08;二&#xff09; 密码输入检测智能成绩表 如果是目标院校150分能过&#xff0c;而且这道题是两百分的话我就阿弥陀佛了。 这类简单类型的字符串处理题目一看就有思路&#xff0c;起码能做&#xff0c;遇到那种稍微加点数学的&#xff0c;感…

【CMake】为可执行程序或静态库添加 Qt 资源文件,静态库不生效问题

【CMake】添加静态库中的 Qt 资源 文章目录 可执行程序1. 创建资源文件&#xff08;.qrc&#xff09;2. 修改 CMakeLists.txt3. 使用资源文件 静态库1. 修改 CMakeLists.txt2. 使用资源2.1 初始化资源文件2.2 可执行程序中调用 这里介绍的不是使用 Qt 创建工程时默认的 CMakeLi…

【从零开始的LeetCode-算法】3099. 哈沙德数

如果一个整数能够被其各个数位上的数字之和整除&#xff0c;则称之为 哈沙德数&#xff08;Harshad number&#xff09;。给你一个整数 x 。如果 x 是 哈沙德数 &#xff0c;则返回 x 各个数位上的数字之和&#xff0c;否则&#xff0c;返回 -1 。 示例 1&#xff1a; 输入&am…

MySQL增删改进阶

目录 1.数据库约束 1.1约束类型 1.2 not null约束 1.3 unique&#xff1a;唯一约束 1.4 default&#xff1a;默认约束 1.5 primary key&#xff1a;主键约束 1.6 foreign key:外键约束 1.7 check约束&#xff08;了解&#xff09; 2.表的设计 3.新增&#xff08;进阶&…

刷题训练之多源 BFS

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;熟练掌握多源 BFS算法。 > 毒鸡汤&#xff1a;学习&#xff0c;学习&#xff0c;再学习 ! 学&#xff0c;然后知不足。 > 专栏选自&#xff1a;刷…

C++(stack和queue)

1. stack的介绍、使用和实现 1.1 stack的介绍 stl里的stack其实和数据结构内的stack和前面数据结构的栈不能说百分百一样&#xff0c;但也有百分之90是一样的&#xff0c;他们的特性都是LIFO&#xff08;last in first out&#xff09;先进后出的原则&#xff0c;前面有类似的…