Android 13 在录屏时 adb shell input的表现为何不同

在未录屏的情况下,假设我手指已经放在屏幕上了,那么使用adb shell input x y之后,手指那个触点便会直接断触。
奇怪的是,如果在录屏的情况下,使用adb shell input
那么手指那个触点会莫名其妙的往左下角移动,再断触,到底是什么原因造成的呢。
同时我的应用程序需要未录屏情况下那种现象,该如何使录屏时候也能和未录屏时一样呢?

以下答案引用自GPT-3大模型,请合理使用:

1.Android 13中使用adb shell input时,未录屏和录屏的表现不同,是因为录屏会有一些操作限制,比如说mpv的录屏可能就有这样的限制,影响输入的操作。

2.解决这个问题的一种方式是使用 adb shell monkey 命令来模拟输入。monkey命令可以通过模拟用户输入来模拟手势操作,比如滑动,点击等,而不会受到录屏的限制,如下所示:

adb shell monkey -p yourApplicationPackageName --ignore-crashes --ignore-timeouts --monitor-native-crashes --pct-touch 80 -v 500

第一个参数是应用的包名,用来指定要测试的应用,此外还可以为应用添加一些可选参数,比如 --ignore-crashes 和 --ignore-timeouts 用来忽略应用崩溃和超时异常,--monitor-native-crashes为了监控应用的原生崩溃,--pct-touch 80为应用设置80%的触控概率,最后-v 500是一个随机数,用来控制模拟测试的执行时间,如果只需要执行一次,可以将其设置为1。

3.除了monkey命令,也可以通过使用adb shell input tap x y/touchscreen swipe x y x y这些指令来模拟输入。但是这些指令必须在应用的前台运行,否则会失败。

如果我的回答解决了您的问题,请采纳我的回答

这个估计得看系统源码,我上午给你瞅瞅🤣

您好,关于您提出的在Android 13 在录屏时 adb shell input的表现不一样,在录屏的情况下,使用adb shell input触点会移动的现象。对于此问题,为您推荐以下解决方法:
1、在录屏的情况下,你使用adb shell input 时,可能你的手指存在轻微移动的现象,从导致触点发生移动
2、你在之前已经按压了屏幕,此时使用adb shell input x y 表示点击指定屏幕位置,此时产生了两个不同的位置,这两个位置有输入的先后,导致产生类似于滑动的效果。解决方法是先不要按压屏幕。
3、尝试使用adb shell input tap y或 adb shell input touchscreen tap x y 命令来实现

这种现象的发生一般是是因为录屏应用程序占用了输入设备的某些权限或者事件处理,所以这样子会导致在使用adb shell input命令时,输入事件的处理会被影响。具体原因可能与录屏应用程序的实现方式有关。

如果你想让录屏时候也能和未录屏时一样,你可以去尝试在录屏应用程序中关闭相关的权限或事件处理,或者还可以去使用不同的录屏应用程序。

也可以考虑使用其他的屏幕操作方式,比如使用UI Automator或者Appium等自动化测试框架,这些框架可以模拟屏幕操作,而不需要使用adb shell input命令

在 Android 13 中,录屏会影响输入事件的传递,可以尝试使用 adb shell sendevent 命令模拟触摸事件,而不是使用 adb shell input 命令,因为 adb shell input 命令可能会被录屏应用截获。

另外,可以使用 Android 中的 Instrumentation 框架,通过 Instrumentation 实例的 sendPointerSync 方法来发送触摸事件,这种方式不会受到录屏应用的干扰。

如果希望录屏时也能保持与未录屏时相同的行为,需要在录屏应用中关闭所有的触摸事件截获和处理功能,以允许 adb shell input 命令正常工作。如果无法更改录屏应用的行为,需要使用其他方法来模拟触摸事件,如上述提到的 sendevent 命令或 Instrumentation 框架。

通常情况下,Android 13 在录屏时执行 adb shell input 命令与以前的 Android 版本没有太大的不同。该命令可用于向 Android 设备发送输入事件,例如触摸、按键和手势等。在录屏期间,使用该命令可以模拟用户的输入事件,以便在录制的视频中捕获这些事件。

可能的原因之一是,Android 13 可能会在某些情况下对 adb shell input 命令的行为进行修改。例如,如果 Android 13 中的某个新功能或安全策略与 adb shell input 命令冲突,可能会导致该命令的行为发生变化。

另外一个可能的原因是,您使用的录屏应用程序可能与 Android 13 不兼容,从而导致 adb shell input 命令无法按预期执行。在这种情况下,您可以尝试升级您的录屏应用程序或使用另一个兼容的应用程序。

Android 13 增加了一项名为 Privacy Shade(隐私遮罩)的功能,可以用于在录屏时保护用户隐私。这个功能在录屏时会对输入的敏感信息(例如密码)进行屏蔽,以保护用户隐私。

因此,当你在 Android 13 上使用 adb shell input 命令进行模拟输入时,可能会受到这个功能的影响,导致输入的内容不会显示在屏幕上。如果你需要模拟输入,可以尝试在录屏前关闭 Privacy Shade 功能,或者使用其他的输入模拟方式。

