android8.0 应用崩溃 java.lang.IllegalStateException: Only fullscreen opaque activities can reque

这个问题在我targetSdkVersion=26时并未出现,当我把targetSdkVersion=28时才出现,但是它是出现在android8.0系统,也就是说android8.0>26时这个问题出现在8.0系统。

出现条件:

  • 如果一个 targetSdkVersion>26的Android App
  • 运行在Android 8.0(含) 以上的设备上时
  • 如果启动的Activity为透明Activity
     

问题就是在8.0系统android:screenOrientation="portrait"(或setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);) 与android:windowIsTranslucent=“true” 不能同时使用,原因自己去了解吧!就是8.0不能,8.1已修复。

然后网上说删除android:screenOrientation="portrait"或者去掉android:windowIsTranslucent=“true”就可以了,舍其一就没问题,但是我应用好像两个都需要,应用需要竖屏,使用侧滑返回需要activity透明,并且样式用得比较杂乱,所以想了比较简单的方式解决,如下:

在BaseActivity中加入:

if (Build.VERSION.SDK_INT == Build.VERSION_CODES.O && isTranslucentOrFloating()) {
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}else{
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

就是判断是8.0系统并且是透明就不设置屏幕方向,否则设置。

判断透明方法:

private boolean isTranslucentOrFloating() {
    boolean isTranslucentOrFloating = false;
    try {
        int[] styleableRes = (int[]) Class.forName("com.android.internal.R$styleable").getField("Window").get(null);
        final TypedArray ta = 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;
}

这样就可以解决问题了

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值