java.lang.IllegalStateException:仅全屏不透明活动可以请求方向


187

从Android 8.0 Oreo java.lang.IllegalStateException中的通讯录中检索联系人时,我遇到了问题:仅全屏不透明活动可以请求定向

我正在尝试从电话通讯录中获取我的活动中的联系人,它非常适合棒棒糖,棉花糖,牛轧糖等,但对于奥利奥这样的错误会给我带来这种错误,请帮助我。我的代码在这里。

演示代码:

private void loadContacts() {
            contactAsync = new ContactLoaderAsync();
            contactAsync.execute();
        }

        private class ContactLoaderAsync extends AsyncTask<Void, Void, Void> {
            private Cursor numCursor;

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                Uri numContacts = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
                String[] numProjection = new String[]{ContactsContract.CommonDataKinds.Phone.CONTACT_ID, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.TYPE};
                if (android.os.Build.VERSION.SDK_INT < 11) {
                    numCursor = InviteByContactActivity.this.managedQuery(numContacts, numProjection, null, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " COLLATE NOCASE ASC");
                } else {
                    CursorLoader cursorLoader = new CursorLoader(InviteByContactActivity.this, numContacts, numProjection, null, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " COLLATE NOCASE ASC");
                    numCursor = cursorLoader.loadInBackground();
                }

            }

            @Override
            protected Void doInBackground(Void... params) {
                if (numCursor.moveToFirst()) {
                    try {
                        final int contactIdIndex = numCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID);
                        final int displayNameIndex = numCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
                        final int numberIndex = numCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
                        final int typeIndex = numCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE);
                        String displayName, number, type;
                        do {
                            displayName = numCursor.getString(displayNameIndex);
                            number = numCursor.getString(numberIndex);
                            type = getContactTypeString(numCursor.getString(typeIndex), true);
                            final ContactModel contact = new ContactModel(displayName, type, number);
                            phoneNumber = number.replaceAll(" ", "").replaceAll("\\(", "").replaceAll("\\)", "").replaceAll("-", "");

                            if (phoneNumber != null || displayName != null) {
                                contacts.add(phoneNumber);
                                contactsName.add(displayName);
                                contactsChecked.add(false);

                                filterdNames.add(phoneNumber);
                                filterdContactNames.add(displayName);
                                filterdCheckedNames.add(false);
                            }
                        } while (numCursor.moveToNext());
                    } finally {
                        numCursor.close();
                    }
                }


                Collections.sort(contacts, new Comparator<String>() {
                    @Override
                    public int compare(String lhs, String rhs) {
                        return lhs.compareToIgnoreCase(rhs);
                    }
                });

                InviteByContactActivity.this.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        mContactAdapter.notifyDataSetChanged();
                    }
                });

                return null;
            }
        }

        private String getContactTypeString(String typeNum, boolean isPhone) {
            String type = PHONE_TYPES.get(typeNum);
            if (type == null)
                return "other";
            return type;
        }

        static HashMap<String, String> PHONE_TYPES = new HashMap<String, String>();

        static {
            PHONE_TYPES.put(ContactsContract.CommonDataKinds.Phone.TYPE_HOME + "", "home");
            PHONE_TYPES.put(ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE + "", "mobile");
            PHONE_TYPES.put(ContactsContract.CommonDataKinds.Phone.TYPE_WORK + "", "work");
        }
}

错误日志:

E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example, PID: 6573
                                                             java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example/com.example.Activity.InviteByContactActivity}: java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation
                                                              Caused by: java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation




1
尝试了所有建议,但没有人为我工作。
Shubham Sejpal '18年

1
您是否在清单中使用android:screenOrientation =“ portrait”?
拉吉什·拉梅什

Answers:


62

当您的目标sdk为28时,问题似乎正在发生。

<activity
            android:name=".activities.FilterActivity"
            android:theme="@style/Transparent"
            android:windowSoftInputMode="stateHidden|adjustResize" />

样式:-

<style name="Transparent" parent="Theme.AppCompat.Light.NoActionBar">
     <item name="android:windowIsTranslucent">true</item>
     <item name="android:windowBackground">@android:color/transparent</item>
     <item name="android:windowIsFloating">true</item>
     <item name="android:windowContentOverlay">@null</item>
     <item name="android:windowNoTitle">true</item>
     <item name="android:backgroundDimEnabled">false</item>
 </style>

