我正在使用
UiAutomator
创建测试,并且在应用程序中使用振动,但在测试中不需要它。
我正在这样做:
InstrumentationRegistry.getInstrumentation().getUiAutomation().executeShellCommand("adb shell cmd appops set <app package name> VIBRATE ignore")
但是这个命令对我不起作用,也许是因为振动来自通知。
您只需从提供给
adb shell
方法的字符串中删除 executeShellCommand
即可。工作声明将是:
InstrumentationRegistry.getInstrumentation().getUiAutomation().executeShellCommand("cmd appops set <app package name> VIBRATE ignore")
许多应用程序忽略或绕过
InstrumentationRegistry.getInstrumentation().getUiAutomation().executeShellCommand("cmd appops set <app package name> VIBRATE ignore")
应用内振动设置。
我创建了一个简单的脚本,并将其包含在 Magisk 模块中(需要 root 访问权限),该脚本检测哪个应用程序位于前台,如果它与列表中的“不需要的”应用程序之一匹配,则会在系统范围内禁用振动。否则,振动将重新启用。
#!/system/bin/sh
# Magisk service script
MODDIR=${0%/*}
# Function to disable vibration
disable_vibration() {
stop vendor.vibrator-1-0
}
# Function to re-enable vibration
enable_vibration() {
start vendor.vibrator-1-0
}
vibration_disabled=0
# Function to load app list from config.txt
load_app_list() {
APP_LIST=$(cat "$MODDIR/config.txt" | grep -v '^#' | grep -v '^$') # Exclude comments and empty lines
}
# Monitoring loop
while true; do
# Reload the app list in case it's modified
load_app_list
# Get the current foreground app
foreground_app=$(dumpsys activity activities | grep mResumedActivity | awk '{print $4}' | cut -d '/' -f 1)
# Check if the foreground app matches any app in the list
match_found=0
for app in $APP_LIST; do
if [ "$foreground_app" == "$app" ]; then
match_found=1
break
fi
done
# Toggle vibration based on app state
if [ "$match_found" -eq 1 ]; then
if [ "$vibration_disabled" -eq 0 ]; then
disable_vibration
vibration_disabled=1
fi
else
if [ "$vibration_disabled" -eq 1 ]; then
enable_vibration
vibration_disabled=0
fi
fi
# Sleep for 5 seconds before checking again
sleep 5
done
该模块位于 https://github.com/johnvigl/disable_vibration
如果您只需要在系统范围内禁用振动,则包含以下内容的脚本
#!/system/bin/sh
stop vendor.vibrator-1-0
应该够了。
必须手动将其放入 .sh 可执行文件中
/data/adb/service.d/
重启后就会开始。