• 刚上班,没有业务开发,对 App 的 Api 由 26 升级到了 27, 结果在 Android 8.0 的设备上会出现 crash 。

  • Log 如下:

    1. java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation
  • 经过搜索发现该问题是在 App 适配了 Api 27 ,然后运行设备是 26 的时候出现的。

  • 查看源码(Api 27的源码),总共有两个地方会抛出来这个异常:

    1. Activity 的 onCreate 方法:
    1. protected void onCreate(@Nullable Bundle savedInstanceState) {
    2. if (DEBUG_LIFECYCLE) Slog.v(TAG, "onCreate " + this + ": " + savedInstanceState);
    3. if (getApplicationInfo().targetSdkVersion >= O_MR1 && mActivityInfo.isFixedOrientation()) {
    4. final TypedArray ta = obtainStyledAttributes(com.android.internal.R.styleable.Window);
    5. final boolean isTranslucentOrFloating = ActivityInfo.isTranslucentOrFloating(ta);
    6. ta.recycle();
    7. if (isTranslucentOrFloating) {
    8. throw new IllegalStateException(
    9. "Only fullscreen opaque activities can request orientation");
    10. }
    11. }
    12. ......
    13. }
    1. ActivityRecord 的 setRequestedOrientation 方法:
    1. void setRequestedOrientation(int requestedOrientation) {
    2. if (ActivityInfo.isFixedOrientation(requestedOrientation) && !fullscreen
    3. && appInfo.targetSdkVersion >= O_MR1) {
    4. throw new IllegalStateException("Only fullscreen activities can request orientation");
    5. }
    6. ......
    7. }
  • 解决办法:

    1. 在 BaseActivity 中的 onCreate 方法进行处理
    1. @Override
    2. protected void onCreate(Bundle savedInstanceState) {
    3. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && UiUtils.isTranslucentOrFloating(this)) {
    4. UiUtils.fixOrientation(this);
    5. KLog.debug("api 26 全屏横竖屏切换 crash");
    6. }
    7. super.onCreate(savedInstanceState);
    8. ......
    9. }
    1. 在 BaseActivity 的 setRequestedOrientation 方法中进行处理
    1. @Override
    2. public void setRequestedOrientation(int requestedOrientation) {
    3. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && UiUtils.isTranslucentOrFloating(this)) {
    4. KLog.debug("api 26 全屏横竖屏切换 crash");
    5. return;
    6. }
    7. super.setRequestedOrientation(requestedOrientation);
    8. }
  • UiUtils 工具类:

    1. /**
    2. * 针对 Android 27 的情况进行处理
    3. * 横竖屏设置了方向会崩溃的问题
    4. *
    5. * @return
    6. */
    7. public static boolean isTranslucentOrFloating(Activity activity) {
    8. boolean isTranslucentOrFloating = false;
    9. try {
    10. int[] styleableRes = (int[]) Class.forName("com.android.internal.R$styleable").getField("Window").get(null);
    11. TypedArray ta = activity.obtainStyledAttributes(styleableRes);
    12. Method m = ActivityInfo.class.getMethod("isTranslucentOrFloating", TypedArray.class);
    13. m.setAccessible(true);
    14. isTranslucentOrFloating = (boolean)m.invoke(null, ta);
    15. m.setAccessible(false);
    16. } catch (Exception e) {
    17. e.printStackTrace();
    18. }
    19. return isTranslucentOrFloating;
    20. }
    21. /**
    22. * 修复横竖屏 crash 的问题
    23. * @return
    24. */
    25. public static boolean fixOrientation(Activity activity){
    26. try {
    27. Field field = Activity.class.getDeclaredField("mActivityInfo");
    28. field.setAccessible(true);
    29. ActivityInfo o = (ActivityInfo)field.get(activity);
    30. o.screenOrientation = -1;
    31. field.setAccessible(false);
    32. return true;
    33. } catch (Exception e) {
    34. e.printStackTrace();
    35. }
    36. return false;
    37. }
  • 参考:

https://blog.csdn.net/starry_eve/article/details/82777160

https://zhuanlan.zhihu.com/p/32190223

