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

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

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

Демо-код: -

private void loadContacts() {
            contactAsync = new ContactLoaderAsync();
            contactAsync.execute();
        }

        private class ContactLoaderAsync extends AsyncTask<Void, Void, Void> {
            private Cursor numCursor;

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                Uri numContacts = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
                String[] numProjection = new String[]{ContactsContract.CommonDataKinds.Phone.CONTACT_ID, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.TYPE};
                if (android.os.Build.VERSION.SDK_INT < 11) {
                    numCursor = InviteByContactActivity.this.managedQuery(numContacts, numProjection, null, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " COLLATE NOCASE ASC");
                } else {
                    CursorLoader cursorLoader = new CursorLoader(InviteByContactActivity.this, numContacts, numProjection, null, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " COLLATE NOCASE ASC");
                    numCursor = cursorLoader.loadInBackground();
                }

            }

            @Override
            protected Void doInBackground(Void... params) {
                if (numCursor.moveToFirst()) {
                    try {
                        final int contactIdIndex = numCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID);
                        final int displayNameIndex = numCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
                        final int numberIndex = numCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
                        final int typeIndex = numCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE);
                        String displayName, number, type;
                        do {
                            displayName = numCursor.getString(displayNameIndex);
                            number = numCursor.getString(numberIndex);
                            type = getContactTypeString(numCursor.getString(typeIndex), true);
                            final ContactModel contact = new ContactModel(displayName, type, number);
                            phoneNumber = number.replaceAll(" ", "").replaceAll("\\(", "").replaceAll("\\)", "").replaceAll("-", "");

                            if (phoneNumber != null || displayName != null) {
                                contacts.add(phoneNumber);
                                contactsName.add(displayName);
                                contactsChecked.add(false);

                                filterdNames.add(phoneNumber);
                                filterdContactNames.add(displayName);
                                filterdCheckedNames.add(false);
                            }
                        } while (numCursor.moveToNext());
                    } finally {
                        numCursor.close();
                    }
                }


                Collections.sort(contacts, new Comparator<String>() {
                    @Override
                    public int compare(String lhs, String rhs) {
                        return lhs.compareToIgnoreCase(rhs);
                    }
                });

                InviteByContactActivity.this.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        mContactAdapter.notifyDataSetChanged();
                    }
                });

                return null;
            }
        }

        private String getContactTypeString(String typeNum, boolean isPhone) {
            String type = PHONE_TYPES.get(typeNum);
            if (type == null)
                return "other";
            return type;
        }

        static HashMap<String, String> PHONE_TYPES = new HashMap<String, String>();

        static {
            PHONE_TYPES.put(ContactsContract.CommonDataKinds.Phone.TYPE_HOME + "", "home");
            PHONE_TYPES.put(ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE + "", "mobile");
            PHONE_TYPES.put(ContactsContract.CommonDataKinds.Phone.TYPE_WORK + "", "work");
        }
}

Журнал ошибок:-

E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example, PID: 6573
                                                             java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example/com.example.Activity.InviteByContactActivity}: java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation
                                                              Caused by: java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation

Ответы

Ответ 1

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

Ответ 2

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

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

У вас есть два пути решения этой проблемы:

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

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

android:screenOrientation="portrait"

Затем вы должны добавить эту строку в файл Java

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

Ответ 3

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

 android:screenOrientation="portrait"

в манифесте.

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

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

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

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

Ответ 4

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

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

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

Ответ 5

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

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

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

Ответ 6

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

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

Ответ 7

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

Изменить:

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

чтобы:

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

в styles.xml

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

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

чуть ниже строки windowIsTranslucent.

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

Ответ 8

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

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

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 orientation is fixed.
        * @hide
        */
        public boolean isFixedOrientation() {
            return isFixedOrientationLandscape() || isFixedOrientationPortrait()
                    || screenOrientation == SCREEN_ORIENTATION_LOCKED;
        }
        /**
        * Returns true if the activity orientation is fixed to portrait.
        * @hide
        */
        boolean isFixedOrientationPortrait() {
            return isFixedOrientationPortrait(screenOrientation);
        }

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

Ответ 9

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

values\styles.xml для уровня API 25- (& lt; 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>

Ответ 10

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

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" />

Ответ 11

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

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

Ответ 12

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

Ответ 13

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

Ответ 14

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

android:screenOrientation="portrait"

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

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

Ответ 15

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

android:screenOrientation="unspecified"

Ответ 16

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

Ответ 17

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

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

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

Ответ 18

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

Ответ 19

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

 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>

Ответ 20

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

8.0.0 throw the exception

Ответ 21

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

android:screenOrientation="portrait"

в

android:screenOrientation="unspecified"

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

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

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

Ответ 22

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

Ответ 23

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

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

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

Ответ 24

Вероятно, вы показываете Activity, выглядящую как Dialog (не полноэкранный), поэтому удалите ScreenOrientation из манифеста или из кода. Это устранит проблему.

Ответ 25

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

Ответ 26

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

android:screenOrientation="portrait"

Ответ 27

Эта проблема решена после обновления compileSdkVersion и targetSdkVersion до 29.

Ответ 28

использование

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>

Ответ 29

Пользователь расширяет AppCompatActivity и будет работать!

Ответ 30

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

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

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