这个问题可能是由于录屏软件在录制屏幕时截获了adb shell input命令导致的。为了模拟未录屏情况下的手指触摸行为,您可以尝试使用模拟器或真实设备,并在不使用录屏软件的情况下进行测试。如果您确实需要录屏,请尝试使用其他录屏软件或调整录屏软件的设置,以确保不会干扰adb shell input命令的执行。如果问题仍然存在,您可以尝试调整ADB命令的参数,例如使用“adb shell input tap”命令代替“adb shell input x y”,或者增加“--synchronous”参数,以便更准确地模拟触摸事件。

题主,这个问题我来替你解决,若有帮助,还望采纳,点击回答右侧采纳即可。

shell控制端下使用input可以实现模拟触屏、虚拟按键及其他触摸操作,如果在dos端需要在每个命令前加adb -s ip shell ,具体选项如下
一、 text (Default: touchscreen)
向当前输入框中键入字符串,如input text "cs input text"

二、keyevent [–longpress] … (Default: keyboard)
发送事件,测试发现,该动作无法实现长按动作,即使使用–longpress也不可以,如果需要长按操作需要用swipe实现,关于key code number与name的对应关系及翻译见文章末尾,input keyevent number与input keyevent name一样,模拟按home键:input keyevent KEYCODE_HOME或input keyevent 3

三、tap (Default: touchscreen):触摸某个点,点触屏幕的某个点
关于坐标值获取:可以通过获取事件的方式获得,如接了触摸屏,把/dev/input下面的event与设备对应,即找到触摸屏对应的event,通过cat /proc/bus/input/devices可以看到设备与与event的对应关系,如下:
————————————————

master:/ # cat /proc/bus/input/devices

I: Bus=0000 Vendor=0000 Product=0000 Version=0000
N: Name="rk8xx_pwrkey"
P: Phys=rk8xx_pwrkey/input0
S: Sysfs=/devices/platform/ff3c0000.i2c/i2c-0/0-0020/input/input0
U: Uniq=
H: Handlers=event0 cpufreq keychord
B: PROP=0
B: EV=3
B: KEY=10000000000000 0
 
I: Bus=0000 Vendor=0000 Product=0000 Version=0000
N: Name="gsensor"
P: Phys=
S: Sysfs=/devices/platform/ff150000.i2c/i2c-6/6-0069/input/input1
U: Uniq=
H: Handlers=event1
B: PROP=0
B: EV=9
B: ABS=7
 
I: Bus=0000 Vendor=0000 Product=0000 Version=0000
N: Name="gyro"
P: Phys=
S: Sysfs=/devices/platform/ff150000.i2c/i2c-6/6-0069-1/input/input2
U: Uniq=
H: Handlers=event2
B: PROP=0
B: EV=d
B: REL=38
B: ABS=38
 
I: Bus=0000 Vendor=0001 Product=0001 Version=0100
N: Name="rk_headset"
P: Phys=
S: Sysfs=/devices/platform/rk_headset/input/input3
U: Uniq=
H: Handlers=event3
B: PROP=0
B: EV=3
B: KEY=400000000 0 0 0
 
I: Bus=0003 Vendor=26ae Product=8506 Version=0100
N: Name="wch.cn USB2IIC_CTP_CONTROL"
P: Phys=usb-fe3e0000.usb-1/input0
S: Sysfs=/devices/platform/fe3e0000.usb/usb6/6-1/6-1:1.0/0003:26AE:8506.0001/input/input4
U: Uniq=
H: Handlers=event4 cpufreq
B: PROP=2
B: EV=b
B: KEY=400 0 0 0 0 0
B: ABS=261800000000003

可以看到触摸屏对应的event为input/input4,通过getevent去获取屏幕输入事件,getevent /dev/input/input4,点击屏幕可以看到shell端会输出一些内容,其中就有坐标值:

0003 0039 00000054                //1
0003 0035 000002fc                //2
0003 0036 000003cc                //3
0001 014a 00000001                //4
0003 0000 000002fc                //5
0003 0001 000003cc                //6
0000 0000 00000000                //7
0003 0039 ffffffff                //8
0001 014a 00000000                //9
0000 0000 00000000                //10

第2、3行或第5、6行即为x、y坐标值,使用坐标值时需要从16进制转换成十进制,可以通过此方法捕捉对应按键的坐标值,实现虚拟按键操作

四、swipe [duration(ms)] (Default: touchscreen):从屏幕某个点划到某个点,可以带事件,两个点只要位置不超过按键或者图标位置即可实现长按也可实现短触
与tap类似,不过swipe是划,从某个点到某个点,因此需要两个坐标值,其后可以跟时间,由此可以实现长按操作。如在空白界面输入input swipe 100 200 100 200 10000即可进入桌面设置,此方法可以实现对一个图标的长按操作。
五、 draganddrop [duration(ms)] (Default: touchscreen):实现拖拽动作
此选项就是实现拖拽的动作,将一个东西从某个坐标拖到某个坐标,坐标获取方式如tap一样。
draganddrop和swipe都有一个时间选项,此选项表示的是过程时间,不是在某个点的停留时间,如果想实现在某个点停留只需要把两个坐标设置成同一个位置即可。

该回答引用chatGPT
这可能是由于录屏软件对触摸事件的拦截造成的,录屏软件会拦截触摸事件,并将其转换为自己的触摸事件,从而导致触点移动到左下角。你可以尝试使用其他的录屏软件,或者使用adb shell命令来模拟触摸事件,以达到你想要的效果。