注意:api 28需要parent =“ Theme.AppCompat.Light.NoActionBar”。以前在api 26上有其他功能。虽然功能不错,但在28时开始出现问题。希望它对这里有所帮助。编辑:对于某些仅通过设置工作<item name="android:windowIsTranslucent">false</item> and <item name="android:windowIsFloating">false</item> 即可。可能取决于您实现解决方案的方式。在我的情况下,通过将它们设置为true可以工作。


22
对于任何偶然发现此“修复程序”的人,我必须设置<item name="android:windowIsTranslucent">false</item>并且还必须设置<item name="android:windowIsFloating">false</item>它才能起作用。
th317erd

8
解决方案到底在哪里?有没有screenOrientation在属性activity标签,而导致崩溃是唯一screenOrientation同时被设置android:windowIsTranslucent为true。
android开发人员

除非使用上面的注释,否则这将不起作用。请参阅Radesh的答案,其中涵盖了上面的评论以及更多内容,而且很明确
Arberg

为我设置半透明为假工作<item name =“ android:windowIsTranslucent”>假</ item>
Tran Quan

就我而言,解决方案是从AndroidManifest.xml的“活动”中删除“ android:theme”。但是,如果需要,可以通过编程方式在“ super.onCreate”之前添加它:setTheme(R.style.Theme_AppCompat_Light_Dialog);
Pavel Kataykin

132

在android Oreo(API 26)中,您无法更改样式下线的Activity的方向

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

要么

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

您有几种解决方法:

1)您只需删除上面的行(或将其设置为false),您的应用即可正常运行。

2) 或者您可以先从清单中删除该活动的以下行

android:screenOrientation="portrait"

那你必须 将此行添加到您的活动中(在onCreate()中)

    //android O fix bug orientation
    if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }

3)您可以styles.xmlvalues-v26文件夹中创建new 并将其添加到您的中style.xml。(感谢AbdelHady评论)

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

25
在Android PIE上,这可以按预期工作。因此检查应该确实是:android.os.Build.VERSION.SDK_INT != Build.VERSION_CODES.O
Entreco

@avisper能否请您分享完整的条件代码
Manikandan K

在运行26 API的设备/模拟器,选择2不工作,我不得不做出一个新styles.xmlvalues-v26,以禁止android:windowIsTranslucent仅该API。
AbdelHady

@AbdelHady好的解决方案,我将其添加到我的答案中,但是检查您的代码,然后很好地说明为什么选项2不起作用,即我建议的选项
Radesh

1
我将选项3与布尔值结合使用,<bool name="allowWindowFullScreenTranslucent">true</bool>并在中将其引用<item name="android:windowIsTranslucent">@bool/allowWindowFullScreenTranslucent</item>。然后在styles.xml中的values-v26下将其设置为false,在values和values-v27下将其设置为true
drorsun

86

在Android O及更高版本中,当您设置

 android:screenOrientation="portrait"

在清单中。

删除该行并使用

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

在你的活动中。

这样可以解决您的问题。


7
它是来自Google的错误。应该在以后的更新中修复。setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 将会限制您的应用进入横向。确保在创建所有活动时使用它。
拉吉什·拉梅什

44
<item name="android:windowIsTranslucent">true</item>从我的作品中删除继承自我的作品Theme.AppCompat.Light.NoActionBar
shadowsheep '18

16
此解决方案有效,但是却弄乱了我的splashScreenTheme。Google经常发布草率
广告而感到

3
“打算”破坏适用于早期版本的应用程序?该目标已经明确实现。至少我们有一个解决方案,这要感谢@Ragesh
Oleg Gryb

9
通过在Activity类上设置方向来替换清单属性不能解决该问题。
rmgoncalo

75

Google在Activity的 onCreate在v27之后方法,其含义是:如果Activity是半透明或浮动的,则其方向应依赖于父(背景)Activity,而无法自行决定。

即使您删除 android:screenOrientation="portrait"从浮动或半透明的Activity中,但将其方向固定在其父(背景)Activity上,它仍然被父固定,我已经测试过。

一种特殊情况:如果在启动器活动上设置半透明,则它没有父级(背景),因此请始终随设备一起旋转。要修复它,您必须采取另一种方式替换<item name="android:windowIsTranslucent">true</item>样式。


