已Root设备如何通过ADB执行系统调用开启振动、手电筒
系统Action的查询获取路径
所有系统可响应的Action本质是AndroidManifest中注册的Intent过滤器标识,获取渠道分三类:
- 公开标准Action:直接查安卓框架中
android.content.Intent类的常量定义,所有AOSP原生公开的Action(比如你用到的调起录像的android.media.action.VIDEO_CAPTURE)都在这个类中明确定义了字符串值。 - 设备本地实机查询:已Root的设备可以直接通过PackageManager指令扫出当前系统所有注册的Action:
- 查Activity类Action:
adb shell pm query-activities --brief -a android.intent.action.MAIN - 查服务类Action:把上述指令中
query-activities替换为query-services - 查广播接收器类Action:替换为
query-receivers
可以配合grep过滤关键词快速定位需要的Action。
- 查Activity类Action:
- 厂商私有Action:部分厂商自定义功能的非公开Action,需要反编译对应系统应用(比如SystemUI、framework-res.apk、厂商定制的系统服务apk)的AndroidManifest.xml文件获取,这类Action没有统一公开文档,只能针对具体ROM提取。
目标功能的ADB执行指令
你已经拿到Root权限,以下指令可以直接执行,不会有权限拦截问题:
控制振动马达
- 基础时长振动:直接调用vibrator服务,指令格式为
adb shell su -c "cmd vibrator vibrate [振动时长]",时长单位为毫秒,比如振动1.5秒就执行adb shell su -c "cmd vibrator vibrate 1500"。 - 停止振动:执行
adb shell su -c "cmd vibrator cancel"即可立刻终止所有振动。
- 部分低版本安卓没有cmd vibrator服务,可以通过广播触发:
adb shell am broadcast -a android.intent.action.VIBRATE_ON --ei android.intent.extra.VIBRATE_DURATION 1500
控制手电筒
兼容性从高到低给三个方案,优先试第一个:
- 直接操作硬件节点(Root下全版本通用)
- 先找当前设备的手电筒节点:
adb shell su -c "find /sys/class/leds -name '*flash*' -o -name '*torch*'",输出结果里的brightness文件就是控制节点 - 开启手电筒:
adb shell su -c "echo 1 > [你查到的brightness文件路径]",比如常见原生路径是/sys/class/leds/flashlight/brightness,就执行adb shell su -c "echo 1 > /sys/class/leds/flashlight/brightness" - 关闭手电筒:把指令里的
1改成0即可
- 先找当前设备的手电筒节点:
- 调用相机服务(安卓6.0+通用,不需要找节点)
- 开启:
adb shell su -c "cmd camera flashlight on" - 关闭:
adb shell su -c "cmd camera flashlight off"
- 开启:
- 触发SystemUI广播(适配原生类ROM)
- 开启:
adb shell su -c "am broadcast -a com.android.systemui.action.TOGGLE_TORCH --ez state true" - 关闭:
adb shell su -c "am broadcast -a com.android.systemui.action.TOGGLE_TORCH --ez state false"
- 开启:
注意:小米、华为等部分ROM会在锁屏状态下拦截手电筒、振动的非系统调用,Root下直接操作sysfs硬件节点的方式不会被这类拦截规则影响。
内容的提问来源于stack exchange,提问作者andy977356679
相关产品推荐
相关产品推荐

