Android踩坑记录,安卓8.0闪退问题解决

作者: 龙哥 分类: 技术 发布时间: 2022-01-13 22:19 ė3,366 次浏览

机领的APP写了好久了,一直没有接到报错反馈,自己测试也都正常,今天一个网友反馈闪退,机型华为荣耀V8,安卓8.0

好吧,自己测试模拟器是安卓7.1的,手机是鸿蒙系统和安卓8.1,万万没想到在8.0尽然有个坑等着

万能的百度搜索了下,发现8.0的问题还不是一点点的多,到8.1基本都修复了,所以一直也没发现。

看到网上大多数闪退奔溃原因是:

java.lang.IllegalStateException :Only fullscreen opaque activities can request orientation

这里也记录下,虽然我自己不是这个问题…

这个错误,字面意思是说 只有不透明的全屏 Activity 才可以设置横竖屏,半透明/对话框等不可设置横竖屏。

1、设置了方向(横竖屏,代码中写了setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
或者清单文件中加了 android:screenOrientation=“portrait”)
2、设置了透明主题样式(<item name=“android:windowIsTranslucent”>true</item>)
3、targetSdkVersion >= O (表示编译版本号大于等于26,最重要的还是=26)

解决:
知道问题出在哪了,就好解决了,不过还是要进行适配,毕竟这个bug只出现在8.0上,8.1后已经不会了。
首先既然升级了说明targetSdkVersion >= O就肯定的了,没法改了,只能从方向跟透明样式两方面修改,去其一,要么不要设置方向,删除AndroidManifest中相应Activity的 android:screenOrientation=””属性;
要么不设置透明主题样式,删除相应Activity的theme中<item name=“android:windowIsTranslucent”>true</item>属性。像那种Dialog风格的透明样式的Activity还是使用Dialog实现.
这个就要看自己的代码跟业务需求了,我的话设置透明主题主要是用于侧滑关闭使用,而且只能竖屏显示,没的挑,只能去掉透明样式,然后不使用侧滑关闭了。
这个时候我就想了,我只想要改8.0就好了,8.1后还是想保留原来的功能怎么办?这个时候就需要适配了:在res目录下,新建values-v26文件夹,新建styles.xml,在里面加入如下代码(举例,根据实际编写):

     <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimaryDark">@color/theme_color</item>
        <item name="android:windowIsTranslucent">false</item>
    </style>
    
    <!-- Activity -->
    <style name="AppTheme.SwipeBack" parent="AppTheme">
        <item name="android:windowIsTranslucent">false</item>
        <item name="android:windowTranslucentNavigation">true</item>
        <item name="android:screenOrientation">portrait</item>

    </style>

具体的主题样式还是要看大家自己的需求,需要加什么自己加就好了,但是android:windowIsTranslucent值一定是false,
文件夹values-v26后面的26表示会对targetSdkVersion>=26的版本生效,也就是说会对26及26以后的版本生效,这时候我又想27以后的版本的主题样式还是跟以前一样是透明的怎么办?简单:在res目录下,新建values-v27文件夹,新建styles.xml,在里面加入如下代码:

     <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimaryDark">@color/theme_color</item>
        <item name="android:windowIsTranslucent">true</item>
    </style>
    
    <!-- Activity -->
    <style name="AppTheme.SwipeBack" parent="AppTheme">
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowTranslucentNavigation">true</item>
        <item name="android:screenOrientation">portrait</item>

    </style>

文件夹values-v27表示会对>=27的版本生效,这个时候文件夹values-v26就只会对targetSdkVersion==26的版本生效,这正式我们想要的,这样就做好适配了
看上面代码,也就android:windowIsTranslucent的值不一样,8.0上false不透明,8.1后为true透明。
改了透明样式,相应的代码也要区别对待:
在父类BaseActivity的onCreate()中添加如下代码,加个判断:

  if (android.os.Build.VERSION.SDK_INT == Build.VERSION_CODES.O) {
       //Android8.0 你自己的逻辑代码,样式不透明
       
  } else {
      //其他版本的代码      
      
  }

==========================================

这是网上找到的解决方案,我自己的还不仅仅是这个问题

通过不断调试排查,发现导致闪退的问题是:

<item name="android:windowBackground">@drawable/picbg</item>

@drawable/picbg,因为我这个图片用的格式是.9.png,特讷讷的,安卓8.0不支持吗,好吧,根据上面的问题,把values-v26里面的改成png,values-v27继续使用.9.png

好了,一切正常,解决了Android 8.0打开软件闪退的问题。

本文出自 俞凌龙博客,转载时请注明出处及相应链接。

本文永久链接: https://blog.jlwz.cn/268

Ɣ回顶部