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


187

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

Я пытаюсь получить контакт в своей деятельности из телефонной книги контактов, и он отлично работает для леденцов, зефира, нуги и т. Д., Но это даст мне ошибку для 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

Проверьте это: stackoverflow.com/questions/6745797/…
yash786

1
это может помочь вам stackoverflow.com/questions/46980697/…
Nilesh Rathod

проверить это , а также: stackoverflow.com/questions/46980697/...
yash786

1
Перепробовал все предложения, но никто не работал для меня.
Шубхам Сейпал

1
Вы используете Android: screenOrientation = "портрет" в манифесте?
Рагеш Рамеш

Ответы:


63

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


23
Всем, кто сталкивается с этим «исправлением», я должен был установить, <item name="android:windowIsTranslucent">false</item>а также должен был установить, <item name="android:windowIsFloating">false</item>прежде чем оно сработает.
th317erd

8
Где именно это решение? В теге нет screenOrientationатрибута activity, и единственное, что вызывает сбой screenOrientation, устанавливается, когда android:windowIsTranslucentустановлено значение true.
Android-разработчик

Это не работает, если комментарии выше не используются. Смотрите ответ Радеша, который охватывает комментарии выше и многое другое, и ясно
Арберг

Настройка полупрозрачного на ложное срабатывание для меня <item name = "android: windowIsTranslucent"> false </ item>
Тран Куан

В моем случае решением было удалить «android: theme» из Activity в AndroidManifest.xml. Но если вам это нужно, вы можете добавить его программно перед «super.onCreate»: setTheme (R.style.Theme_AppCompat_Light_Dialog);
Павел Катайкин

133

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

 <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.xmlв values-v26папке и добавить это в свой 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

В устройстве / эмуляторе работает API 26, вариант 2 не работает, я должен был сделать новый styles.xmlв , values-v26чтобы отключить android:windowIsTranslucentтолько для этого API.
AbdelHady

@AbdelHady Хорошее решение, я добавлю его в свой ответ, но провожу проверку кода и замечательно, почему вариант 2 не работает, что мой предложенный вариант,
Радеш

1
Я использовал вариант 3 с логическим значением <bool name="allowWindowFullScreenTranslucent">true</bool>и сослался на него в <item name="android:windowIsTranslucent">@bool/allowWindowFullScreenTranslucent</item>. Затем в styles.xml в values-v26 установите его, falseа в values ​​and values-v27 установите его true.
drorsun

87

В 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

16
Это решение работает, но оно испортило мой splashScreenTheme. Позор Google для частых неаккуратных
выкатов

3
«Предназначен» для взлома приложений, которые работали в более ранних версиях? Эта цель была определенно достигнута. По крайней мере, у нас есть решение, благодаря @Ragesh
Олег Гриб

9
Замена атрибута манифеста путем установки ориентации в классе Activity не решает проблему.
rmgoncalo

75

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

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

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


2
У меня нет этой проблемы на моем OnePlus под управлением Android PIE. Так что это не после v27, а когда v! = 28
Entreco

У вас есть ссылка на документацию для этого? Я не могу найти это.
Шивам Верма

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

Спасибо, что
обратили

Это должен быть принятый ответ. Имеет смысл!
Stoefln

29

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

андроид: screenOrientation = "портрет"

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


Я думаю, что вы сделали небольшую опечатку: должно быть «если вы используете полноэкранное полупрозрачное действие, оно примет настройку конфигурации своего родительского действия» ^^
Josselin

2
Что, если моя прозрачная активность - это моя активность запуска (то есть заставки)
Bhupesh

2
Это правда для всех версий Android? Или это только Android O и выше?
abhiank

Это не будет работать, если это единственное действие, которое используется, хотя (пример: запуск его из службы)
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> 

чуть ниже окна находится полупрозрачная линия.

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


1
Изменение целевого SDK на 26 вместо 27 сработало для меня. Менять окно не прозрачно.
Cliche818

Это сработало для меня при использовании targetSDK: 27. Это особенно важно, поскольку у меня был настроен экран-заставка.
Леонардо Г.

18

Если вам нужно использовать 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>

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 Интересно посмотреть сообщение коммита.
Эрик М. Шпренгель

