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>
Radesh
источник
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 = "портрет"

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

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

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

Bingerz
источник
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" />
mustafa.ertrk
источник
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);
}
Attaullah
источник
4

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

android:screenOrientation="portrait"

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

if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
jrivas
источник
1
Пожалуйста, используйте английский язык при переполнении стека. Спасибо!
Майкл Майерс
3

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

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

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

NaturallyAsh
источник
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

MD. Шафиул Алам Биплоб
источник
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 скинуть исключение

Mingo
источник
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.

Gardax
источник
1

Вероятно, вы показываете Activity, похожую на Dialog (не полноэкранный режим ), поэтому удалите screenOrientation из Manifest или из кода. Это решит проблему.

Balflear
источник
Хм, очень странно, для меня это было так. Попробуйте запустить приложение на разных версиях 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"
SREEDHAR
источник
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>
Вахид Назир
источник