Skip to content

Commit 3d48380

Browse files
committed
feat(core): 新增屏幕截图功能并优化API文档
- 新增屏幕截图相关API,支持全屏和指定元素截图 - 更新API文档,增加更多API详细说明- 优化代码结构,增强可读性和可维护性
1 parent c00cc09 commit 3d48380

File tree

5 files changed

+434
-38
lines changed

5 files changed

+434
-38
lines changed

API_REFERENCE.md

Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
# Assists API 参考文档
2+
3+
本文档提供了Assists框架中所有可用API的详细参考信息。
4+
5+
## AssistsCore 核心API
6+
7+
AssistsCore是Assists框架的核心类,提供了所有主要的无障碍服务功能。
8+
9+
### 初始化和服务管理
10+
11+
| 方法名 | 说明 | 返回值 |
12+
|--------|------|--------|
13+
| `init(application: Application)` | 初始化AssistsCore ||
14+
| `openAccessibilitySetting()` | 打开系统无障碍服务设置页面 ||
15+
| `isAccessibilityServiceEnabled()` | 检查无障碍服务是否已开启 | Boolean |
16+
| `getPackageName()` | 获取当前窗口所属的应用包名 | String |
17+
18+
### 元素查找
19+
20+
| 方法名 | 说明 | 返回值 |
21+
|--------|------|--------|
22+
| `findById(id, filterText?, filterDes?, filterClass?)` | 通过id查找所有符合条件的元素 | List<AccessibilityNodeInfo> |
23+
| `AccessibilityNodeInfo.findById(id, filterText?, filterDes?, filterClass?)` | 在指定元素范围内通过id查找元素 | List<AccessibilityNodeInfo> |
24+
| `findByText(text, filterViewId?, filterDes?, filterClass?)` | 通过文本内容查找所有符合条件的元素 | List<AccessibilityNodeInfo> |
25+
| `findByTextAllMatch(text, filterViewId?, filterDes?, filterClass?)` | 查找所有文本完全匹配的元素 | List<AccessibilityNodeInfo> |
26+
| `AccessibilityNodeInfo.findByText(text, filterViewId?, filterDes?, filterClass?)` | 在指定元素范围内通过文本查找元素 | List<AccessibilityNodeInfo> |
27+
| `findByTags(className, viewId?, text?, des?)` | 根据多个条件查找元素 | List<AccessibilityNodeInfo> |
28+
| `AccessibilityNodeInfo.findByTags(className, viewId?, text?, des?)` | 在指定元素范围内根据多个条件查找元素 | List<AccessibilityNodeInfo> |
29+
| `getAllNodes(filterViewId?, filterDes?, filterClass?, filterText?)` | 获取当前窗口中的所有元素 | List<AccessibilityNodeInfo> |
30+
31+
### 元素类型判断
32+
33+
| 方法名 | 说明 | 返回值 |
34+
|--------|------|--------|
35+
| `AccessibilityNodeInfo.isFrameLayout()` | 判断元素是否是FrameLayout | Boolean |
36+
| `AccessibilityNodeInfo.isViewGroup()` | 判断元素是否是ViewGroup | Boolean |
37+
| `AccessibilityNodeInfo.isView()` | 判断元素是否是View | Boolean |
38+
| `AccessibilityNodeInfo.isImageView()` | 判断元素是否是ImageView | Boolean |
39+
| `AccessibilityNodeInfo.isTextView()` | 判断元素是否是TextView | Boolean |
40+
| `AccessibilityNodeInfo.isLinearLayout()` | 判断元素是否是LinearLayout | Boolean |
41+
| `AccessibilityNodeInfo.isRelativeLayout()` | 判断元素是否是RelativeLayout | Boolean |
42+
| `AccessibilityNodeInfo.isButton()` | 判断元素是否是Button | Boolean |
43+
| `AccessibilityNodeInfo.isImageButton()` | 判断元素是否是ImageButton | Boolean |
44+
| `AccessibilityNodeInfo.isEditText()` | 判断元素是否是EditText | Boolean |
45+
46+
### 元素信息获取
47+
48+
| 方法名 | 说明 | 返回值 |
49+
|--------|------|--------|
50+
| `AccessibilityNodeInfo.txt()` | 获取元素的文本内容 | String |
51+
| `AccessibilityNodeInfo.des()` | 获取元素的描述内容 | String |
52+
| `AccessibilityNodeInfo.getAllText()` | 获取元素的所有文本内容(包括text和contentDescription) | ArrayList<String> |
53+
| `AccessibilityNodeInfo.containsText(text)` | 判断元素是否包含指定文本 | Boolean |
54+
| `AccessibilityNodeInfo.getBoundsInScreen()` | 获取元素在屏幕中的位置信息 | Rect |
55+
| `AccessibilityNodeInfo.getBoundsInParent()` | 获取元素在父容器中的位置信息 | Rect |
56+
| `AccessibilityNodeInfo.isVisible(compareNode?, isFullyByCompareNode?)` | 判断元素是否可见 | Boolean |
57+
58+
### 元素层级操作
59+
60+
| 方法名 | 说明 | 返回值 |
61+
|--------|------|--------|
62+
| `AccessibilityNodeInfo.getNodes()` | 获取指定元素下的所有子元素 | ArrayList<AccessibilityNodeInfo> |
63+
| `AccessibilityNodeInfo.getChildren()` | 获取元素的直接子元素 | ArrayList<AccessibilityNodeInfo> |
64+
| `AccessibilityNodeInfo.findFirstParentByTags(className)` | 查找第一个符合指定类型的父元素 | AccessibilityNodeInfo? |
65+
| `AccessibilityNodeInfo.findFirstParentClickable()` | 查找元素的第一个可点击的父元素 | AccessibilityNodeInfo? |
66+
67+
### 元素操作
68+
69+
| 方法名 | 说明 | 返回值 |
70+
|--------|------|--------|
71+
| `AccessibilityNodeInfo.click()` | 点击元素 | Boolean |
72+
| `AccessibilityNodeInfo.longClick()` | 长按元素 | Boolean |
73+
| `AccessibilityNodeInfo.paste(text)` | 向元素粘贴文本 | Boolean |
74+
| `AccessibilityNodeInfo.setNodeText(text)` | 设置元素的文本内容 | Boolean |
75+
| `AccessibilityNodeInfo.selectionText(selectionStart, selectionEnd)` | 选择元素中的文本 | Boolean |
76+
| `AccessibilityNodeInfo.scrollForward()` | 向前滚动可滚动元素 | Boolean |
77+
| `AccessibilityNodeInfo.scrollBackward()` | 向后滚动可滚动元素 | Boolean |
78+
79+
### 手势操作
80+
81+
| 方法名 | 说明 | 返回值 |
82+
|--------|------|--------|
83+
| `gestureClick(x, y, duration?)` | 在指定坐标位置执行点击手势 | Boolean (suspend) |
84+
| `AccessibilityNodeInfo.nodeGestureClick(offsetX?, offsetY?, switchWindowIntervalDelay?, duration?)` | 在元素位置执行点击手势 | Boolean (suspend) |
85+
| `AccessibilityNodeInfo.nodeGestureClickByDouble(offsetX?, offsetY?, switchWindowIntervalDelay?, clickDuration?, clickInterval?)` | 在元素位置执行双击手势 | Boolean (suspend) |
86+
| `gesture(startLocation, endLocation, startTime, duration)` | 执行点击或滑动手势 | Boolean (suspend) |
87+
| `gesture(path, startTime, duration)` | 执行自定义路径的手势 | Boolean (suspend) |
88+
| `dispatchGesture(gesture, nonTouchableWindowDelay?)` | 执行手势操作 | Boolean (suspend) |
89+
90+
### 系统操作
91+
92+
| 方法名 | 说明 | 返回值 |
93+
|--------|------|--------|
94+
| `back()` | 执行返回操作 | Boolean |
95+
| `home()` | 返回主屏幕 | Boolean |
96+
| `notifications()` | 打开通知栏 | Boolean |
97+
| `recentApps()` | 显示最近任务 | Boolean |
98+
99+
### 应用启动
100+
101+
| 方法名 | 说明 | 返回值 |
102+
|--------|------|--------|
103+
| `launchApp(intent)` | 通过Intent启动应用 | Boolean (suspend) |
104+
| `launchApp(packageName)` | 通过包名启动应用 | Boolean (suspend) |
105+
106+
### 屏幕截图 (Android R+)
107+
108+
| 方法名 | 说明 | 返回值 |
109+
|--------|------|--------|
110+
| `takeScreenshot()` | 截取整个屏幕 | Bitmap? (suspend) |
111+
| `takeScreenshotSave(file?, format?)` | 截取整个屏幕并保存到文件 | File? (suspend) |
112+
| `AccessibilityNodeInfo.takeScreenshot()` | 截取指定元素的屏幕截图 | Bitmap? (suspend) |
113+
| `AccessibilityNodeInfo.takeScreenshotSave(file?, format?)` | 截取指定元素的屏幕截图并保存到文件 | File? (suspend) |
114+
115+
### 坐标计算
116+
117+
| 方法名 | 说明 | 返回值 |
118+
|--------|------|--------|
119+
| `getX(baseWidth, x)` | 根据基准宽度计算实际X坐标 | Int |
120+
| `getY(baseHeight, y)` | 根据基准高度计算实际Y坐标 | Int |
121+
| `getAppBoundsInScreen()` | 获取当前应用在屏幕中的位置 | Rect? |
122+
| `initAppBoundsInScreen()` | 初始化并缓存当前应用在屏幕中的位置 | Rect? |
123+
| `getAppWidthInScreen()` | 获取当前应用在屏幕中的宽度 | Int |
124+
| `getAppHeightInScreen()` | 获取当前应用在屏幕中的高度 | Int |
125+
126+
### 调试工具
127+
128+
| 方法名 | 说明 | 返回值 |
129+
|--------|------|--------|
130+
| `AccessibilityNodeInfo.logNode(tag?)` | 在日志中输出元素的详细信息 ||
131+
132+
## 使用说明
133+
134+
### 重要注意事项
135+
136+
- **可选参数**:带 `?` 的参数表示可选参数
137+
- **协程方法**:标记为 `suspend` 的方法需要在协程中调用
138+
- **版本要求**:标记为 `Android R+` 的方法需要Android 11及以上版本
139+
- **扩展函数**`AccessibilityNodeInfo.xxx()` 表示扩展函数,需要在AccessibilityNodeInfo实例上调用
140+
141+
## 其他API
142+
143+
更多API正在整理中,包括:
144+
- StepManager(步骤管理器)
145+
- AssistsWindowManager(浮窗管理器)
146+
- AssistsService(无障碍服务)
147+
- 其他工具类API
148+
149+
150+
## 💝 支持开源
151+
152+
开源不易,您的支持是我坚持的动力!
153+
154+
如果Assists框架对您的项目有帮助,可以通过以下方式支持我喔:
155+
156+
### ⭐ Star支持
157+
- 给项目点个Star,让更多开发者发现这个框架
158+
- 分享给身边的朋友和同事
159+
160+
### 💰 赞助支持
161+
- [爱发电支持](https://afdian.com/a/vencoder) - 您的每一份支持都是我们前进的动力
162+
- 加入付费社群获得更多技术支持和源码资源
163+
- 一杯Coffee的微信赞赏
164+
165+
166+
### 📞 联系我
167+
- 个人微信:x39598
168+
169+
**感谢所有的支持者,得到你们的支持我将会更加完善开源库的能力!** 🚀
170+
171+
---
172+
173+
> 如有疑问或发现文档错误,欢迎提交Issue或联系开发者。

README.md

Lines changed: 74 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -204,18 +204,68 @@ StepManager.execute(MyStepImpl::class.java, 1, isBegin = true)
204204
StepManager.isStop = true
205205
```
206206

207-
# Html+js/vue/vite开发自动化脚本
207+
## API列表
208+
209+
### 初始化和服务管理
210+
211+
| 方法名 | 说明 | 返回值 |
212+
|--------|------|--------|
213+
| `init(application: Application)` | 初始化AssistsCore ||
214+
| `openAccessibilitySetting()` | 打开系统无障碍服务设置页面 ||
215+
| `isAccessibilityServiceEnabled()` | 检查无障碍服务是否已开启 | Boolean |
216+
| `getPackageName()` | 获取当前窗口所属的应用包名 | String |
217+
218+
### 元素查找
219+
220+
| 方法名 | 说明 | 返回值 |
221+
|--------|------|--------|
222+
| `findById(id, filterText?, filterDes?, filterClass?)` | 通过id查找所有符合条件的元素 | List<AccessibilityNodeInfo> |
223+
| `AccessibilityNodeInfo.findById(id, filterText?, filterDes?, filterClass?)` | 在指定元素范围内通过id查找元素 | List<AccessibilityNodeInfo> |
224+
| `findByText(text, filterViewId?, filterDes?, filterClass?)` | 通过文本内容查找所有符合条件的元素 | List<AccessibilityNodeInfo> |
225+
| `findByTextAllMatch(text, filterViewId?, filterDes?, filterClass?)` | 查找所有文本完全匹配的元素 | List<AccessibilityNodeInfo> |
226+
| `AccessibilityNodeInfo.findByText(text, filterViewId?, filterDes?, filterClass?)` | 在指定元素范围内通过文本查找元素 | List<AccessibilityNodeInfo> |
227+
| `findByTags(className, viewId?, text?, des?)` | 根据多个条件查找元素 | List<AccessibilityNodeInfo> |
228+
| `AccessibilityNodeInfo.findByTags(className, viewId?, text?, des?)` | 在指定元素范围内根据多个条件查找元素 | List<AccessibilityNodeInfo> |
229+
| `getAllNodes(filterViewId?, filterDes?, filterClass?, filterText?)` | 获取当前窗口中的所有元素 | List<AccessibilityNodeInfo> |
230+
231+
### 元素信息获取
232+
233+
| 方法名 | 说明 | 返回值 |
234+
|--------|------|--------|
235+
| `AccessibilityNodeInfo.txt()` | 获取元素的文本内容 | String |
236+
| `AccessibilityNodeInfo.des()` | 获取元素的描述内容 | String |
237+
| `AccessibilityNodeInfo.getAllText()` | 获取元素的所有文本内容(包括text和contentDescription) | ArrayList<String> |
238+
| `AccessibilityNodeInfo.containsText(text)` | 判断元素是否包含指定文本 | Boolean |
239+
| `AccessibilityNodeInfo.getBoundsInScreen()` | 获取元素在屏幕中的位置信息 | Rect |
240+
| `AccessibilityNodeInfo.getBoundsInParent()` | 获取元素在父容器中的位置信息 | Rect |
241+
| `AccessibilityNodeInfo.isVisible(compareNode?, isFullyByCompareNode?)` | 判断元素是否可见 | Boolean |
242+
243+
### 元素层级操作
244+
245+
| 方法名 | 说明 | 返回值 |
246+
|--------|------|--------|
247+
| `AccessibilityNodeInfo.getNodes()` | 获取指定元素下的所有子元素 | ArrayList<AccessibilityNodeInfo> |
248+
| `AccessibilityNodeInfo.getChildren()` | 获取元素的直接子元素 | ArrayList<AccessibilityNodeInfo> |
249+
| `AccessibilityNodeInfo.findFirstParentByTags(className)` | 查找第一个符合指定类型的父元素 | AccessibilityNodeInfo? |
250+
| `AccessibilityNodeInfo.findFirstParentClickable()` | 查找元素的第一个可点击的父元素 | AccessibilityNodeInfo? |
251+
252+
### 元素操作
253+
254+
| 方法名 | 说明 | 返回值 |
255+
|--------|------|--------|
256+
| `AccessibilityNodeInfo.click()` | 点击元素 | Boolean |
257+
| `AccessibilityNodeInfo.longClick()` | 长按元素 | Boolean |
258+
| `AccessibilityNodeInfo.paste(text)` | 向元素粘贴文本 | Boolean |
259+
| `AccessibilityNodeInfo.setNodeText(text)` | 设置元素的文本内容 | Boolean |
260+
| `AccessibilityNodeInfo.selectionText(selectionStart, selectionEnd)` | 选择元素中的文本 | Boolean |
261+
| `AccessibilityNodeInfo.scrollForward()` | 向前滚动可滚动元素 | Boolean |
262+
| `AccessibilityNodeInfo.scrollBackward()` | 向后滚动可滚动元素 | Boolean |
263+
264+
### [更多API]()
265+
266+
## 示例教程
208267

209-
> ⚠️当前处于可用但非稳定版本
210-
211-
本仓库源码中包含了一个通过vite编写的一个自动化脚本示例:`assists-web-simple`,可自行下载编译。项目中已经有编译好的vite示例在 `simple/src/main/assets/assists-web-simple`目录下,在当前示例App中可直接加载查看这个vite编写的自动化脚本。
212-
213-
`assists-web`是基础的web支持库,封装了webview js接口对web端调用的支持,但是对于web端本地开发调试不友好,需要了解android端相关知识
214-
215-
## AssistsX脚本平台
216-
为了支持本地开发调试和动态化加载脚本,特地开发了脚本平台App:[AssistsX](https://www.pgyer.com/SqGaCx8C),可支持脚本的本地安装,在线安装,局域网加载,远程加载
217-
218-
### [开发文档传送门](https://github.com/ven-coder/Assists/tree/master/assists-web-simple)
268+
- [Appium结合AccessibilityService实现自动化微信登录](https://juejin.cn/post/7483409317564907530)
219269

220270
## 其他教程博客
221271

@@ -225,10 +275,6 @@ StepManager.isStop = true
225275
- [使用Appium获取节点信息](https://juejin.cn/post/7483409317564907530)
226276
- [使用uiautomatorviewer获取节点信息](https://blog.csdn.net/weixin_37496178/article/details/138328871?fromshare=blogdetail&sharetype=blogdetail&sharerId=138328871&sharerefer=PC&sharesource=weixin_37496178&sharefrom=from_link)
227277

228-
### 示例教程
229-
230-
- [Appium结合AccessibilityService实现自动化微信登录](https://juejin.cn/post/7483409317564907530)
231-
232278
### [版本历史](https://github.com/ven-coder/Assists/releases)
233279

234280
## 有问题欢迎反馈交流(微信群二维码失效可以加我拉进群)
@@ -257,6 +303,19 @@ StepManager.isStop = true
257303

258304
##### 定制开发可直接联系个人微信:x39598
259305

306+
# 新增支持Html+js/vue/vite开发自动化脚本
307+
308+
> ⚠️当前处于可用但非稳定版本
309+
310+
本仓库源码中包含了一个通过vite编写的一个自动化脚本示例:`assists-web-simple`,可自行下载编译。项目中已经有编译好的vite示例在 `simple/src/main/assets/assists-web-simple`目录下,在当前示例App中可直接加载查看这个vite编写的自动化脚本。
311+
312+
`assists-web`是基础的web支持库,封装了webview js接口对web端调用的支持,但是对于web端本地开发调试不友好,需要了解android端相关知识
313+
314+
## AssistsX脚本平台
315+
为了支持本地开发调试和动态化加载脚本,特地开发了脚本平台App:[AssistsX](https://www.pgyer.com/SqGaCx8C),可支持脚本的本地安装,在线安装,局域网加载,远程加载
316+
317+
### [开发文档传送门](https://github.com/ven-coder/Assists/tree/master/assists-web-simple)
318+
260319
# License
261320

262321
[GNU General Public License v3.0](https://github.com/ven-coder/Assists/blob/master/LICENSE)

0 commit comments

Comments
 (0)