2
我在运行Android PIE的OnePlus上没有此问题。因此,它不是在v27之后,而是在v!= 28之后
Entreco

您是否碰巧有此文档的链接?我似乎找不到。
Shivam Verma,

半透明的问题真的很疯狂,谢谢,它解决了我的问题
Abhishek Garg

感谢您注意到最后一节“一种特殊情况...”
guy_m

这应该是公认的答案。很有道理!
stoefln

28

如果使用全屏透明活动,则无需在活动上指定方向锁定。它将采用父活动的配置设置。因此,如果父活动包含在清单中:

android:screenOrientation =“ portrait”

您的半透明活动将具有相同的方向锁定:纵向。


我认为您做了一个小错字:应该是“如果使用全屏半透明活动,它将采用其父活动的配置设置” ^^
Josselin

2
如果我的透明活动是我的启动器活动(即启动屏幕)
怎么办

2
所有的Android版本都适用吗?还是仅Android O及更高版本?
Abhiank

但是,如果这是唯一正在使用的Activity,则将无法正常工作(例如:从服务启动)
android开发者,

24

我用android:screenOrientation="behind"代替android:screenOrientation="portrait"。基本上,您创建了一个对话框(在活动中),并且对话框本身无法请求方向,它需要父级活动来执行此操作(因为父级在背景中可见并且具有自己的布局)。

“在...后面”与活动堆栈中紧接其下的活动的方向相同。


如果我希望创建的活动是透明的,可以显示其下的内容(包括其他应用程序),同时又保持当前方向,该怎么办?如果我让它“落后”,它仍然可以在各种情况下更改方向...
android开发人员

19

唯一有效的解决方案:

更改:

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

至:

<item name="android:windowIsTranslucent">false</item>

在styles.xml中

但这可能会导致启动画面出现问题(启动时出现白屏)...在这种情况下,请将以下行添加到您的styles.xml中:

 <item name="android:windowDisablePreview">true</item> 

就在windowIsTranslucent线下方。

如果前面的技巧不起作用,则是最后的机会:目标SDK 26改为o 27。


1
将目标SDK更改为26,而不是27。更改windowIsTranslucent没有。
Cliche818

使用targetSDK对我有用:27.这很重要,因为我配置了启动画面。
莱昂纳多·G.19年

18

如果必须使用setRequestedOrientation(),则只能在Android 8.0上牺牲windowIsTranslucent属性

values\styles.xml 对于api级别25-(<8.0)

<style name="Base.Theme.DesignDemo" parent="Base.Theme.AppCompat.Light">
        ...
        <item name="android:windowIsTranslucent">true</item>
        ...
    </style>

values-v26\styles.xml 对于api级别26(= 8.0)

<style name="Base.Theme.DesignDemo" parent="Base.Theme.AppCompat.Light">
    ...
    <!-- android 8.0(api26),Only fullscreen opaque activities can request orientation -->
    <item name="android:windowIsTranslucent">false</item>
    ...
</style>

values-v27\styles.xml 适用于api级别27+(> 8.0)

<style name="Base.Theme.DesignDemo" parent="Base.Theme.AppCompat.Light">
    ...
    <item name="android:windowIsTranslucent">true</item>
    ...
</style>

14

许多人提供了修复程序,所以我将讨论问题的根源。

根据异常日志:

Caused by: java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation
    at android.app.Activity.onCreate(Activity.java:1081)
    at android.support.v4.app.SupportActivity.onCreate(SupportActivity.java:66)
    at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:297)
    at android.support.v7.app.AppCompatActivity.onCreate(AppCompatActivity.java:84)
    at com.nut.blehunter.ui.DialogContainerActivity.onCreate(DialogContainerActivity.java:43)
    at android.app.Activity.performCreate(Activity.java:7372)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1218)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3147)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3302) 
    at android.app.ActivityThread.-wrap12(Unknown Source:0) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1891) 
    at android.os.Handler.dispatchMessage(Handler.java:108) 
    at android.os.Looper.loop(Looper.java:166)

在Activity.java中触发异常的代码

    //Need to pay attention mActivityInfo.isFixedOrientation() and ActivityInfo.isTranslucentOrFloating(ta)
    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();

        //Exception occurred
        if (isTranslucentOrFloating) {
            throw new IllegalStateException(
                    "Only fullscreen opaque activities can request orientation");
        }
    }

