Android8.0 踩坑 Only fullscreen activities can request orientation 闪退问题解决

在升级Android应用至9.0时,遇到8.0系统因设置横竖屏和透明主题导致的启动闪退问题。此问题在Android 8.1及更高版本已修复。解决方案包括移除横竖屏设置或透明主题,或针对不同版本进行适配。通过创建values-v26和values-v27资源文件夹,分别设置不同版本的主题样式,确保8.0系统不使用透明主题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解决 Android8.0出现 Only fullscreen activities can request orientation 闪退问题

8月1号前Android版本targetSdkVersion至少都要升级到28,也就是9.0,不然不让更新上架,以前一直磨磨蹭蹭的不想更新,现在好了一下子从6.0升到9.0,这个累呀…经过一段时间的不懈努力,各种看官方文档,看各位大神的博客,总算是升级完毕,前些日子已经测试完成并上架更新了,现在空闲下来记录一下出现的问题来提醒自己吧。
6.0更新到9.0的话网上也很多博客,这里暂时不写了,下次再另外写一篇吧,这里主要是记录一下当时更新时比较严重的漏网之鱼吧:升级测试的时候或许公司测试机有限,还是说8.0系统很少了,6.0、7.0、8.1、9.0都测到了,唯独就是漏了8.0,偏偏问题就出现在8.0…(/哎)

更新上架第二天有客户反馈说刚刚更新的APP打不开, 启动直接闪退,华为荣耀8,系统Android8.0,第一反应是不会这么玄乎吧,我测了荣耀9都不会怎么偏偏8就会呢?(本人的手机是荣耀9),后来看了腾讯bugly,出现异常报错:java.lang.IllegalStateException :Only fullscreen opaque activities can request orientation,刚看到这个信息的时候蒙了,我去,这什么啊…后来网上搜一下才知道这个问题只出现在Android8.0系统上,8.1后已修复,这也算是8.0的bug吧。。
虽然出现了这个bug,可是为什么会出现呢?看了好多大神的博客,才知道出现这个bug是因为同时设置了透明主题跟横竖屏。

为什么会出现

字面意思是说 只有不透明的全屏 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 the
如果你的应用程序的targetSdkVersion设置为26或更高版本,你可能会遇到以下两个错误: 1. java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation 这个错误是由于在Android 8.0(API级别26)中,只有全屏不透明的活动才能请求方向更改。如果你的应用程序中的活动不是全屏和不透明的,则需要更改代码以适应这种变化。 解决方案:在AndroidManifest.xml文件中的相应活动中添加以下属性: ``` android:windowFullscreen="true" android:windowContentOverlay="@null" ``` 2. android.os.FileUriExposedException: file:///storage/emulated/0/your_app_folder/your_file exposed beyond app through ClipData.Item.getUri() 这个错误是由于在Android 7.0(API级别24)及更高版本中,应用程序不再允许在共享URI时向外公开file:// URI。相反,你应该使用FileProvider API来共享文件。 解决方案:使用FileProvider API来共享文件。你可以在你的AndroidManifest.xml文件中定义一个FileProvider,然后使用它来共享文件。以下是一个示例: 在AndroidManifest.xml文件中添加以下代码: ``` <provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:grantUriPermissions="true" android:exported="false"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider> ``` 在res/xml/文件夹中创建一个file_paths.xml文件,并添加以下代码: ``` <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="external_files" path="." /> </paths> ``` 然后,你可以使用以下代码来获取共享文件的URI: ``` File file = new File(Environment.getExternalStorageDirectory(), "your_app_folder/your_file"); Uri uri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + ".fileprovider", file); ``` 请注意,这只是解决这两个常见错误的基本解决方案。如果你仍然遇到其他问题,请查看Android文档或在Stack Overflow上寻求帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值