java.lang.IllegalStateException: только полноэкранные непрозрачные действия могут запрашивать ориентацию

Я столкнулся с проблемой при получении контактов из контактной книги в Android 8.0 Oreo java.lang.IllegalStateException: только полноэкранные непрозрачные действия могут запрашивать ориентацию

Я пытаюсь получить контакт в своей деятельности из телефонной контактной книги, и он отлично работает для Lollipop, Marshmallow, Nougat и т.Д., Но это дает мне ошибку для Oreo, как это, пожалуйста, помогите мне. Мой код здесь ниже.

Демо-код: -

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

person Shubham Sejpal    schedule 03.01.2018    source источник
comment
Проверьте это: stackoverflow.com/questions/6745797/   -  person yash786    schedule 03.01.2018
comment
это может помочь вам stackoverflow.com/questions/46980697/   -  person AskNilesh    schedule 03.01.2018
comment
проверьте и это: stackoverflow.com/questions/46980697/   -  person yash786    schedule 03.01.2018
comment
Пробовал все предложения, но у меня никто не работал.   -  person Shubham Sejpal    schedule 03.01.2018
comment
вы используете android: screenOrientation = portrait в манифесте?   -  person Ragesh Ramesh    schedule 03.01.2018
comment
да, я уже установил портрет.   -  person Shubham Sejpal    schedule 03.01.2018
comment
я решил это в своем проекте следующим образом: stackoverflow.com/a/48077046/4149649   -  person Yuri Misyac    schedule 03.01.2018
comment
@ShubhamSejpal ты решил? Если нет, то расширили ли вы тему NoActionBar, сделав окно полупрозрачным, и компилируете ли вы с compileSdkVersion = targetSdkVersion = 27   -  person shadowsheep    schedule 07.02.2018


Ответы (35)


Проблема, похоже, возникает, когда ваш целевой 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>

Примечание: parent = "Theme.AppCompat.Light.NoActionBar" необходим для api 28. Раньше было что-то еще на api 26. Работал отлично, но начал давать проблемы на 28. Надеюсь, это поможет кому-то здесь. РЕДАКТИРОВАТЬ: для некоторых работает только установка <item name="android:windowIsTranslucent">false</item> and <item name="android:windowIsFloating">false</item>. Может быть, зависит от того, как вы реализуете решение. В моем случае это сработало, установив для них значение true.

person Debasish Ghosh    schedule 24.10.2018
comment
Всем, кто наткнется на это исправление, я должен был установить <item name="android:windowIsTranslucent">false</item>, а также должен был установить <item name="android:windowIsFloating">false</item>, прежде чем оно сработает. - person th317erd; 20.02.2019
comment
Где именно решение этой проблемы? В теге activity нет атрибута screenOrientation, и единственное, что вызывает сбой, - это установка screenOrientation, а для android:windowIsTranslucent установлено значение true. - person android developer; 29.04.2019
comment
Это не сработает, если не используются приведенные выше комментарии. См. Ответ Радеша, который охватывает комментарии выше и многое другое, и он ясен. - person arberg; 24.05.2019
comment
Установка полупрозрачности на false работает для меня ‹item name = android: windowIsTranslucent› false ‹/item› - person Tran Quan; 31.07.2019
comment
В моем случае решением было удалить android: theme из Activity в AndroidManifest.xml. Но если он вам нужен, вы можете добавить его программно перед super.onCreate: setTheme (R.style.Theme_AppCompat_Light_Dialog); - person Pavel Kataykin; 28.03.2020

В Android Oreo (API 26) вы не можете изменить ориентацию для Activity, которая имеет нижнюю строку (строки) в стиле

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

or

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

У вас есть несколько способов решить эту проблему:

1) Вы можете просто удалить вышеуказанные строки (или установить для него значение false), и ваше приложение будет работать нормально.

2) Или вы можете сначала удалить строку ниже из манифеста для этого действия.

android:screenOrientation="portrait"

