You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();
        }
    }
}

配置步骤

  1. 在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>
  1. 创建无障碍服务配置文件
    在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" />
  1. 添加服务描述字符串
    在strings.xml中补充:
<string name="accessibility_desc">监听全局输入文本,触发指定脚本执行</string>

注意事项

  • 用户必须手动在系统设置中开启该应用的无障碍权限,否则服务无法运行
  • 执行bash脚本需要对应权限,涉及系统级操作时可能需要root权限
  • 可根据需求调整文本匹配逻辑(如完全匹配、忽略大小写等)
  • 务必回收AccessibilityNodeInfo资源,避免内存泄漏

内容的提问来源于stack exchange,提问作者shohel hossain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 14:48:16