mActivityInfo.isFixedOrientation():

        /**
        * Returns true if the activity's orientation is fixed.
        * @hide
        */
        public boolean isFixedOrientation() {
            return isFixedOrientationLandscape() || isFixedOrientationPortrait()
                    || screenOrientation == SCREEN_ORIENTATION_LOCKED;
        }
        /**
        * Returns true if the activity's orientation is fixed to portrait.
        * @hide
        */
        boolean isFixedOrientationPortrait() {
            return isFixedOrientationPortrait(screenOrientation);
        }

        /**
        * Returns true if the activity's orientation is fixed to portrait.
        * @hide
        */
        public static boolean isFixedOrientationPortrait(@ScreenOrientation int orientation) {
            return orientation == SCREEN_ORIENTATION_PORTRAIT
                    || orientation == SCREEN_ORIENTATION_SENSOR_PORTRAIT
                    || orientation == SCREEN_ORIENTATION_REVERSE_PORTRAIT
                    || orientation == SCREEN_ORIENTATION_USER_PORTRAIT;
        }

        /**
        * Determines whether the {@link Activity} is considered translucent or floating.
        * @hide
        */
        public static boolean isTranslucentOrFloating(TypedArray attributes) {
            final boolean isTranslucent = attributes.getBoolean(com.android.internal.R.styleable.Window_windowIsTranslucent, false);
            final boolean isSwipeToDismiss = !attributes.hasValue(com.android.internal.R.styleable.Window_windowIsTranslucent)
                                            && attributes.getBoolean(com.android.internal.R.styleable.Window_windowSwipeToDismiss, false);
            final boolean isFloating = attributes.getBoolean(com.android.internal.R.styleable.Window_windowIsFloating, false);
            return isFloating || isTranslucent || isSwipeToDismiss;
        }

根据以上代码分析,当TargetSdkVersion> = 27时,使用SCREEN_ORIENTATION_LANDSCAPE,SCREEN_ORIENTATION_PORTRAIT和其他相关属性时,使用windowIsTranslucent,windowIsFloating和windowSwipeToDismiss主题属性将触发异常。

发现问题之后,您可以根据需要更改TargetSdkVersion或删除主题的相关属性。


1
现在,检查master上的代码,它已从框架中删除:mirror / platform_frameworks_base / commit / e83f34cde79c51efb66f31f2770c2e8e572e96db#diff-a9aa0352703240c8ae70f1c83add4bc8这很有趣,看到提交消息。
Erick M. Sprengel,

您能否显示此部分源代码的链接?有什么变通办法可以使我的活动具有特定的方向并具有透明的背景,以便可以查看其背后的内容(包括其他应用程序)吗?
android开发人员

8

我不同意评分最高的答案,因为

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

导致错误

java.lang.IllegalStateException:仅全屏不透明活动可以请求方向

但这对我有用

<style name="TranslucentTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowActionBar">false</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowContentOverlay">@null</item>
</style>

当您从

InterstitialActivity extends AppCompatActivity

在AndroidManifest.xml中

    <activity
        android:name=".InterstitialActivity"
        ...
        android:screenOrientation="portrait"
        android:theme="@style/TranslucentTheme" />

<item name =“ android:windowIsTranslucent”> false </ item> <item name =“ android:windowFullscreen”> true </ item> =>这已在Android 8.0上为我修复。我仍然可以在清单中保留screenOrientation。
弗兰克

1
这与windowIsTranslucent的工作方式不同,因为现在您看不到Activity的内容。
android开发人员

8

只需android:screenOrientation="portrait"在Manifiedt.xml中删除此活动行

该活动将从先前的活动中获得定向,因此无需应用具有的定向<item name="android:windowIsTranslucent">true</item>


如果上一个活动与当前活动的方向不同,该怎么办?
ClassA

6

似乎目标sdk是Pie(API级别28.0)并且windowIsTranslucent为true

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

然后您尝试访问方向。android oreo 8.0(api level 26)附带问题,有两种方法可以解决此问题

  1. 删除方向
  2. 或将windowIsTranslucent设置为false

如果您正在这样的清单中设置方向

android:screenOrientation="portrait"

