815 字
4 分钟
用 Termux 脚本监听 Oneplus 13T 的侧键并自定义执行脚本
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/Loading Comment Component...
