记一次使用投屏软件scrcpy导致Android设备横竖屏切换的问题

问题还原

某天,测试同事突然报所有应用都变成竖屏了,实际上系统默认就是横屏显示的,某些应用强制显示横屏的应用,也被显示成了竖屏。

问题分析

如何通过adb命令切换横竖屏

很明显,是系统的某个属性的变化导致了应用被显示竖屏,网上搜索发现adb命令可切换横竖屏:

arduino 复制代码
adb shell settings put system screen_orientation 1 // 横屏
adb shell settings put system screen_orientation 0 // 竖屏

执行命令可发现执行之后表现与问题一致:横屏变成了竖屏显示。

执行adb 命令之后日志中的差异点

对比日志可以看出执行命令前后,android.content.res.Configuration中的android.app.WindowConfigurationmRotation有区别,横屏时为ROTATION_0,竖屏为ROTATION_90,在出现问题中的日志中搜索,可以发现的确出现了变化:

结合重启之后仍旧为竖屏,可以猜想是执行了类似上述设置属性的命令。

研究Scrcpy源码

与测试同事沟通了解到,其使用了投屏软件Scrcpy,那么会不会是投屏软件执行了横竖屏切换的逻辑呢? 下载Scrcpy的源码(github.com/Genymobile/...%25EF%25BC%258C "https://github.com/Genymobile/scrcpy)%EF%BC%8C") 源码里尝试搜索landscape:

逐一排查,在server\src\main\java\com\genymobile\scrcpy\device\Device.java目录下发现旋转设备相关的实现:

再搜索"rotateDevice":

从类名及实现可以断定:scrcpy是支持旋转Android设备的 ,但是搜索TYPE_ROTATE_DEVICE,看起来找不到真正的调用地方(由于对代码不熟,故并未深入了解),此时已经感觉无从下手了。

scrcpy --help

从代码角度可以确定,scrcpy是支持旋转Android设备的 , 联想到Linux不少命令都可以通过 --help查看其用法,故尝试执行scrcpy.exe --help,在结果中尝试查找"Rotate":

注意到Rotate device screen对应了快捷键ALT + R(windows):

尝试在scrcpy页面执行快捷键ALT + R,果然,执行完之后就变成竖屏了!!!

结论

测试同事在scrcpy页面不小心 按了捷键ALT + R ,导致执行了scrcpy旋转屏幕的操作,非问题~

相关推荐
hunterandroid11 小时前
[Android 从零到一] ViewPager2 与 Fragment 生命周期协同:从预加载到状态一致性
android·前端
mmsx11 小时前
一个黑边 Bug 修了两版:自己算矩阵直接黑屏,借库重建只用了一行 setZoom
android·前端
枢影Kernel11 小时前
Android CLI 与 Android Skills 最佳实践:把 AI Agent 接入可验证的 Android 开发流程
android
Kapaseker12 小时前
没想到吧!Skill 也可以测试 — 小白都看得懂的 Skill 教程
android·人工智能·kotlin
我命由我1234512 小时前
Android 开发问题:使用 AndroidTreeView 时,自定义视图无法撑满父容器
android·java·java-ee·kotlin·android studio·android-studio·android runtime
没文化的阿浩12 小时前
【MySQL】数据类型
android·mysql·adb
恋猫de小郭13 小时前
社区版 Dart macros?一个可以解决 JSON 序列化的Fluter “宏编程”第三方包
android·前端·flutter
mmsx13 小时前
Android Design 项目集合
android
启雀AI1 天前
培训平台移动端离线学习方案设计与实现:视频缓存、断点续传与进度同步的工程实践
android·学习·缓存·音视频·企业lms
我命由我123451 天前
RxJava - 冷数据流与热数据流
android·java·java-ee·android studio·rxjava·android-studio·android runtime