• 刚上班,没有业务开发,对 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. Java设计模式从精通到入门五 抽象工厂方法模式

    定义 抽象工厂类为创建一组相关和相互依赖的对象提供一组接口,而无需指定一个具体的类. ​ 这里我得把工厂方法模式得定义拿出来做一下比较:定义一个创建对象的接口,由子类决定实例化哪一个类.工厂方法是一个 ...

  2. ReentrantLock和condition源码浅析(二)

    转载请注明出处... 接着上一篇的ReentrantLock和condition源码浅析(一),这篇围绕着condition 一.condition的介绍 在这里为了作对比,引入Object类的两个方 ...

  3. PHP SOAP

    <?php $classmap = array(); //注意和实例一的不同 $soap = new SoapServer(null, array('uri' => "http: ...

  4. vue实例属性之methods和computed

    我们可以把同一函数放在methods或者computed中,区别在于computed有缓存,计算属性只有在它的相关依赖发生改变时才会重新求值,即数据改变才会执行函数.而methods每当触发重新渲染时 ...

  5. [BZOJ4259]残缺的字符串

    Description: 给定两个带通配符的串,求可能出现几次匹配,以及这些匹配位置 Hint: \(n \le 3*10^5\) Solution: 定义匹配函数 \(P(x)=\sum_{i=x} ...

  6. Ubuntu下无法输入中文问题解决

    首先是要安装了中文输入法,下面以搜狗为例. 从system settings 进入language support ,在keyboard input method system 中是看不到自己安装的搜 ...

  7. [Vijos1763]Wormhole (贪心/模拟?)

    已经是NOIP考前的最后一天了 现在在杭州的宾馆里 因为自己没带电脑 因此用ADMAN的电脑 题目描述 一维的世界就是一个数轴.这个世界的狭小我们几乎无法想象. 在这个数轴上,有N个点.从左到右依次标 ...

  8. 种花 [JZOJ4726] [可撤销贪心]

    Description 经过三十多个小时的长途跋涉,小Z和小D终于到了NOI现场——南山南中学.一进校园,小D就被花所吸引了(不要问我为什么),遍和一旁的种花园丁交(J)流(L)了起来. 他发现花的摆 ...

  9. numpy中的广播机制

    广播的引出 numpy两个数组的相加.相减以及相乘都是对应元素之间的操作. import numpy as np x = np.array([[2,2,3],[1,2,3]]) y = np.arra ...

  10. Django REST framework API开发

    RESTful设计方法 1. 域名 应该尽量将API部署在专用域名之下. https://api.example.com 如果确定API很简单,不会有进一步扩展,可以考虑放在主域名下. https:/ ...