Затем вы должны добавить эту строку в свою активность (в onCreate ())

'›=' Изменить на '! =' Благодаря комментарию Entreco

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

3) Вы можете создать новый styles.xml в папке values-v26 и добавить его в свой style.xml. (Благодаря комментарию AbdelHady)

 <item name="android:windowIsTranslucent">false</item>
 <item name="android:windowIsFloating">false</item>
person Radesh    schedule 13.06.2018
comment
на Android PIE это работает, как ожидалось. Так что чек действительно должен быть: android.os.Build.VERSION.SDK_INT != Build.VERSION_CODES.O - person Entreco; 06.11.2018
comment
@avisper, не могли бы вы поделиться полным кодом условия - person Manikandan K; 28.08.2019
comment
В устройстве / эмуляторе с API 26 вариант 2 не работает, мне пришлось создать новый styles.xml в values-v26, чтобы отключить android:windowIsTranslucent только для этого API. - person AbdelHady; 13.10.2019
comment
@AbdelHady Хорошее решение, я добавлю его к своему ответу, но проверю ваш код и прекрасно, почему вариант 2 не работает, это мой предложенный вариант, - person Radesh; 14.10.2019
comment
Я использовал вариант 3 с логическим значением <bool name="allowWindowFullScreenTranslucent">true</bool> и упомянул его в <item name="android:windowIsTranslucent">@bool/allowWindowFullScreenTranslucent</item>. Затем в styles.xml в разделе values-v26 установите для него значение false, а в values ​​и values-v27 установите его на true. - person drorsun; 23.12.2019

В Android O и более поздних версиях эта ошибка возникает, когда вы устанавливаете

 android:screenOrientation="portrait"

в Manifest.

Удалите эту строку и используйте

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

в вашей деятельности.

Это решит вашу проблему.

person Ragesh Ramesh    schedule 03.01.2018
comment
Есть идеи, почему? Я хочу, чтобы мое приложение отображалось в альбомной ориентации. - person Irfan Raza; 11.01.2018
comment
Это ошибка со стороны Google. Должно быть исправлено в будущих обновлениях. setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); ограничит переход вашего приложения в альбомную ориентацию. Убедитесь, что вы используете это при создании всех своих занятий. - person Ragesh Ramesh; 12.01.2018
comment
Удаление <item name="android:windowIsTranslucent">true</item> из моего стиля, унаследованного от Theme.AppCompat.Light.NoActionBar, помогло мне. - person shadowsheep; 29.01.2018
comment
Тогда проблема становится: Only fullscreen activities can request orientation. Тем не менее, я установил тему деятельности на @android:style/Theme.Translucent.NoTitleBar.Fullscreen - person thundertrick; 31.01.2018
comment
Это решение работает, но портит мою тему splashScreenTheme. Позор Google за частые небрежные выкатывания ... - person doctorram; 05.03.2018
comment
не похоже, что это ошибка, но задумано: aosp-зеркало / platform_frameworks_base / commit / - person Teovald; 14.03.2018
comment
Намерены нарушить работу приложений, которые работали в более ранних версиях? Эта цель определенно достигнута. По крайней мере, у нас есть решение, благодаря @Ragesh - person Oleg Gryb; 18.03.2018
comment
@OlegGryb Мне потребовалось много времени, чтобы понять это. Рад помочь коллегам-разработчикам - person Ragesh Ramesh; 19.03.2018
comment
Еще раз большое спасибо @Ragesh. Я получил несколько отчетов о сбоях для 8.0 на игровой консоли и никогда бы не понял этого без его ответа. Я бы хотел дать ему больше +1 :) - person Oleg Gryb; 19.03.2018
comment
Спасибо :) Я по ошибке поместил этот android:screenOrientation="portrait" в свой тег FacebookActivity, после удаления он был решен - person Narendra Singh; 28.03.2018
comment
Замена атрибута manifest установкой ориентации в классе Activity не решает проблемы. - person rmgoncalo; 06.04.2018
comment
@rmgoncalo, вы используете межстраничную рекламу? - person Ragesh Ramesh; 10.04.2018
comment
Нет @RageshRamesh, у меня обычное простое полупрозрачное занятие. И он вылетает на Android 8.0 (исправлено в 8.1) либо при установке ориентации в манифесте, либо в методе onCreate Activity. - person rmgoncalo; 10.04.2018
comment
кто-нибудь нашел решение - person Thamilvanan; 08.06.2018
comment
Я получаю эту ошибку с конфигурацией градиента com.google.firebase: firebase-ads: 15.0.1. Обновляю до 16.0.1. Надеюсь, это исправит ошибку. Кстати, ошибка возникает только в Android 8. Также сбой firebase дает следующую строку в отчете о сбое: 'na.onTransact (: com.google.android.gms.dynamite_adsdynamite @ 13280051 @ 13.2.80 (040408-211705629): 10)' - person Aykut Uludağ; 04.10.2018
comment
@RageshRamesh, я получаю эту ошибку, когда пытаюсь программно установить ориентацию java.lang.IllegalStateException: только полноэкранные действия могут запрашивать ориентацию - person Nishita; 05.09.2019