Можете ли вы показать ссылку на исходный код этой части? Есть ли обходной путь, который позволит мне иметь активность с определенной ориентацией и иметь прозрачный фон, чтобы можно было увидеть, что за этим стоит (включая другие приложения)?
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"деятельности в Manifyt.xml

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


Что если предыдущая активность имеет другую ориентацию, чем та, которую вы хотите в текущей активности?
ClassA

6

Похоже, когда целевой SDK является круговой (API-уровень 28.0), а windowIsTranslucent имеет значение true

<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, он берет ориентацию из родительской активности.


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

Просто установите ориентацию деятельности в Manifyt.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);
}

4

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

android:screenOrientation="portrait"

а затем добавьте это в упражнение:

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

1
Пожалуйста, используйте английский язык при переполнении стека. Спасибо!
Майкл Майерс

3

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

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

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


1
Это сработало для меня, установив targetSdkVersion равным 26, android: screenOrientation = "портрет" и <item name = "android: windowIsTranslucent"> true </ item>
siripan

@siripan для меня тоже
Acauã Pitta

Но в конечном итоге вам придется установить для targetSdkVersion значение 28 в этом году: support.google.com/googleplay/android-developer/answer/… . Что ты будешь делать?
Android-разработчик

3

Это конфликт (ошибка) между темами внутри файла 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- Установите ориентацию программно во время выполнения


Пробовал это решение, но приложение по-прежнему зависает: мне нужна прозрачная активность портрета, поэтому мне нужны оба варианта. Попробовал установить в манифесте экран Ориентация не указана, но не повезло.
19

Нет. Я вообще пытался удалить ориентацию в манифесте и сделать активность полноэкранной, но она все равно вылетает. Только на 1 устройстве - честь 9 лайт. На самсунге работает нормально.
19

Установка ориентации программно также вызывает сбой. Как ты это использовал?
Android-разработчик

@androiddeveloper как я могу получить доступ к вашему исходному коду ?! Я должен увидеть, что ты сделал
Хамед Джалилиани

@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

Я столкнулся с этой проблемой только в 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>

Но тогда вы теряете функциональность, фактически устанавливая ориентацию на то, что вы хотели.
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 скинуть исключение


Android 7, 7.1, 8.0, 8.1 у всех есть эта проблема
Хамед Джалилиани

appInfo.targetSdkVersion > Oбросить исключение
Минго

Это проверка targetверсии SDK. Неважно, какую версию SDK на самом деле использует устройство: вы компилируете под Android O (28), но не соблюдаете соглашения этой версии платформы.
Benjiko99

2

Единственная вещь, которая работала для меня, менялась

android:screenOrientation="portrait"

в

android:screenOrientation="unspecified"

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

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

Стиль можно оставить как есть <item name="android:windowIsTranslucent">true</item>.


Пробовал это решение, но приложение по-прежнему вылетает
19

Но тогда вы теряете функцию установки ориентации
Android

@androiddeveloper: Насколько я понимаю, ориентация будет унаследована от родительской активности. Если вы хотите явно установить другую ориентацию на полупрозрачную активность, которая не будет работать таким образом ...
Макс Хаймер

Иногда вы не можете контролировать предыдущую активность. Иногда вы хотите показать свой прозрачный поверх того, что видит пользователь в настоящее время. Так что это не может помочь :(
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 или предполагаемым поведением, но я (по крайней мере, на мгновение) решил ее, изменив compileSdkVersion и targetSdkVersion обратно на 26 в Gradle ...


3
Вы не должны понижать уровень targetdk. Ваше приложение будет заблокировано в магазине игр в конце концов. Всегда ориентируйтесь на последний уровень Android Api android-developers.googleblog.com/2017/12/…
Шмуэль,

1
@ Шмуэль: неправильно. Вы можете выбрать 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 из Manifest или из кода. Это решит проблему.


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

1

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


2
Пожалуйста, предоставьте любую ссылку (ссылку или цитату) при публикации ответа. Так что будущие пользователи могут легко понять. Кроме того, добро пожаловать в Сообщество SO .
Мохаммедсалим Шивани

@MohammedsalimShivani Здесь: issetracker.google.com/issues/68454482#comment4 «Наша команда разработчиков исправила эту проблему. Она будет доступна в будущем выпуске Android, поэтому, пожалуйста, следите за заметками о выпуске».
Android-разработчик

Это плохой совет
Крис

0

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

android:screenOrientation="portrait"

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>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.