首页 > 解决方案 > setRequestedOrientation 上的 IllegalStateException

问题描述

我有一个关于IllegalStateException通过电话获得的问题setRequestedOrientation

因此,为了我们在全球范围内拥有纵向方向,我按照以下方式进行操作:

registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
        @Override
        public void onActivityCreated(Activity activity, Bundle savedInstanceState) {

            // new activity created; force its orientation to portrait
            activity.setRequestedOrientation(
                    ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

            //disable automatic screen lock
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

StatusBarUtil.setColor(activity, activity.getResources().getColor(R.color.black));

错误发生在我们的假设覆盖活动上。为了让它们看起来像一个叠加层,我们为它们使用了以下主题:

<style name="Dialog" parent="Theme.AppCompat.Dialog">
        <item name="android:windowFrame">@null</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:background">@android:color/transparent</item>
        <item name="android:windowBackground">@android:color/transparent</item>
    </style>

我在 Stackoverflow 上读到,设置以下属性时可能会发生错误:

<item name="android:windowIsFloating">true</item>
<item name="android:windowIsTranslucent">true</item>

所以我删除了它们并推送了一个新的更新,但不幸的是我们仍然遇到了同样的错误。

这是游戏控制台报告的抛出错误跟踪:

Caused by: java.lang.IllegalStateException: 
  at android.os.Parcel.readException (Parcel.java:1967)
  at android.os.Parcel.readException (Parcel.java:1905)
  at android.app.IActivityManager$Stub$Proxy.setRequestedOrientation (IActivityManager.java:6186)
  at android.app.Activity.setRequestedOrientation (Activity.java:5831)

我不知道它是否重要,但基本覆盖活动本身也在onCreate函数中调用以下代码:

getWindow().requestFeature(Window.FEATURE_NO_TITLE);

有人有类似的问题或可以在这里提供帮助吗?

编辑:

似乎该错误仅发生在具有 android 版本 8 或更高版本的 android 手机上。举个例子:

标签: javaandroid

解决方案


因此,IllegalStateException使用 android 版本 8 及更高版本的手机会抛出这个问题,因为 Dialog 活动从父级继承了它们的方向,并且您无法以编程方式设置它们的方向。不幸的是,运行 android 版本 8 的模拟器没有抛出这个异常,所以我不得不在真实设备上运行它来解决这个问题。这是我对此有效的解决方案:

        try{
            // new activity created; force its orientation to portrait
            activity.setRequestedOrientation(
                    ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }
        catch(Exception ignore){

        }

推荐阅读