Google выдает это исключение в методе Activity onCreate после v27, их значение таково: если Activity является полупрозрачным или плавающим, его ориентация должна зависеть от родительской (фоновой) Activity, не может принимать решения сама по себе.

Даже если вы удалите android:screenOrientation="portrait" из плавающего или полупрозрачного Activity, но зафиксируете ориентацию в его родительском (фоновом) Activity, он все равно будет зафиксирован родителем, что я уже тестировал.

Одна особая ситуация: если вы сделаете полупрозрачным для Activity пусковой установки, у него нет родительского (фона), поэтому всегда вращайте вместе с устройством. Хотите исправить это, вы должны найти другой способ заменить стиль <item name="android:windowIsTranslucent">true</item>.

person Steven Sun    schedule 19.02.2018
comment
У меня нет этой проблемы на моем OnePlus под управлением Android PIE. Так что не после v27, а когда v! = 28 - person Entreco; 06.11.2018
comment
У вас есть ссылка на документацию по этому поводу? Кажется, я не могу его найти. - person Shivam Verma; 17.11.2018
comment
полупрозрачная проблема действительно сумасшедшая, спасибо, она решает мою проблему - person Abhishek Garg; 17.12.2018
comment
Спасибо, что обратили внимание на последний раздел «Одна особая ситуация ...» - person guy_m; 19.02.2019
comment
Это должен быть принятый ответ. Имеет смысл! - person stoefln; 03.07.2019

Если вы используете полноэкранное прозрачное действие, нет необходимости указывать блокировку ориентации для действия. Потребуются настройки конфигурации родительского действия. Итак, если в манифесте родительского действия указано:

android: screenOrientation = "портрет"

у вашего полупрозрачного занятия будет такая же блокировка ориентации: портрет.

person gellyke    schedule 05.06.2018
comment
Я думаю, вы допустили небольшую опечатку: должно быть, если вы используете полноэкранное полупрозрачное действие, оно будет принимать настройки конфигурации его родительского действия ^^ - person Josselin; 12.07.2018
comment
Что, если моя прозрачная активность - это моя пусковая установка (например, заставка) - person Bhupesh; 27.07.2018
comment
Это верно для всех версий Android? Или это только Android O и выше? - person vepzfe; 24.09.2018
comment
Это не сработает, если это единственное используемое действие (пример: запуск его из службы) - person android developer; 30.04.2019

Я использовал android:screenOrientation="behind" вместо android:screenOrientation="portrait". По сути, вы создали диалоговое окно (в действии), и диалоговое окно не может запрашивать ориентацию само по себе, для этого ему требуется родительское действие (поскольку родительский элемент виден в фоновом режиме и имеет собственный макет).