或像这样的活动课

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

从两个地方删除表格。

并且在将windowIsTranslucent设置为true时观察到,它从父级活动获得方向。


5

在清单文件中,将第二个活动parentActivityName设置为第一个活动,并将screenOrientation参数删除到第二个活动。这意味着您的第一项活动是父母,并决定第二项活动的方向。

<activity
        android:name=".view.FirstActiviy"
        android:screenOrientation="portrait"
        android:theme="@style/AppTheme" />

<activity
        android:name=".view.SecondActivity"
        android:parentActivityName=".view.FirstActiviy"
        android:theme="@style/AppTheme.Transparent" />

5

只需在Manifiedt.xml中设置活动的方向

android:screenOrientation="unspecified"

或仅限于纵向方向

您还可以在“活动”中使用In onCreate方法,super.onCreate(...)例如

@Override
    protected void onCreate(Bundle savedInstanceState) {
        setOrientation(this);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.your_xml_layout);
        //...
        //...
}

// Method 
public static void setOrientation(Activity context) {
   if (android.os.Build.VERSION.SDK_INT == Build.VERSION_CODES.O)
        context.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
      else
        context.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

4

我有同样的问题,我的解决方案是消除生产线

android:screenOrientation="portrait"

然后将其添加到活动中:

if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

1
请在堆栈溢出时使用英语。谢谢!
迈克尔·迈尔斯

3

经过研究后,看来此问题可能是由于Google错误所致。对我来说,我可以在我的Activity onCreate方法中保留以下行:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

并且我将targetSdkVersion更改为26。当我的targetSdkVersion仍设置为27时,在onCreate中保留该行仍然会导致崩溃。由于到目前为止没有人的解决方案对我有用,所以我发现这是针对现在。


1
通过将targetSdkVersion设置为26,android:screenOrientation =“ portrait”和<item name =“ android:windowIsTranslucent”> true </ item>
siripan,对我有用

@siripan对我来说太
Acauã皮塔

但是最终您必须将今年的targetSdkVersion设置为28:support.google.com/googleplay/android-developer/answer/…。你会怎么做?
android开发人员

3

当您拥有Android版本7(Api级别24,25)和8(API级别26,27)中的style.xml文件中的主题之间存在冲突(错误)

android:screenOrientation="portrait" :在AndroidManifest.xml中的特定活动(崩溃)中

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

在适用于该活动的主题中,位于style.xml中

可以根据您的需要通过以下方式解决:

1-删除上述引起冲突的属性

2-变更活动的方向这些值之一,因为你需要:unspecifiedbehind等等,可以在这里找到:针对谷歌Android参考:screenOrientation `

3-在运行时以编程方式设置方向


尝试了此解决方案,但应用仍然崩溃:我需要纵向透明活动,因此我需要这两个选项。尝试在清单screenOrientation中设置未指定,但没有运气。
anber

不。我尝试完全删除清单中的方向,并使活动全屏显示,但仍然崩溃。仅在1台设备上-兑现9 lite。在三星上可以。
anber

以编程方式设置方向也会导致崩溃。您是如何使用它的?
android开发人员

@androiddeveloper如何访问您的源代码?!我必须看看你的所作所为
Hamed Jaliliani

@HamedJaliliani可以通过编程方式进行设置,例如:`setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);`
android开发者,

3

我最近遇到了这个问题,这是解决方案。

无需更改您在android清单文件中设置的屏幕方向参数。

只需在其中添加两个文件夹

res>values
as  res>values-v26 
and res>values-v27

然后在其中复制您的styles.xml和themes.xml文件。

并将以下参数从TRUE更改为FALSE。

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

<item name="android:windowIsTranslucent">false</item>

会的。

Android 8.0的常见错误


2

如果使用windowIsTranslucent'true'并强制设置方向,则仅在SDK 26(8.0.0)中遇到此问题:

解决方法如下:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);   

        // fixing portrait mode problem for SDK 26 if using windowIsTranslucent = true
        if (Build.VERSION.SDK_INT == 26) {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
        } else {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }        
    }



       <style name="SplashActivty" parent="AppTheme">
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowNoTitle">true</item>
    </style>



<!-- Splash screen -->
        <activity
            android:name="edu.aku.family_hifazat.activities.SplashActivity"
            android:label="@string/app_name"
            android:screenOrientation="unspecified"
            android:theme="@style/SplashActivty">

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

        </activity>

但是随后您失去了将方向实际设置为所需的功能。
android开发人员

2

当我尝试捕获图像或从图库中获取图像时出现此错误,对我有用的是将两者都删除

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

android:screenOrientation="portrait"

现在我的活动正在使用以下主题:

  <style name="Transparent" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:colorBackgroundCacheHint">@null</item>
        <item name="android:windowAnimationStyle">@android:style/Animation</item>
        <item name="android:windowIsTranslucent">false</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:backgroundDimEnabled">false</item>
    </style>

这不起作用,因为windowIsFloating导致与相同的崩溃windowIsTranslucent
android开发人员

2

仅8.0.0抛出异常,高于8.0则已删除异常

8.0.0引发异常



appInfo.targetSdkVersion > O引发异常
Mingo

它检查targetsdk版本。设备实际运行的sdk版本无关紧要,您正在针对Android O(28)进行编译,但未遵循该平台版本的约定。
Benjiko99,19年

2

唯一对我有用的是改变

android:screenOrientation="portrait"

android:screenOrientation="unspecified"

清单中的所有半透明活动。

这样,它就可以与所有API版本兼容,因为半透明活动似乎从其父活动继承了其方向targetApi: 28

样式可以保留,包括<item name="android:windowIsTranslucent">true</item>


尝试过此解决方案,但应用仍然崩溃
anber

但是,然后您失去了设置方向的功能
android开发人员

@androiddeveloper:我了解它的方式是从父活动继承方向。如果您要为半透明活动明确设置其他方向,而这种方式将无法以这种方式工作...
Max Heimer

有时您无法控制上一个活动。有时您想在用户当前看到的内容之上显示透明的内容。因此,这无济于事:(
android开发人员

2

android:screenOrientation="behind"

和主题

<style name="translucent" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowBackground">#beaaaaaa</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowAnimationStyle">@android:style/Animation</item>
    <item name="android:typeface">normal</item>
    <item name="android:windowSoftInputMode">adjustPan</item>
    <item name="windowActionBar">false</item>
</style>

1

我不知道这是Google的错误还是预期的行为,但我(至少是暂时)通过在Gradle中将compileSdkVersion和targetSdkVersion更改回26来解决了该问题。


3
您不应该降低targetdk级别。您的应用最终将被禁止从Play商店中使用。始终瞄准最新的Android API级别android-developers.googleblog.com/2017/12/...
什穆埃尔

1
@Shmuel:错了。您可以定位26,并在商店的28上有空。
Regis_AG

1
正确,我写了“最终”,如果您针对较旧的api级别构建应用程序,则当您被迫进行更新时,您将痛苦
无比

这不是解决方案,而是一种解决方法。有一天,您必须将应用迁移到28,因此!
sud007

1

如果您尚未解决问题,请在清单中注册广告活动,如下所示:

<activity
android:name="com.google.android.gms.ads.AdActivity"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
tools:replace="android:theme"
 />

您还需要更新到最新版本的sdk。


1

可能您显示的Activity类似于Dialog(非全屏),因此从清单或代码中删除screenOrientation。这样可以解决问题。


嗯,很奇怪,对我来说就是这样。尝试在不同的Android版本上运行该应用程序,看看将对您有什么帮助……
Balflear18年

1

这发生在27岁之后,请使用targetSdkVersion 26替换,等待google修复它


2
发布答案时,请提供任何参考(链接或引用)。因此,将来的用户可以轻松理解。另外,欢迎来到SO社区
Mohammedsalim Shivani

@MohammedsalimShivani此处:issuetracker.google.com/issues/68454482#comment4 “我们的工程团队已解决此问题。它将在以后的Android版本中提供,因此请注意发行说明。”
android开发人员

这是个坏建议
克里斯(Chris)


0

请检查“活动”的样式,并确保如果您未使用任何与“半透明”相关的东西,请将样式更改为备用。这样我们可以解决此问题。

android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"

0

我通过删除android:screenOrientation="portrait"并将以下代码添加到我的onCreate中解决了此问题

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

而我的主题属性是

<item name="android:windowIsTranslucent">true</item>
<item name="android:windowDisablePreview">true</item>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.