java.lang.IllegalStateException: Лише непрозорі дії на повноекранному екрані можуть запитувати орієнтацію


187

Я зіткнувся з проблемою під час пошуку контактів із книги контактів в 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


1
це може допомогти вам stackoverflow.com/questions/46980697/…
— Nilesh Rathod

перевірити це , а також: stackoverflow.com/questions/46980697 / ...
— yash786

1
Спробував усі пропозиції, але на мене ніхто не працює.
— Shubham Sejpal

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. Сподіваюся, це допомагає комусь тут. EDIT: Для деяких лише встановлення <item name="android:windowIsTranslucent">false</item> and <item name="android:windowIsFloating">false</item> працюю. Можливо, це залежить від способу роботи рішення. У моєму випадку це спрацювало, встановивши їх на true.


22
Кожному, хто натрапляє на це "виправлення", я повинен був встановити, <item name="android:windowIsTranslucent">false</item>а також повинен був налаштуватись, <item name="android:windowIsFloating">false</item>перш ніж він спрацює.
— th317erd

8
Де саме є рішення цього? У тегу немає screenOrientationатрибута activity, і єдине, що спричиняє збій, - screenOrientationце встановлення, коли android:windowIsTranslucentвоно встановлено на true.
— андроїд розробник

Це не працює, якщо не будуть використані коментарі вище. Дивіться відповідь Радеша, яка висвітлює коментарі вище, та інше, і зрозуміло
— arberg

Налаштування для мене прозорого фальшивого твору <item name = "android: windowIsTranslucent"> false </item>
— Tran Quan

У моєму випадку рішення полягало в тому, щоб видалити "android: topic" з Активності в 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) Ви можете просто видалити вище рядки (або перетворити їх на помилкові ), і ваш додаток працює нормально.

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 під значеннями-v26 встановіть його в, falseа в значеннях і значеннях-v27 встановіть його true.
— drorsun

86

В Android O і пізніше ця помилка трапляється під час встановлення

 android:screenOrientation="portrait"

в Маніфесті.

Видаліть цей рядок і використовуйте

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

у вашій діяльності.

Це вирішить вашу проблему.


7
Помилка з боку Google. Потрібно виправити в майбутніх оновленнях. setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); обмежить ваш додаток не потрапляти в пейзаж. Переконайтеся, що ви використовуєте це для створення всіх своїх заходів.
— Рагеш Рамеш

44
Вилучення <item name="android:windowIsTranslucent">true</item> зі свого стилю, який успадковується від Theme.AppCompat.Light.NoActionBar працюваного для мене.
— тінь

16
Це рішення працює, але воно псує мою splashScreenTheme. Ганьба в Google за часті
— неохайні розкрутки

3
"Намір" зламати додатки, які працювали на попередніх версіях? Ця мета була безумовно досягнута. Принаймні, у нас є рішення, завдяки @Ragesh
— Олегу Грибу

9
Заміна атрибута маніфесту шляхом встановлення орієнтації на клас діяльності не вирішує проблему.
— rmgoncalo

75

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

Навіть якщо ви видаляєте android:screenOrientation="portrait"з плаваючої або напівпрозорої діяльності, але фіксуєте орієнтацію на її батьківську (фонову) активність, вона все одно виправлена ​​батьківською, я вже перевірив.

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


2
У мене немає такої проблеми на моєму OnePlus під керуванням Android PIE. Тож не після v27, а коли v! = 28
— Entreco

Чи трапляється у вас посилання на документацію для цього? Я не можу його знайти.
— Шивам Верма

напівпрозора проблема справді божевільна, спасибі, вона вирішує мою проблему
— Абхішек Гарг

Дякую, що
— відмітили

Це має бути прийнятою відповіддю. Має ідеальний сенс!
— stoefln

29

Якщо ви використовуєте прозору активність на повноекранному екрані, не потрібно вказувати блокування орієнтації на активність. Це займе налаштування конфігурації батьківської діяльності. Тож якщо батьківська активність має в маніфесті:

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