"за" Та же ориентация, что и действие, которое находится непосредственно под ним в стеке действий.

person Paul    schedule 20.09.2018
comment
Что, если я хочу, чтобы созданное мной действие было прозрачным, показывало, что находится под ним (включая другие приложения), но при этом оставалось в текущей ориентации? Если я позволю ему остаться, он все равно может менять ориентацию в разных случаях ... - person android developer; 30.04.2019

Единственное решение, которое действительно работает:

Изменять:

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

to:

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

в styles.xml

Но это может вызвать проблемы с вашим экраном-заставкой (белый экран при запуске) ... В этом случае добавьте следующую строку в свой файл styles.xml:

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

прямо под линией windowIsTranslucent.

Последний шанс, если предыдущие советы не сработают: выберите SDK 26 вместо 27.

person Regis_AG    schedule 31.05.2018
comment
Изменение целевого SDK на 26 вместо 27 сработало для меня. При изменении windowIsTranslucent этого не произошло. - person Cliche818; 18.06.2018
comment
У меня это сработало с использованием targetSDK: 27. Это особенно важно, поскольку у меня был настроен экран-заставка. - person Leonardo G.; 13.05.2019

Если вам нужно использовать setRequestedOrientation(), нет другого выхода, кроме как пожертвовать атрибутом windowIsTranslucent в Android 8.0.

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>
person leigo    schedule 10.12.2018

Многие люди давали исправление, поэтому я расскажу об источнике проблемы.

Согласно журналу исключений :

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 или удалить связанные атрибуты темы в соответствии с вашими потребностями.

person Bingerz    schedule 12.06.2018
comment
На данный момент проверяем код на master, он уже удален из framework: mirror / platform_frameworks_base / commit / e83f34cde79c51efb66f31f2770c2e8e572e96db # diff-a9aa0352703240c8ae70f1c83add4bc8 Интересно увидеть сообщение о фиксации. - person Erick M. Sprengel; 13.09.2018
comment
Не могли бы вы показать ссылку на исходный код этой части? Есть ли какое-либо обходное решение, которое позволит мне иметь Activity с определенной ориентацией и прозрачным фоном, чтобы можно было увидеть, что за ним стоит (включая другие приложения)? - person android developer; 30.04.2019

Я не могу согласиться с наиболее оцененным ответом, потому что

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" />
person hannes ach    schedule 18.04.2018
comment
‹Item name = android: windowIsTranslucent› false ‹/item› ‹item name = android: windowFullscreen› true ‹/item› = ›это исправило это для меня на android 8.0. Я все еще мог оставить screenOrientation в манифесте. - person Frank; 08.05.2018
comment
Это не работает так же, как windowIsTranslucent, потому что теперь вы не можете видеть, что стоит за Activity. - person android developer; 29.04.2019

Просто удалите эту строку android:screenOrientation="portrait" активности в Manifest.xml

Это действие будет ориентироваться на основе предыдущего действия, поэтому нет необходимости применять ориентацию, имеющую <item name="android:windowIsTranslucent">true</item>.

person Sanket Kachhela    schedule 22.11.2018
comment
Что, если предыдущее действие имеет другую ориентацию, чем то, что вы хотите в текущем действии? - person ClassA; 07.06.2019

кажется, когда целевой sdk является пирогом (уровень API 28.0), а windowIsTranslucent истинно

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

и вы пытаетесь получить доступ к ориентации. Проблема связана с Android Oreo 8.0 (уровень API 26), есть два способа решить эту проблему

  1. убрать ориентацию
  2. или установите для windowIsTranslucent значение false

если вы устанавливаете ориентацию в манифесте, как это

android:screenOrientation="portrait"

или в классе активности, подобном этому

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

удалить из обоих мест.

и наблюдается, когда вы устанавливаете windowIsTranslucent в значение true, он берет ориентацию от родительской активности.

person Avinash Jadaun    schedule 02.07.2019

в файле манифеста установите второе действие 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" />
person mustafa.ertrk    schedule 21.07.2018

