落雨宸的时光机
815 字
4 分钟
用 Termux 脚本监听 Oneplus 13T 的侧键并自定义执行脚本
2026-02-19
...

1. 观察#

SB OPPO 连侧键启动 APP 都不给,单击双击长按也不分,还要用户自己搓,纯粹恶心体验。

首先需要一个 Shizuku,然后要导出一个正常能用的 rish

观察到 ADB 命令:getevent 会输出系统所有的交互,包括屏幕交互和物理按键交互。于是执行:

rish -c "getevent"

按下侧键,松开,截屏记录下输出的内容。例子:

/dev/input/event0: 0001 02df 00000001
/dev/input/event0: 0000 0000 00000000
/dev/input/event0: 0001 02df 00000000
/dev/input/event0: 0000 0000 00000000

由此得知并记录:

  • 侧键对应的设备是 /dev/input/event0
  • 侧键的特征码是 02df
  • 00000001 代表按下,00000000 代表松开。

又观察到 getevent -t /dev/input/event0 会监听指定按键设备,输出如下:

[  115009.121180] 0001 02df 00000001
[  115009.121180] 0000 0000 00000000
[  115009.262515] 0001 02df 00000000
[  115009.262515] 0000 0000 00000000

由此可以制作出监听侧键的脚本,然后在脚本里执行我们想要的操作。

2. 脚本#

AI 一把梭。一定记得改配置区,改成上面取得的信息。在 execute_action 里面配置相应的动作,你一定懂的。

大概不会耗电吧,因为是阻塞的。

记得给 Termux 开后台豁免,设置脚本为开机启动。

哦对了记得在系统设置里把侧键设置为无动作。一样可以正常触发。

#!/usr/bin/env python
import subprocess
import threading
import os
import re

# --- 配置区 ---
RISH_PATH = os.path.expanduser("~/data/rish/rish")
DEVICE = "/dev/input/event0"
TARGET_CODE = "02df"
LONG_PRESS_S = 0.5  # 长按阈值:按住 0.5s 立即触发
DOUBLE_CLICK_S = 0.3  # 双击判定间隙

# --- 状态变量 ---
click_count = 0
click_timer = None
long_press_timer = None
is_long_pressed = False  # 标记位,防止长按触发后松开又触发短按


def execute_action(action_type):
    print(f"【事件触发】检测到:{action_type}")
    subprocess.Popen(["termux-vibrate", "-d", "100"])
    # 在这里添加你的业务代码
    if action_type == "短按":
        subprocess.Popen([os.path.expanduser("~/data/scripts/assistant.py")])
    if action_type == "双击":
        pass
    if action_type == "长按":
        # os.system(f"{RISH_PATH} -c 'input keyevent 26'") # 示例:模拟电源键
        # os.system(f"{RISH_PATH} -c 'am start -n <包名>/<Activity全路径>'") # 示例:启动 APP
        # os.system(f"{RISH_PATH} -c 'am start -n com.google.android.apps.maps/com.google.android.maps.MapsActivity'") # 示例:启动 APP
        pass


def handle_click_timeout():
    """处理单击/双击的最终判定"""
    global click_count
    if click_count == 1:
        execute_action("短按")
    elif click_count == 2:
        execute_action("双击")
    click_count = 0


def trigger_long_press():
    """长按达标瞬间触发"""
    global is_long_pressed, click_count
    is_long_pressed = True
    click_count = 0  # 长按后重置连击计数
    execute_action("长按")


def start_listener():
    global click_count, click_timer, long_press_timer, is_long_pressed

    cmd = [RISH_PATH, "-c", f"getevent -t {DEVICE}"]
    process = subprocess.Popen(
        cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True, bufsize=1
    )

    # 匹配时间戳和最后的 1 或 0
    pattern = re.compile(r"\[\s*([\d\.]+)\]\s+.*([0-9a-fA-F]+)$")

    print(f"开始监听 {DEVICE} (长按即触发模式)...")

    for line in iter(process.stdout.readline, ""):
        if TARGET_CODE not in line:
            continue

        match = pattern.search(line.strip())
        if not match:
            continue

        # 动作值取最后一位即可:1 为按下,0 为松开
        action = match.group(2).strip("0")
        action = "1" if action == "" and match.group(2).endswith("1") else action
        # 兼容处理:有些 getevent 输出 00000001,有些是 1
        raw_val = match.group(2)

        if raw_val.endswith("1"):  # Key Down
            is_long_pressed = False
            # 1. 取消之前的单击连击判定
            if click_timer:
                click_timer.cancel()
            # 2. 开启长按计时:如果 0.5s 后还没松开,就执行长按函数
            long_press_timer = threading.Timer(LONG_PRESS_S, trigger_long_press)
            long_press_timer.start()

        elif raw_val.endswith("0"):  # Key Up
            # 1. 立即取消长按计时
            if long_press_timer:
                long_press_timer.cancel()

            # 2. 如果刚才已经触发过长按了,松开时就什么都不做
            if is_long_pressed:
                continue

            # 3. 走短按/双击逻辑
            click_count += 1
            click_timer = threading.Timer(DOUBLE_CLICK_S, handle_click_timeout)
            click_timer.start()


if __name__ == "__main__":
    try:
        start_listener()
    except KeyboardInterrupt:
        print("\n监听已停止")

用 Termux 脚本监听 Oneplus 13T 的侧键并自定义执行脚本
https://blog.lzc256.com/posts/customizing-the-side-snap-button-for-oneplus-13t/
作者
落雨宸
发布于
2026-02-19
许可协议
CC BY-NC-SA 4.0


Loading Comment Component...