ваша напівпрозора активність матиме той самий замок орієнтації: портрет.


Я думаю, ви зробили невелику помилку: має бути "якщо ви використовуєте наскрізну прозору активність на повноекранному екрані, вона прийме налаштування конфігурації батьківської активності" ^^
— Josselin

2
Що робити, якщо моя прозора активність - це моя пускова діяльність (тобто екран заставки)
— Bhupesh

2
Це правда для всіх версій Android? Або це лише Android O і вище?
— abhiank

Це не спрацює, якщо це єдина активність, яка використовується (наприклад: запуск із сервісу)
— андроїд розробник

24

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

"позаду" та ж орієнтація, що і діяльність, що знаходиться безпосередньо під нею у степі активності.


Що робити, якщо я хочу, щоб діяльність, яку я створив, була прозорою, показуючи, що знаходиться під нею (включаючи інші програми), а також залишатись за поточною орієнтацією? Якщо я дозволю йому залишитися «позаду», він все одно може змінити орієнтацію на різні випадки ...
— android developer

19

Єдине рішення, яке дійсно працює:

Змінити:

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

до:

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

в styles.xml

Але це може спричинити проблему з вашим splashscreen (білий екран при запуску) ... У цьому випадку додайте наступний рядок до стилів.xml:

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

прямо під вікномIsTranslucent.

Останній шанс, якщо попередні поради не спрацюють: націліть SDK 26, а не 27.


1
Зміна цільового SDK на 26 замість 27 працювала для мене. Зміна вікнаIsTranslucent не зробила.
— 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
Перевіряючи код головного моменту в цей момент, він уже видалений з фреймворку: дзеркало / платформа_frameworks_base / commit / e83f34cde79c51efb66f31f2770c2e8e572e96db # diff-a9aa0352703240c8ae70f1c83add4bc8 Цікаво побачити повідомлення комісії.
— Ерік М. Шпренгель

Чи можете ви, будь ласка, показати посилання на вихідний код цієї частини? Чи є якесь вирішення, яке дозволить мені мати діяльність з певною орієнтацією І мати прозорий фон, щоб можна було побачити, що за ним (у тому числі й інші додатки)?
— андроїд розробник

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. Я все-таки могла залишити екранізовану орієнтацію в маніфесті.
— Френк

1
Це не працює так само, як windowIsTranslucent, тому що зараз ви не можете бачити, що за активністю.
— андроїд розробник

8

Просто видаліть цей напрямок android:screenOrientation="portrait"діяльності в Manifiest.xml

Ця діяльність отримає орієнтацію від її попередньої діяльності, тому не потрібно застосовувати орієнтацію, яка є <item name="android:windowIsTranslucent">true</item>.


Що робити, якщо попередня діяльність має іншу спрямованість, яку ви хочете в поточній діяльності?
— ClassA

6

здається, коли цільовим 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);

видаліть з обох місць.

і спостерігається, коли u встановлює вікноIsTranslucent на істинне, воно бере орієнтацію від батьківської діяльності.


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

Просто встановіть орієнтацію діяльності в Manifiest.xml

android:screenOrientation="unspecified"

АБО для обмеженої портретної орієнтації

Ви також можете використовувати в Activity, In onCreatecall call раніше, 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
Будь ласка, використовуйте англійську мову на стеку Overflow. Дякую!
— Майкл Майерс

3

Провівши деякі дослідження, здається, що ця проблема може бути пов’язана з помилкою в Google. Для мене мені вдалося залишити цей рядок у моєму методі Activity onCreate:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

І я змінив targetSdkVersion на 26. Наявність цього рядка в моєму onCreate все ще призвело до збою, тоді як мій targetSdkVersion все ще був встановлений на 27. Оскільки досі жодне рішення для мене не працювало, я виявив, що це працює як тимчасове виправлення для зараз.


1
Цей для мене працював, встановивши targetSdkVersion на 26, android: screenOrientation = "портрет" і <елемент імені = "android: windowIsTranslucent"> true </item>
— siripan

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