Android Api 27 在 Android 8.0 上出现 Only fullscreen opaque activities can request orientation 的解决情况的更多相关文章

  1. Android 如何在Eclipse中查看Android API源码 及 support包源码

    当我们阅读android API开发文档时候,上面的每个类,以及类的各个方法都是已经写好的方法和控件,可是我们只是在搬来使用,不知道它的原理,它是如何被实现的.android系统是开源的,所以谷歌官方 ...

  2. 【转】Android 如何在Eclipse中查看Android API源码 及 support包源码

    原文网址:http://blog.csdn.net/vipzjyno1/article/details/22954775 当我们阅读android API开发文档时候,上面的每个类,以及类的各个方法都 ...

  3. Android API level 与version对应关系

    https://www.cnblogs.com/jinglecode/p/7753107.html Platform Version API Level VERSION_CODE 中文名称 Andro ...

  4. Android SDK Manager 无法下载Android8.1.0(API 27) SDK Platform

    在Android SDK Manager 中安装Android 8.1.0 SDK Platform时报错导致无法安装. 错误信息:Downloading SDK Platform Android 8 ...

  5. 【译】如何在 Android 5.0 上获取 SD卡 的读写权限

    因为最近项目需要,涉及到 SD卡 的读写操作,然而申请 <!-- 读写权限 --> <uses-permission android:name="android.permi ...

  6. Android低功耗蓝牙(蓝牙4.0)——BLE开发(上)

    段时间,公司项目用到了手机APP和蓝牙设备的通讯开发,这里也正好对低功耗蓝牙(蓝牙4.0及以后标准)的开发,做一个总结. 蓝牙技术联盟在2010年6月30号公布了蓝牙4.0标准,4.0标准在蓝牙3.0 ...

  7. Android获取设备隐私 忽略6.0权限管理

    1.前言 (1).由于MIUI等部分国产定制系统也有权限管理,没有相关api,故无法判断用户是否允许获取联系人等隐私.在Android 6.0之后,新增权限管理可以通过官方api判断用户的运行状态: ...

  8. Arcgis Android API开发之离线地图

    最近一直在倒腾Arcgis Android API等相关的东西,想把自己的做的图放到地图上去,也就是离线地图,穷人一般是没有钱的,一个月好几十的流量是开不起的,所以就左捉摸,右思考,看着API里面有离 ...

  9. Android数据存储之Android 6.0运行时权限下文件存储的思考

    前言: 在我们做App开发的过程中基本上都会用到文件存储,所以文件存储对于我们来说是相当熟悉了,不过自从Android 6.0发布之后,基于运行时权限机制访问外置sdcard是需要动态申请权限,所以以 ...

随机推荐

  1. 003.Heartbeat MySQL双主复制

    一 基础环境 节点 系统版本 MySQL版本 业务IP 心跳IP Master01 CentOS 7.5 MySQL 5.6 192.168.88.100 192.168.77.100 Master0 ...

  2. 记录初学者学习Hive时踩过的坑

    1. 缺少MySQL驱动包 1.1 问题描述 Caused by: org.datanucleus.store.rdbms.connectionpool.DatastoreDriverNotFound ...

  3. photoshop实现倾斜图片的修正

    第一天学习Photoshop,了解到了Photoshop对图片的处理,下面是实现一个倾斜图片修正的两种方法: 举例图片: 第一种方法:1.利用吸管中的标尺工具量倾斜度数: 2.利用旋转图像,旋转对应的 ...

  4. linux6.8安装docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何 ...

  5. ppt标签打开文件 word标签打开文件 窗口打开文件 粘贴默认方式

    ppt标签打开文件 word标签打开文件 word窗口打开文件 ppt粘贴默认方式 word粘贴默认方式 ppt粘贴默认方式 只保留文本 == 通过 视图 切换窗口. == 层叠  样式 如下. == ...

  6. LOJ.6235.区间素数个数(Min_25筛)

    题目链接 \(Description\) 给定\(n\),求\(1\sim n\)中的素数个数. \(2\leq n\leq10^{11}\). \(Solution\) Min_25筛.只需要求出\ ...

  7. Java并发编程(一)-- 多线程的基本概念

    多线程发展进程 在过去单CPU时代,单任务在一个时间点只能执行单一程序:发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程--虽然并不是真正意义上的“同一时间点”,而是多个任务或进程共享一个 ...

  8. 考前停课集训 Day6 垒

    Day 6 今天在家里的 家里蹲 其实是day7的时候想到要写day6了 草率补充一下 NOIP考前棕名退不掉咯 你觉得我还会打洛谷的题目吗? 依然退步 没用心 T1 分火腿 数论题 我感觉挺难的 T ...

  9. java输出格式-----System.out.printf()

    package com.lzc.test; public class Main { public static void main(String[] args) { // 定义一些变量,用来格式化输出 ...

  10. nested exception is java.lang.ClassNotFoundException

    当出现nested exception is java.lang.ClassNotFoundException这个异常的时候,首先排查类是否存在.如果存在,是maven项目的话,clean.insta ...