Просто установите ориентацию активности в Manifest.xml

android:screenOrientation="unspecified"

ИЛИ для ограничения книжной ориентацией

Вы также можете использовать в Activity, в вызове метода 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);
}
person Attaullah    schedule 25.08.2018

У меня была такая же проблема, и я решил убрать строку

android:screenOrientation="portrait"

а затем добавьте это в действие:

if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
person jrivas    schedule 16.08.2018
comment
Пожалуйста, используйте английский на Stack Overflow. Спасибо! - person Michael Myers; 16.08.2018

Недавно я столкнулся с проблемой, и вот решение.

Нет необходимости изменять параметр ориентации экрана, который вы устанавливаете в файле манифеста Android.

Просто добавьте две папки в

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

Затем скопируйте туда файлы styles.xml и themes.xml.

и измените следующие параметры с ИСТИНА на ЛОЖЬ.

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

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

Это будет работать.

Распространенная ошибка Android 8.0

person MD. Shafiul Alam Biplob    schedule 16.11.2019

После некоторых исследований выяснилось, что эта проблема может быть связана с ошибкой Google. Что касается меня, я смог оставить эту строку в моем методе Activity onCreate:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

И я изменил свой targetSdkVersion на 26. Наличие этой строки в моем onCreate все еще приводило к сбою, в то время как мой targetSdkVersion был по-прежнему установлен на 27. Поскольку ни одно другое решение пока не помогло мне, я обнаружил, что это работает как временное исправление для Теперь.

person NaturallyAsh    schedule 26.09.2018
comment
Этот сработал для меня, установив targetSdkVersion на 26, android: screenOrientation = portrait и ‹item name = android: windowIsTranslucent› true ‹/item› - person siripan; 19.11.2018
comment
@siripan для меня тоже - person Acauã Pitta; 12.03.2019
comment
Но в конечном итоге вам придется установить targetSdkVersion на 28 в этом году: поддержка. google.com/googleplay/android-developer/answer/. Что ты будешь делать? - person android developer; 29.04.2019

только 8.0.0 выдает исключение, выше 8.0 удаляет исключение

8.0.0 выбросить исключение

person Mingo    schedule 04.01.2019
comment
Android 7, 7.1, 8.0, 8.1 у всех есть эта проблема - person Hamed Jaliliani; 07.01.2019
comment
appInfo.targetSdkVersion > O выбросить исключение - person Mingo; 08.01.2019
comment
Он проверяет версию target sdk. Неважно, какая версия sdk на самом деле запущена на устройстве, вы компилируете с Android O (28), но не следуете соглашениям этой версии платформы. - person zOqvxf; 22.03.2019

Это конфликт (ошибка) между темами внутри файла style.xml в версиях Android 7 (уровни Api 24, 25) и 8 (уровни api 26, 27), когда у вас есть

android:screenOrientation="portrait": внутри определенной активности (которая дает сбой) в AndroidManifest.xml

&

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

в теме, которая применялась к этому действию внутри style.xml

В зависимости от ваших потребностей ее можно решить следующими способами:

1- Удалите одно из вышеупомянутых свойств, вызывающих конфликт.

