Android监听特定输入词触发bash脚本:实现方法与代码指导
Android无障碍监听输入文本并执行脚本实现方案
监听实现方式
依托Android系统的AccessibilityService实现全局输入监听,核心逻辑如下:
- 监听系统中
TYPE_VIEW_TEXT_CHANGED类型的无障碍事件,该事件会在任意应用输入框文本变化时触发 - 从事件中提取输入框的当前文本内容
- 判断文本是否包含/匹配目标词汇(如HELP),匹配成功则执行预设bash脚本
代码存放类
创建一个继承自AccessibilityService的自定义服务类(比如InputTriggerService),所有监听、判断、执行逻辑都集中在这个类中。
所需导入的类
import android.accessibilityservice.AccessibilityService; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; import java.util.List;
核心代码实现
public class InputTriggerService extends AccessibilityService { // 自定义触发词汇 private static final String TRIGGER_WORD = "HELP"; @Override public void onAccessibilityEvent(AccessibilityEvent event) { // 仅处理文本变化事件 if (event.getEventType() != AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED) { return; } // 获取当前页面的根节点 AccessibilityNodeInfo rootNode = getRootInActiveWindow(); if (rootNode == null) { return; } // 查找当前输入框节点(优先匹配系统默认输入框ID,再适配EditText类) List<AccessibilityNodeInfo> inputNodes = rootNode.findAccessibilityNodeInfosByViewId("android:id/edit"); if (inputNodes.isEmpty()) { inputNodes = rootNode.findAccessibilityNodeInfosByClassName("android.widget.EditText"); } for (AccessibilityNodeInfo inputNode : inputNodes) { CharSequence inputText = inputNode.getText(); if (inputText != null && inputText.toString().contains(TRIGGER_WORD)) { // 匹配到目标词汇,执行脚本 executeBashScript("/sdcard/your_script.sh"); // 可选:执行后清空输入框 // inputNode.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, null); break; } } // 回收节点资源,避免内存泄漏 rootNode.recycle(); } @Override public void onInterrupt() { // 服务中断时的清理操作 } private void executeBashScript(String scriptPath) { try { // 执行bash脚本,确保脚本有可执行权限(可通过chmod +x 脚本路径设置) Runtime.getRuntime().exec("sh " + scriptPath); } catch (Exception e) { e.printStackTrace(); } } }
配置步骤
- 在AndroidManifest.xml中注册服务
<service android:name=".InputTriggerService" 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_service_config" /> </service>
- 创建无障碍服务配置文件
在res/xml目录下新建accessibility_service_config.xml:
<?xml version="1.0" encoding="utf-8"?> <accessibility-service xmlns:android="http://schemas.android.com/apk/res/android" android:accessibilityEventTypes="typeViewTextChanged" android:accessibilityFeedbackType="feedbackGeneric" android:accessibilityFlags="flagDefault" android:canRetrieveWindowContent="true" android:description="@string/accessibility_desc" />
- 添加服务描述字符串
在strings.xml中补充:
<string name="accessibility_desc">监听全局输入文本,触发指定脚本执行</string>
注意事项
- 用户必须手动在系统设置中开启该应用的无障碍权限,否则服务无法运行
- 执行bash脚本需要对应权限,涉及系统级操作时可能需要root权限
- 可根据需求调整文本匹配逻辑(如完全匹配、忽略大小写等)
- 务必回收AccessibilityNodeInfo资源,避免内存泄漏
内容的提问来源于stack exchange,提问作者shohel hossain
相关产品推荐
相关产品推荐

