一文分析 Only fullscreen opaque activities can request orientation 报错原因及解决方案
今天在三星S8上遇见一个奇葩问题Only fullscreen opaque activities can request orientation
一、出现场景
- 三星手机S8 android 8.0
- targetSdkVersion 27
- 透明Activity
二、解决方案
manifest中移除android:screenOrientation="portrait"
三、原因(源码中寻找)
查看Android 8.0源码
3.1、ActivityRecord#setRequestedOrientation
有几个条件:
- 非全屏
!fullscreen
- targetSdkVersion的设置为大于26
appInfo.targetSdkVersion > O
- ActivityInfo.isFixedOrientation(requestedOrientation)
所以下边来跟踪一下ActivityInfo.isFixedOrientation(requestedOrientation)
3.2、跟踪ActivityInfo.isFixedOrientation(requestedOrientation)
继续跟踪isFixedOrientationPortrait(int orientation)
最后的原因找到了,就是因为orientation == SCREEN_ORIENTATION_PORTRAIT
3.3、总结一下
- 如果一个
targetSdkVersion>26
的Android App - 运行在
Android 8.0(含) 以上
的设备上时 - 如果启动的Activity为
透明Activity
时
screenOrientation 需为默认状态
四、Google为什么这么做?
在 stackoverflow 中看到一句话。
这句话,我在google官方文档上并没有找到依据,但经过我的验证是正确的
If you use a fullscreen transparent activity, there is no need to specify the orientation lock on the activity. It will take the configuration settings of the parent activity. So if the parent activity has in the manifest:
这种情况下,透明Activity使用的是栈中,上一层可见Activity的orientation设定
。仔细想一想是合理的,因此这并不是一个bug。
五、最后重申一遍解决方案
综上所述,移除android:screenOrientation="portrait"
的解决方案,完全符合Google的设计本意,并非Bug
========== THE END ==========

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!