2- Измените ориентацию активности на одно из этих значений по мере необходимости: unspecified или behind и т.д., которые можно найти здесь: Справочник Google для android: screenOrientation`

3- Установите ориентацию программно во время выполнения

person Hamed Jaliliani    schedule 07.01.2019
comment
Пробовал это решение, но приложение по-прежнему вылетает: мне нужна портретная прозрачная активность, поэтому мне нужны оба этих варианта. Пробовал установить в манифесте screenOrientation, но безуспешно. - person anber; 03.04.2019
comment
Нет. Я попытался вообще удалить ориентацию в манифесте и сделать активность полноэкранной, но она все равно вылетает. Только на 1 устройстве - honor 9 lite. На Самсунге работает нормально. - person anber; 05.04.2019
comment
Программная установка ориентации также вызывает сбой. Как именно вы его использовали? - person android developer; 29.04.2019
comment
@androiddeveloper, как мне получить доступ к вашему исходному коду ?! Я должен увидеть, что ты сделал - person Hamed Jaliliani; 29.04.2019
comment
@HamedJaliliani Программная установка, например: `setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);` - person android developer; 30.04.2019
comment
@androiddeveloper, какой у вас код тега активности в манифесте, версия Android, в которой вы столкнулись с этой ошибкой и ошибкой logcat? - person Hamed Jaliliani; 30.04.2019
comment
@HamedJaliliani Вот пример кода: Issuesetracker.google.com/issues/131534974. Было бы проще, чем объяснять в ограниченном разделе комментариев. - person android developer; 30.04.2019

Использовать

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>
person Mostafa Imran    schedule 02.07.2019

Возможно, вы показываете Activity в виде диалогового окна (не в полноэкранном режиме), поэтому удалите screenOrientation из манифеста или из кода. Это решит проблему.

person Balflear    schedule 17.04.2018
comment
Хм, очень странно, по мне так и было. Попробуйте запустить приложение на разных версиях Android, посмотрите, каков будет результат, это может вам помочь ... - person Balflear; 18.04.2018

Я столкнулся с этой проблемой только в SDK 26 (8.0.0), если использовал windowIsTranslucent 'true' и принудительно установил ориентацию:

Вот решение:

    @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>
person Hamza Khan    schedule 28.09.2018
comment
Но тогда вы теряете возможность иметь желаемую ориентацию. - person android developer; 29.04.2019

Я получаю эту ошибку, когда пытаюсь захватить изображение или взять изображение из галереи, что мне подходит, так это удалить оба

 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>
person Nouman Ch    schedule 02.01.2019
comment
Это не работает, поскольку windowIsFloating вызывает такой же сбой, что и windowIsTranslucent. - person android developer; 29.04.2019

Единственное, что у меня сработало, это изменение

android:screenOrientation="portrait"

to

android:screenOrientation="unspecified"

в манифесте для всех полупрозрачных действий.

Таким образом, он совместим со всеми версиями API, поскольку полупрозрачное действие, похоже, наследует свою ориентацию от родительского действия с targetApi: 28.

Стиль можно оставить без изменений, включая <item name="android:windowIsTranslucent">true</item>.

person Max Heimer    schedule 01.04.2019
comment
Пробовал это решение, но приложение по-прежнему вылетает - person anber; 03.04.2019
comment
Но потом теряешь функцию настройки ориентации - person android developer; 29.04.2019
comment
@androiddeveloper: насколько я понимаю, ориентация будет унаследована от родительской активности. Если вы хотите явно установить другую ориентацию для полупрозрачного действия, которая не будет работать таким образом ... - person Max Heimer; 08.05.2019
comment
Иногда вы не можете контролировать предыдущее действие. Иногда вы хотите показать свою прозрачную поверх того, что в данный момент видит пользователь. Так что это не поможет :( - person android developer; 08.05.2019

Я не знаю, является ли это ошибкой от Google или предполагаемым поведением, но я (по крайней мере, на мгновение) решил ее, изменив compileSdkVersion и targetSdkVersion обратно на 26 в Gradle ...

person Seven    schedule 19.03.2018
comment
Не следует понижать уровень targetdk. В конечном итоге ваше приложение будет заблокировано в магазине игр. Всегда ориентируйтесь на последнюю версию Android Api android-developers .googleblog.com / 2017/12 / - person Shmuel; 19.04.2018
comment
@ Шмуэль: неправильно. Вы можете выбрать цель 26 и быть доступным на 28 в магазине. - person Regis_AG; 01.06.2018
comment
Правильно, я написал «в конце концов», если вы создадите свое приложение, ориентированное на более старый уровень API, вы будете в мире боли, когда вы будете вынуждены обновить - person Shmuel; 02.06.2018
comment
Это не решение, а обходной путь. Однажды вам нужно будет перенести свое приложение на 28 и, следовательно,! - person sud007; 12.09.2019

Если вы не решили свою проблему, просто зарегистрируйте рекламную активность в манифесте следующим образом:

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

Вам также необходимо обновить SDK до последней версии.

person Gardax    schedule 05.04.2018

это произошло после 27, используйте targetSdkVersion 26 replace, подождите, пока Google исправит это

person yihang wu    schedule 18.07.2018
comment
Пожалуйста, предоставьте любую ссылку (ссылку или цитату) при публикации ответа. Так что будущие пользователи могут легко понять. Также добро пожаловать в Сообщество SO. - person Mohammedsalim Shivani; 18.07.2018
comment
@MohammedsalimShivani Здесь: Issueetracker.google.com/issues/68454482#comment4 Наша команда инженеров исправил эту проблему. Он будет доступен в следующем выпуске Android, поэтому следите за примечаниями к выпуску. - person android developer; 29.04.2019
comment
Это плохой совет - person Chris; 13.10.2019

Я только что удалил теги "портрет" с не полноэкранных элементов, и все прошло нормально.

android:screenOrientation="portrait"
person Victor Tavares    schedule 23.05.2019

Проверьте стиль своей деятельности и убедитесь, что если вы не используете какие-либо элементы, связанные с полупрозрачностью, измените стиль на альтернативный. Чтобы мы могли решить эту проблему.

android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
person sreedhar    schedule 10.01.2020

Я решил эту проблему, удалив 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>
person Waheed Nazir    schedule 24.02.2020

некоторые ответы были для меня непонятны и не сработали,

поэтому это вызывало ошибку:

<activity
android:name=".ForgotPass_ChangePass"
android:screenOrientation="portrait" <--- // this caused the error
android:windowSoftInputMode="stateHidden|adjustPan|adjustResize"/>

Студия Android предлагала установить screenOrientation на fullSensor

android:screenOrientation="fullSensor"

да, это исправит ошибку, но я хочу сохранить макет в портретном режиме, а fullSensor будет действовать на основе датчика

fullSensor Ориентация определяется датчиком ориентации устройства для любой из 4 ориентаций. Это похоже на сенсор, за исключением того, что он позволяет любую из 4 возможных ориентаций экрана, независимо от того, что устройство обычно делает (например, некоторые устройства обычно не используют обратный портрет или обратный ландшафт, но это позволяет их). Добавлено в API уровня 9.

source: android: screenOrientation

Итак, решение, которое сработало для меня, я использовал носенсор:

 <activity
        android:name=".ForgotPass_ChangePass"
        android:screenOrientation="nosensor"
        android:windowSoftInputMode="stateHidden|adjustPan|adjustResize"/>

Носенсор Ориентация определяется без привязки к датчику физического ориентирования. Датчик игнорируется, поэтому дисплей не будет вращаться в зависимости от того, как пользователь перемещает устройство.

см. документацию по Android здесь

person Ridha Rezzag    schedule 30.06.2021

Если действие создано вами, вы можете попробовать это в действии:

@Override
public void setRequestedOrientation(int requestedOrientation) {
    try {
        super.setRequestedOrientation(requestedOrientation);
    } catch (IllegalStateException e) {
        // Only fullscreen activities can request orientation
        e.printStackTrace();
    }
}

Это должно быть самое простое решение.

person linjiang    schedule 10.01.2019

У меня была такая же проблема, и я исправил ее, просто установив это: <item name="android:windowIsFloating">false</item> в styles.xml

person Francesco Pietrangelo    schedule 05.06.2019

Пользователь продлит AppCompatActivity, и он будет работать !!

person NAP Developer    schedule 08.10.2018

Попробуйте удалить строки своей темы:

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

а также

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

после этого добавьте android:screenOrientation="portrait" в свою деятельность.

person paulparkbom    schedule 22.02.2019