Але з часом вам доведеться встановити targetSdkVersion до 28 цього року: support.google.com/googleplay/android-developer/answer/… . Що ти робитимеш?
— андроїд розробник

3

Це конфлікт (помилка) між файлом Themes inside 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- Встановіть орієнтацію програмно на час виконання


Спробував це рішення, але додаток все одно виходить з ладу: мені потрібна прозора портретна діяльність, тому мені потрібні обидва варіанти. Спробували встановити в маніфестному екраніОрієнтацію не визначено, але не пощастило.
— anber

Ні. Я намагався взагалі видалити орієнтацію в маніфесті та зробити повноекранний режим діяльності, але він все одно виходить з ладу. Тільки на 1 пристрої - честь 9 літ. На Samsung це працює нормально.
— anber

Встановлення орієнтації програмно також спричиняє збій. Як ти саме ним користувався?
— андроїд розробник

@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>

Але тоді ви втрачаєте функціональність, фактично маючи орієнтацію на те, що хотіли.
— андроїд розробник

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.
— андроїд розробник

2

виключення лише 8.0.0, виняток - вище 8.0

8.0.0 киньте виняток


У Android 7, 7.1, 8.0, 8.1 є ця проблема
— Хамед Джаліліані

appInfo.targetSdkVersion > Oкиньте виняток
— Mingo

Її перевірка targetверсії sdk. Не має значення, якою версією sdk працює пристрій, ви збираєтесь на Android O (28), але не дотримуєтесь конвенцій цієї версії платформи.
— Benjiko99

2

Єдине, що для мене працювало, - це змінилося

android:screenOrientation="portrait"

до

android:screenOrientation="unspecified"

в маніфесті для всіх напівпрозорих видів діяльності.

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

Стиль можна залишити як у тому числі <item name="android:windowIsTranslucent">true</item>.


Намагалися це рішення, але додаток все ще падає
— Anber

Але тоді ви втрачаєте функцію налаштування орієнтації
— андроїд розробник

@androiddeveloper: Наскільки я розумію це, орієнтація буде успадкована від батьківської діяльності. Якщо ви хочете чітко встановити іншу орієнтацію на напівпрозору діяльність, яка б не працювала таким чином ...
— Макс Хеймер

Іноді ви не можете контролювати попередню діяльність. Іноді ви хочете показати свій прозорий поверх того, що бачить зараз користувач. Тож це не може допомогти :(
— андроїд розробник

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-версії Android Api на android-developers.googleblog.com/2017/12/…
— Шмуель

1
@Shmuel: неправильно. Ви можете орієнтуватися на 26 та бути доступними 28 у магазині.
— Regis_AG

1
Правильно, я написав "врешті-решт", якщо ви створите свою програму, орієнтовану на старіший рівень api, ви потрапите в світ болю, коли вас змусять оновити
— Шмуель,

Це не рішення, а обхід. Одного разу вам доведеться перенести додаток до 28, а значить!
— sud007

1

Якщо ви не вирішили свою проблему, просто зареєструйте рекламну активність у маніфесті так:

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

Вам також потрібно оновити до останньої версії sdk.


1

Можливо, ви показуєте Діяльність схожа на Діалог ( неповноекранний ), тому видаліть екран Орієнтацію з Manifest або з коду. Це виправить проблему.


Хм, дуже дивно, для мене це було так. Спробуйте запустити додаток на різних версіях Android, подивіться, який результат це може допомогти вам ...
— Balflear

1

це сталося після 27, використовуйте заміну targetSdkVersion 26, чекайте, коли Google виправить це


2
Будь ласка, надайте будь-яку посилання (посилання чи цитування), коли публікуєте відповідь. Тож майбутні користувачі можуть легко зрозуміти. Також ласкаво просимо до спільноти SO .
— Мухаммедсалім Шивані

@MohammedsalimShivani Ось: issueetracker.google.com/isissue/68454482#comment4 "Наша інженерна команда виправила цю проблему. Вона буде доступна в майбутній версії 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.