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.