安卓无障碍脚本开发全教程
文章目录
- 第一部分:无障碍服务基础
- 1.1 无障碍服务概述
- 核心功能:
- 1.2 基本原理与架构
- 1.3 开发环境配置
- 所需工具:
- 关键依赖:
- 第二部分:创建基础无障碍服务
- 2.1 服务声明配置
- 2.2 服务配置文件
- 关键属性说明:
- 2.3 实现服务类
- 第三部分:高级功能实现
- 3.1 节点查找与操作
- 常用查找方法:
- 节点操作示例:
- 3.2 手势模拟
- 3.3 全局事件监听
- 第四部分:实战案例开发
- 4.1 自动填写表单
- 4.2 消息自动回复
- 4.3 游戏自动化辅助
- 第五部分:调试与优化
- 5.1 调试技巧
- ADB调试命令:
- 日志记录最佳实践:
- 5.2 性能优化
- 优化建议:
- 优化示例:
- 第六部分:发布与安全
- 6.1 权限与隐私
- 必要权限声明:
- 隐私注意事项:
- 6.2 发布流程
- 第七部分:高级主题
- 7.1 与其他技术的结合
- 与Tasker集成:
- 使用机器学习:
- 7.2 跨版本兼容性处理
- 版本差异处理表:
- 兼容性代码示例:

第一部分:无障碍服务基础
1.1 无障碍服务概述
安卓无障碍服务(Accessibility Service)是一种特殊类型的服务,旨在帮助残障用户或需要辅助功能的用户更好地使用设备。但它的功能远不止于此,开发者可以利用它实现自动化操作、界面监控和交互等功能。
核心功能:
- 界面内容访问:获取屏幕上的UI元素信息
- 自动化操作:模拟点击、滑动等用户操作
- 事件监控:监听窗口变化、通知、焦点改变等系统事件
- 增强交互:为特定应用提供定制化辅助功能
1.2 基本原理与架构
1.3 开发环境配置
所需工具:
- Android Studio最新版
- 安卓设备或模拟器(API 16+)
- ADB调试工具
关键依赖:
dependencies {implementation 'androidx.core:core-ktx:1.7.0'implementation 'androidx.appcompat:appcompat:1.4.1'
}
第二部分:创建基础无障碍服务
2.1 服务声明配置
在AndroidManifest.xml
中添加服务声明:
<serviceandroid:name=".MyAccessibilityService"android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"android:exported="true"><intent-filter><action android:name="android.accessibilityservice.AccessibilityService" /></intent-filter><meta-dataandroid:name="android.accessibilityservice"android:resource="@xml/service_config" />
</service>
2.2 服务配置文件
创建res/xml/service_config.xml
:
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"android:description="@string/accessibility_service_description"android:accessibilityEventTypes="typeAllMask"android:accessibilityFlags="flagDefault|flagRetrieveInteractiveWindows"android:canRetrieveWindowContent="true"android:settingsActivity="com.example.android.accessibility.ServiceSettingsActivity"android:canRequestFilterKeyEvents="true"android:canPerformGestures="true"android:notificationTimeout="100"android:packageNames="com.example.targetapp" />
关键属性说明:
accessibilityEventTypes
:监听的事件类型packageNames
:指定监控的应用包名(可选)canPerformGestures
:允许执行手势操作(API 24+)
2.3 实现服务类
创建基础服务类MyAccessibilityService.kt
:
class MyAccessibilityService : AccessibilityService() {override fun onServiceConnected() {Log.d("A11yService", "无障碍服务已连接")// 可以在此处进行服务配置更新val info = AccessibilityServiceInfo().apply {eventTypes = AccessibilityEvent.TYPE_VIEW_CLICKED or AccessibilityEvent.TYPE_WINDOW_STATE_CHANGEDfeedbackType = AccessibilityServiceInfo.FEEDBACK_GENERICnotificationTimeout = 100flags = AccessibilityServiceInfo.DEFAULT orAccessibilityServiceInfo.FLAG_RETRIEVE_INTERACTIVE_WINDOWS}this.serviceInfo = info}override fun onAccessibilityEvent(event: AccessibilityEvent?) {event ?: returnwhen (event.eventType) {AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED -> {handleWindowChange(event)}AccessibilityEvent.TYPE_VIEW_CLICKED -> {handleViewClick(event)}}}override fun onInterrupt() {Log.w("A11yService", "无障碍服务被中断")}private fun handleWindowChange(event: AccessibilityEvent) {val rootNode = rootInActiveWindow ?: returnLog.d("A11yService", "窗口变化: ${event.packageName}")// 遍历视图树traverseNode(rootNode)}private fun traverseNode(node: AccessibilityNodeInfo, depth: Int = 0) {if (node.childCount == 0) {Log.d("A11yTree", "${" ".repeat(depth)}${node.viewIdResourceName}")return}for (i in 0 until node.childCount) {node.getChild(i)?.let { child ->traverseNode(child, depth + 1)child.recycle()}}}
}
第三部分:高级功能实现
3.1 节点查找与操作
常用查找方法:
fun findNodes(root: AccessibilityNodeInfo) {// 通过文本查找val byText = root.findAccessibilityNodeInfosByText("搜索")// 通过View ID查找(全限定ID)val byId = root.findAccessibilityNodeInfosByViewId("com.example.app:id/btnSubmit")// 通过类名查找val editTexts = mutableListOf<AccessibilityNodeInfo>()val queue: Queue<AccessibilityNodeInfo> = LinkedList()queue.add(root)while (queue.isNotEmpty()) {val current = queue.poll()if (current.className == "android.widget.EditText") {editTexts.add(current)}for (i in 0 until current.childCount) {current.getChild(i)?.let { queue.add(it) }}}
}
节点操作示例:
fun performActions(node: AccessibilityNodeInfo) {// 点击操作if (node.isClickable) {node.performAction(AccessibilityNodeInfo.ACTION_CLICK)}// 文本输入val arguments = Bundle().apply {putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, "Hello")}node.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, arguments)// 焦点控制node.performAction(AccessibilityNodeInfo.ACTION_FOCUS)// 滚动操作node.performAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD)
}
3.2 手势模拟
Android支持通过无障碍服务模拟复杂手势:
fun performGesture(service: AccessibilityService) {val path = Path().apply {moveTo(100f, 100f) // 起点lineTo(500f, 100f) // 移动到右侧lineTo(500f, 500f) // 向下移动lineTo(100f, 500f) // 向左移动close() // 闭合路径}val gestureBuilder = GestureDescription.Builder().addStroke(GestureDescription.StrokeDescription(path, 0L, // 开始时间1000L, // 持续时间(毫秒)false // 是否持续))service.dispatchGesture(gestureBuilder.build(), object : AccessibilityService.GestureResultCallback() {override fun onCompleted(gestureDescription: GestureDescription?) {Log.d("Gesture", "手势完成")}override onCancelled(gestureDescription: GestureDescription?) {Log.w("Gesture", "手势取消")}}, null)
}
3.3 全局事件监听
监听系统级事件:
override fun onAccessibilityEvent(event: AccessibilityEvent) {when (event.eventType) {AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED -> {val notificationText = event.text.joinToString()Log.d("Notification", "新通知: $notificationText")}AccessibilityEvent.TYPE_ANNOUNCEMENT -> {Log.d("Announcement", "系统公告: ${event.text}")}AccessibilityEvent.TYPE_TOUCH_EXPLORATION_GESTURE_START -> {Log.d("Touch", "触摸探索开始")}}
}
第四部分:实战案例开发
4.1 自动填写表单
class FormFillerService : AccessibilityService() {private val formData = mapOf("username" to "testuser","password" to "secure123","email" to "test@example.com")override fun onAccessibilityEvent(event: AccessibilityEvent) {if (event.eventType != AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED) returnval rootNode = rootInActiveWindow ?: returnformData.forEach { (fieldName, value) ->val nodes = rootNode.findAccessibilityNodeInfosByViewId("com.example.app:id/$fieldName")nodes.firstOrNull()?.let { field ->if (field.className == "android.widget.EditText") {val args = Bundle().apply {putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, value)}field.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, args)}}}// 自动提交表单rootNode.findAccessibilityNodeInfosByViewId("com.example.app:id/submit").firstOrNull()?.performAction(AccessibilityNodeInfo.ACTION_CLICK)}
}
4.2 消息自动回复
class AutoReplyService : AccessibilityService() {private val replyMessages = listOf("我正在开会,稍后回复您","好的,收到","谢谢通知")override fun onAccessibilityEvent(event: AccessibilityEvent) {if (event.packageName != "com.whatsapp") returnwhen (event.eventType) {AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED -> {// 处理通知事件val messages = event.text.filter { it.contains("发来消息") }if (messages.isNotEmpty()) {replyToLatestMessage()}}AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED -> {// 处理界面文本变化if (isChatOpen()) {autoReplyInChat()}}}}private fun replyToLatestMessage() {// 实现打开聊天界面并回复的逻辑}private fun isChatOpen(): Boolean {// 检测当前是否在聊天界面}private fun autoReplyInChat() {val root = rootInActiveWindow ?: returnval messageNodes = root.findAccessibilityNodeInfosByViewId("com.whatsapp:id/message_text")// 获取最后一条消息val lastMessage = messageNodes.lastOrNull()?.text ?: return// 随机选择回复内容val randomReply = replyMessages.random()// 找到输入框并发送root.findAccessibilityNodeInfosByViewId("com.whatsapp:id/entry").firstOrNull()?.let { input ->val args = Bundle().apply {putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, randomReply)}input.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, args)// 发送消息root.findAccessibilityNodeInfosByViewId("com.whatsapp:id/send").firstOrNull()?.performAction(AccessibilityNodeInfo.ACTION_CLICK)}}
}
4.3 游戏自动化辅助
class GameHelperService : AccessibilityService() {private var isRunning = falseprivate val handler = Handler(Looper.getMainLooper())private val clickRunnable = object : Runnable {override fun run() {performAutoClick()if (isRunning) {handler.postDelayed(this, 1000) // 每秒点击一次}}}override fun onServiceConnected() {val info = AccessibilityServiceInfo().apply {eventTypes = AccessibilityEvent.TYPE_WINDOW_STATE_CHANGEDfeedbackType = AccessibilityServiceInfo.FEEDBACK_GENERICflags = AccessibilityServiceInfo.FLAG_REPORT_VIEW_IDS}serviceInfo = info}override fun onAccessibilityEvent(event: AccessibilityEvent) {if (event.packageName != "com.game.package") returnwhen (event.eventType) {AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED -> {checkGameState()}}}private fun checkGameState() {val root = rootInActiveWindow ?: returnval battleNode = root.findAccessibilityNodeInfosByViewId("com.game.package:id/battle_indicator")if (battleNode.isNotEmpty()) {startAutoClicking()} else {stopAutoClicking()}}private fun startAutoClicking() {if (!isRunning) {isRunning = truehandler.post(clickRunnable)}}private fun stopAutoClicking() {isRunning = falsehandler.removeCallbacks(clickRunnable)}private fun performAutoClick() {val root = rootInActiveWindow ?: returnval attackBtn = root.findAccessibilityNodeInfosByViewId("com.game.package:id/attack_button").firstOrNull()attackBtn?.performAction(AccessibilityNodeInfo.ACTION_CLICK)// 随机位置点击,避免被检测为机器人if (Math.random() < 0.3) {val randomX = (100..500).random()val randomY = (200..800).random()dispatchGesture(createClickGesture(randomX, randomY), null, null)}}private fun createClickGesture(x: Int, y: Int): GestureDescription {val clickPath = Path().apply {moveTo(x.toFloat(), y.toFloat())}return GestureDescription.Builder().addStroke(GestureDescription.StrokeDescription(clickPath, 0, 50)).build()}
}
第五部分:调试与优化
5.1 调试技巧
ADB调试命令:
# 查看已启用的无障碍服务
adb shell settings get secure enabled_accessibility_services# 启用服务
adb shell settings put secure enabled_accessibility_services com.example.pkg/.MyAccessibilityService# 查看无障碍事件日志
adb shell logcat -s AccessibilityEvent
日志记录最佳实践:
fun logNodeInfo(node: AccessibilityNodeInfo) {val sb = StringBuilder().apply {append("View ID: ${node.viewIdResourceName}\n")append("Text: ${node.text}\n")append("Class: ${node.className}\n")append("Bounds: ${node.boundsInScreen}\n")append("Actions: ${node.actionList.joinToString()}\n")append("ChildCount: ${node.childCount}\n")}Log.d("NodeInfo", sb.toString())
}
5.2 性能优化
优化建议:
- 减少遍历深度:只查找必要的节点层级
- 及时回收节点:调用
recycle()
释放资源 - 事件过滤:只监听必要的事件类型
- 延迟处理:对频繁事件使用防抖
- 后台处理:将耗时操作移到工作线程
优化示例:
class OptimizedService : AccessibilityService() {private val eventQueue = LinkedBlockingQueue<AccessibilityEvent>()private val workerThread = HandlerThread("EventProcessor").apply { start() }private val workerHandler = Handler(workerThread.looper)private val eventProcessor = object : Runnable {override fun run() {while (true) {val event = eventQueue.take()processEvent(event)}}}override fun onCreate() {super.onCreate()workerHandler.post(eventProcessor)}override fun onAccessibilityEvent(event: AccessibilityEvent) {// 快速将事件加入队列,避免阻塞主线程eventQueue.put(event)}private fun processEvent(event: AccessibilityEvent) {// 实际处理逻辑}override fun onDestroy() {workerThread.quitSafely()super.onDestroy()}
}
第六部分:发布与安全
6.1 权限与隐私
必要权限声明:
<uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
隐私注意事项:
- 明确告知用户:在隐私政策中说明数据收集范围
- 最小权限原则:只请求必要的权限
- 敏感数据处理:避免收集密码等敏感信息
- 数据加密:对存储的日志和数据进行加密
6.2 发布流程
-
测试阶段:
- 在不同安卓版本上测试
- 在各种品牌设备上测试(特别是国产ROM)
- 测试电池消耗情况
-
应用商店要求:
- 明确说明是无障碍辅助工具
- 提供详细的使用说明视频
- 如果是自动化工具,需遵守各商店政策
-
持续更新:
- 定期适配新安卓版本
- 针对流行应用的特殊适配
- 根据用户反馈优化功能
第七部分:高级主题
7.1 与其他技术的结合
与Tasker集成:
// 接收Tasker的广播意图
private val taskerReceiver = object : BroadcastReceiver() {override fun onReceive(context: Context, intent: Intent) {if (intent.action == "net.dinglisch.android.tasker.ACTION_TRIGGER") {val task = intent.getStringExtra("task")when (task) {"start_automation" -> startAutomation()"stop_automation" -> stopAutomation()}}}
}override fun onCreate() {super.onCreate()registerReceiver(taskerReceiver, IntentFilter("net.dinglisch.android.tasker.ACTION_TRIGGER"))
}
使用机器学习:
// 使用ML Kit识别屏幕内容
fun detectTextFromScreen(bitmap: Bitmap): String {val recognizer = TextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS)val image = InputImage.fromBitmap(bitmap, 0)return try {val result = recognizer.process(image).await()result.text} catch (e: Exception) {Log.e("ML", "识别失败", e)""}
}// 截图并处理
fun captureAndAnalyze() {val projection = MediaProjectionManager.createScreenCaptureIntent()// 需要先获取用户授权...val imageReader = ImageReader.newInstance(screenWidth, screenHeight, PixelFormat.RGBA_8888, 2)imageReader.setOnImageAvailableListener({ reader ->val image = reader.acquireLatestImage()// 转换为Bitmap并传递给识别器val text = detectTextFromScreen(convertImageToBitmap(image))Log.d("ScreenText", "识别结果: $text")image.close()}, handler)
}
7.2 跨版本兼容性处理
版本差异处理表:
功能 | API 16-22 | API 23-28 | API 29+ |
---|---|---|---|
节点信息获取 | 基本支持 | 增强支持 | 受限 |
手势模拟 | 不支持 | 部分支持 | 完全支持 |
隐私限制 | 无 | 部分 | 严格 |
后台服务 | 允许 | 限制 | 严格限制 |
兼容性代码示例:
fun performActionCompat(node: AccessibilityNodeInfo, action: Int, args: Bundle? = null): Boolean {return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {node.performAction(action, args)} else {node.performAction(action)}
}fun getNodeTextCompat(node: AccessibilityNodeInfo): String {return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {node.text?.toString() ?: ""} else {node.text ?: ""}
}
相关文章:

安卓无障碍脚本开发全教程
文章目录 第一部分:无障碍服务基础1.1 无障碍服务概述核心功能: 1.2 基本原理与架构1.3 开发环境配置所需工具:关键依赖: 第二部分:创建基础无障碍服务2.1 服务声明配置2.2 服务配置文件关键属性说明: 2.3 …...
svn迁移到git保留记录和Python字符串格式化 f-string的进化历程
svn迁移到git保留记录 and Python字符串格式化(二): f-string的进化历程 在将项目从SVN迁移到Git时,保留完整的版本历史记录非常重要。下面是详细的步骤和工具,可以帮助你完成这一过程: 安装Git和SVN工具 首先&#…...

SOC-ESP32S3部分:10-GPIO中断按键中断实现
飞书文档https://x509p6c8to.feishu.cn/wiki/W4Wlw45P2izk5PkfXEaceMAunKg 学习了GPIO输入和输出功能后,参考示例工程,我们再来看看GPIO中断,IO中断的配置分为三步 配置中断触发类型安装中断服务注册中断回调函数 ESP32-S3的所有通用GPIO…...
【神经网络与深度学习】扩散模型之原理解释
引言: 在人工智能的生成领域,扩散模型(Diffusion Model)是一项极具突破性的技术。它不仅能够生成高质量的图像,还可以应用于音频、3D建模等领域。扩散模型的核心思想来源于物理扩散现象,其工作方式类似于从…...
语音合成之十六 语音合成(TTS)跳跃与重复问题的解析:成因、机制及解决方案
语音合成(TTS)跳跃与重复问题的解析:成因、机制及解决方案 引言TTS中跳跃与重复问题的根本原因注意力机制的失效文本到语音的对齐挑战自回归(AR)TTS模型的固有挑战时长建模的重要性输入数据特征的影响 构建鲁棒性&…...

战略-2.1 -战略分析(PEST/五力模型/成功关键因素)
战略分析路径,先宏观(PEST)、再产业(产品生命周期、五力模型、成功关键因素)、再竞争对手分析、最后企业内部分析。 本文介绍:PEST、产品生命周期、五力模型、成功关键因素、产业内的战略群组 一、宏观环境…...

python第三方库安装错位
问题所在 今天在安装我的django库时,我的库安装到了python3.13版本。我本意是想安装到python3.11版本的。我的pycharm右下角也设置了python3.11 但是太可恶了,我在pycharm的项目终端执行安装命令的时候还是给我安装到了python3.13的位置。 解决方法 我…...

如何把vue项目部署在nginx上
1:在vscode中把vue项目打包会出现dist文件夹 按照图示内容即可把vue项目部署在nginx上...

Vue3集成Element Plus完整指南:从安装到主题定制下-实现后台管理系统框架搭建
本文将详细介绍如何使用 Vue 3 构建一个综合管理系统,包括路由配置、页面布局以及常用组件集成。 一、路由配置 首先,我们来看系统的路由配置,这是整个应用的基础架构: import {createRouter, createWebHistory} from vue-rout…...

SpringBoot项目配置文件、yml配置文件
一. 配置文件格式 1. SpringBoot项目提供了多种属性配置方式(properties、yaml、yml)。 二. yml配置文件 1. 格式: (1) 数值前边必须有空格,作为分隔符。 (2) 使用缩进表示层级关系,缩进时,不允许使用Tab键,只能使用空…...
Linux性能监控:工具与最佳实践
引言 在Linux系统管理中,性能监控是确保系统健康运行的关键环节。无论是排查系统瓶颈、优化资源分配,还是预防潜在问题,有效的监控工具和技术都能为管理员提供宝贵的数据支持。本文将介绍Linux性能监控的核心工具、方法论和最佳实践。 一、…...

windows11 安装 jupyter lab
1、安装python环境 略 2、安装jupyterlab pip install jupyterlab 3、将jupyterlab的目录配置到path pip show jupyterlab 看到location的值,那么 jupyterlab就安装在与之同级的Scripts下,将Scripts目录设置在Path即可。...

【算法】:动态规划--背包问题
背包问题 引言 什么是背包问题? 背包问题就是一个有限的背包,给出一定的物品,如何合理的装入物品使得背包中的物品的价值最大? 01背包 01背包,顾名思义就是每一种给定的物品要么选择,要么不选ÿ…...

Nginx核心功能
目录 前言一. 正向代理1.配置正向代理(1)添加正向代理(2)验证正向代理 二. 反向代理1.配置nginx七层代理(1)环境安装(2)配置nginx七层代理转发(3)测试 2. 配置…...
AG-UI:重构AI代理与前端交互的下一代协议标准
目录 技术演进背景与核心价值协议架构与技术原理深度解析核心功能与标准化事件体系典型应用场景与实战案例开发者生态与集成指南行业影响与未来展望1. 技术演进背景与核心价值 1.1 AI交互的三大痛点 当前AI应用生态面临三大核心挑战: 交互碎片化:LangGraph、CrewAI等框架各…...

upload-labs通关笔记-第15关 文件上传之图片马getimagesize绕过
系列目录 upload-labs通关笔记-第1关 文件上传之前端绕过(3种渗透方法) upload-labs通关笔记-第2关 文件上传之MIME绕过-CSDN博客 upload-labs通关笔记-第3关 文件上传之黑名单绕过-CSDN博客 upload-labs通关笔记-第4关 文件上传之.htacess绕过-CSDN…...
FFmpeg中使用Android Content协议打开文件设备
引言 随着Android 10引入的Scoped Storage(分区存储)机制,传统的文件访问方式发生了重大变化。FFmpeg作为强大的多媒体处理工具,也在不断适应Android平台的演进。本文将介绍如何在FFmpeg 7.0版本中使用Android content协议直接访…...
SQL语句的执行流程
文章目录 一、执行流程二、建立连接三、预处理器四、解析器4.1 词法分析4.2 语法分析4.3 语义分析 五、优化器六、执行器七、返回结果 一、执行流程 阶段主要功能关键组件1. 建立连接身份验证、权限检查连接器2. 预处理器缓存检查、SQL预处理查询缓存3. 解析器词法分析、语法分…...
Spring 框架的JDBC 模板技术
一、JDBC 模板技术概述 1、什么模板技术? Spring 框架中提供了很多持久层的模板类来简化编程,使用模板类编写程序会变的简单。 2、template 模板 都是 Spring 框架来提供XxxTemplate,比如Spring框架提供了 JDBC 模板。 JdbcTemplate 类&…...

【游戏设计】游戏玩法与游戏机制
在游戏设计中,“玩法”(Gameplay)和“机制”(Game Mechanic)是两个频繁出现但容易混淆的概念。许多新手开发者、设计师甚至玩家常常将两者混为一谈。本文将通过定义、对比和案例解析的方式,清晰地阐明二者的…...

Spring的资源Resource和ResourceLoader
两者区别和联系 Resource 和ResourceLoader 都是 Spring 框架中用于资源访问的接口 Resource 是“资源本身”,ResourceLoader 是“资源工厂/加载器”,负责创建 Resource。 Resource:Spring 统一抽象的“资源”对象,可以表示文件、类路径下的文件、U…...
字节跳动旗下火山引擎都覆盖哪些领域
首先,我需要确认火山引擎的主要业务范围。根据之前的资料,火山引擎是字节跳动的企业技术服务平台,可能包括云服务、人工智能、大数据分析等。不过需要更详细的信息,比如具体的产品和服务,覆盖的行业等。 接下来&#x…...

【AI实战】从“苦AI”到“爽AI”:Magentic-UI 把“人类-多智能体协作”玩明白了!
Hello,亲爱的小伙伴们!你是否曾经在深夜里,为了自动化点外卖、筛机票、抓网页数据焦头烂额?有没有幻想过哪天能出个“贴心AI管家”,一键点菜、搞定事务、自动操作网页,比你还懂你?更关键——还让…...
LeetCode面试经典150题梳理
link:https://leetcode.cn/studyplan/top-interview-150/ 日期题号备注2025.5.2288. 合并两个有序数组 - 力扣(LeetCode)通过双指针法从后向前合并来解决,避免覆盖nums1中的元素2025.5.2327. 移除元素 - 力扣(LeetCode…...
ABP VNext + Orleans:Actor 模型下的分布式状态管理最佳实践
ABP VNext Orleans:Actor 模型下的分布式状态管理最佳实践 🚀 📚 目录 ABP VNext Orleans:Actor 模型下的分布式状态管理最佳实践 🚀一、引言:分布式系统的状态挑战 💡二、架构图与技术栈 &am…...

Linux之 SPI 驱动框架- spi-mem 框架
一、框架变更的历程 1.1 旧框架图 1.2 新框架图 那么问题来了, 为什么要开发新的 SPI 存储器接口? 有了这个新的框架, SPI NOR 和SPI NAND 都可以基于相同的SPI控制器驱动进行支持了。m25p80 驱动将被修改成,使用spi-mem 接口&a…...

振动分析 - 献个宝
1.一个自制的振动能量分析工具 这个分析工具似乎真的定位到了故障的具体位置。 1.1对一组实验室虚拟信号的分析结果: 1.2 对现场真实数据的分析结果 依照边频带的调制,和边频的缝隙宽度,基本定位到问题。 追加几份待看的文档: 齿轮结构的频谱特征 - 知乎使用 FFT 获得…...
从脑电图和大脑记录中学习稳健的深度视觉表征
从脑电图和大脑记录中学习稳健的深度视觉表征 印度,印度,印度,印度大脑实验室,印度 例如,达拉普,克普拉萨德,山,山,新的。ac .在 摘要 解码人类大脑一直是新机器人科学家…...

【论文阅读】——D^3-Human: Dynamic Disentangled Digital Human from Monocular Vi
文章目录 摘要1 引言2 相关工作3 方法3.1 HmSDF 表示3.2 区域聚合3.3. 变形场3.4. 遮挡感知可微分渲染3.5 训练3.5.1 训练策略3.5.2 重建损失3.5.3 正则化限制 4. 实验4.1 定量评估4.2 定性评价4.3 消融研究4.4 应用程序 5 结论 摘要 我们介绍 D 3 D^{3} D3人,一种…...

高分辨率北半球多年冻土数据集(2000-2016)
关键数据集分类:冰冻圈数据集时间分辨率:10 year < x < 100 year空间分辨率:1km - 10km共享方式:开放获取数据大小:339.79 MB数据时间范围:2000-01-01 — 2016-12-31元数据更新时间:2022-…...