• 刚上班,没有业务开发,对 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. 重温分布式系统的CAP理论

    1. CAP理论的历史 2000年7月,Eric Brewer教授提出CAP猜想:2年后,Seth Gilbert和Nancy Lynch从理论上证明了CAP:之后,CAP理论正式成为分布式计算领域的 ...

  2. am335x uboot2016.05 (MLO u-boot.img)执行流程(转)

    am335x的cpu上电后,执行流程:ROM->MLO(SPL)->u-boot.img 第一级bootloader:引导加载程序,板子上电后会自动执行这些代码,如启动方式(SDcard. ...

  3. ASP.NET Core的Data Protect(数据保护)的学习和应用

    转载请注入出处: https://home.cnblogs.com/u/zhiyong-ITNote/ dotnet core中提供了一个新的身份验证框架Identity,它不同于dot net下的身 ...

  4. golang单例模式

    1.定义:单例对象的类必须保证只有一个实例存在,全局有唯一接口访问. 2.分类: 懒汉方式:指全局的单例实例在第一次被使用时构建. 饿汉方式:指全局的单例实例在类装载时构建. 3.实现: (1)懒汉方 ...

  5. React Native升级目标SDK

    React Native升级目标SDK 打开在 android/app/的build.gradle 找到 android { } 区块 改变以下属性 compileSdkVersion 26 buil ...

  6. 通过pip安装python web

    提示 No module named 'utils' 我就pip install utils 提示 No module named 'db' 然后我就 pip install db 报错 No mod ...

  7. jquery 上下滚动显示隐藏

      function scroll(fn) { var beforeScrollTop = document.body.scrollTop, fn = fn || function() {}; win ...

  8. Sargable 与 谓语下推 (predicate pushdown) 简介

    关键词:SQL优化 , sargable , pushdown filter , predicate pushdown Sargable Sargable = Search ARGument ABLE ...

  9. CSS单位和颜色表

  10. pygame 笔记-10 摩擦力与屏幕环绕

    多年前写过一篇 Flash/Flex学习笔记(25):摩擦力与屏幕环绕,可惜的当时上传的flash,服务器后来无人维护,现在flash链接都失效了.本篇用pygame重新实现了一个: 原理是类似,但要 ...