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

  • Log 如下:

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

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

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

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

        /**
    * 针对 Android 27 的情况进行处理
    * 横竖屏设置了方向会崩溃的问题
    *
    * @return
    */
    public static boolean isTranslucentOrFloating(Activity activity) {
    boolean isTranslucentOrFloating = false;
    try {
    int[] styleableRes = (int[]) Class.forName("com.android.internal.R$styleable").getField("Window").get(null);
    TypedArray ta = activity.obtainStyledAttributes(styleableRes);
    Method m = ActivityInfo.class.getMethod("isTranslucentOrFloating", TypedArray.class);
    m.setAccessible(true);
    isTranslucentOrFloating = (boolean)m.invoke(null, ta);
    m.setAccessible(false);
    } catch (Exception e) {
    e.printStackTrace();
    }
    return isTranslucentOrFloating;
    } /**
    * 修复横竖屏 crash 的问题
    * @return
    */
    public static boolean fixOrientation(Activity activity){
    try {
    Field field = Activity.class.getDeclaredField("mActivityInfo");
    field.setAccessible(true);
    ActivityInfo o = (ActivityInfo)field.get(activity);
    o.screenOrientation = -1;
    field.setAccessible(false);
    return true;
    } catch (Exception e) {
    e.printStackTrace();
    }
    return false;
    }
  • 参考:

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. 从小白到区块链工程师:第一阶段:Go语言的HelloWorld初始(2)

    四.写下第一段Go语言代码“Hello World” 小建议:就是文件夹路径或者文件名称不要出现中文,可能会导致一些不必要的麻烦(编译失败) 在sublime中,我们在src文件夹上面,单击右键“Ne ...

  2. .NET SQL优化

    1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 5.网络速度慢 6.查询出的数据量过大 ...

  3. angular笔记_7

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  4. 网络篇:linux下select、poll、epoll之间的区别总结

    select.poll.epoll之间的区别总结 select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪 ...

  5. 实现左边div固定宽度,右边div自适应撑满剩下的宽度的布局方式:

    html: <div class="container"> <div class="left"> left固定宽度200px </ ...

  6. 2009 ACM 水题

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=2009 思路:寻找平方根的函数,c++里面有sqrt,一定要注意 1 添加头文件#include <i ...

  7. 潭州课堂25班:Ph201805201 django 项目 第十课 自定义错误码,完成图片验证码,用户是否被注册功能 (课堂笔记)

    把 视图传到前台的  JsonResponse(data=data) 先进行处理,之后再传到前台, 处理:引用自定义错误代码,把错误代码返回给前台,前台根据错误代码中文提示 class Code: O ...

  8. 解决 插件LArea 在IOS上浮出软键盘问题

    移动端使用 省市县城市选择三级联动的时候, 插件LArea 会有一个问题 ios浏览器和ie9已下(包括ie9)浏览器都有input设置readonly之后input还有聚焦的问题. ios inpu ...

  9. LINUX文件内容处理及文本编辑器vim

    Linux基本操作命令 echo命令 echo命令: 把echo后面的内容显示到屏幕. -n 显示内容的时候不显示每行结尾的回车 echo 内容 >> 文件名 表示把内容加到一个文件的末尾 ...

  10. Tyrion 中文文档(含示例源码)

    原文出处: Mr.Seven   Tyrion是一个基于Python实现的支持多个WEB框架的Form表单验证组件,其完美的支持Tornado.Django.Flask.Bottle Web框架.Ty ...