it-swarm.com.ru

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

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

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

Демо-код: -

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

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

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

            }

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

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

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


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

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

                return null;
            }
        }

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

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

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

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

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

Кажется, проблема возникает, когда вашей целевой 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:windowContentOverlay">@null</item>
        <item name="Android:windowNoTitle">true</item>
        <item name="Android:windowIsFloating">true</item>
        <item name="Android:backgroundDimEnabled">false</item>
    </style>

Примечание: parent = "Theme.AppCompat.Light.NoActionBar" необходим для api 28. Ранее в api 26. было что-то еще. Работал замечательно, но начал создавать проблемы в 28 .... Надеюсь, это кому-то поможет.

13
Debasish Ghosh

В Android O и более поздних версиях эта ошибка возникает при установке

 Android:screenOrientation="portrait"

в манифесте.

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

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

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

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

64
Ragesh Ramesh

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

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

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

52
Steven Sun

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

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

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

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);
    }
46
Radesh

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

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

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

23
gellyke

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

«сзади» Та же ориентация, что и у действия, которое находится непосредственно под ним в стеке действий.

11
Paul

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

Правка:

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

чтобы:

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

в styles.xml

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

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

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

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

9
Regis_AG

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

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

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

9
Bingerz

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

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" />
6
hannes ach

Просто удалите эту строку Android:screenOrientation="portrait" активности в Manifest.xml

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

5
Sanket Kachhela

values-v26create styles.xml (v26) 

<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>
3
leigo

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

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

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

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

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

2
NaturallyAsh

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

Android:screenOrientation="portrait"

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

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

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

2
Hamed Jaliliani

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

Android:screenOrientation="portrait"

в

Android:screenOrientation="unspecified"

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

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

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

2
Max Heimer

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

1
Balflear

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

1
yihang wu

Просто установите ориентацию деятельности в Manifest.xml

Android:screenOrientation="unspecified"
1
Attaullah

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

1
Seven

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

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

Вы также должны обновить до последней версии SDK.

1
Gardax

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

 8.0.0 throw the exception

0
Mingo

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

 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>
0
Nouman Ch

Расширение пользователя AppCompatActivity и это будет работать !!

0
Najib Puthawala

Попробуйте удалить строки вашей темы:

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

а также

<item name="Android:windowIsFloating">true</item>

после этого добавьте Android:screenOrientation="portrait" в свою деятельность.

0
paul_parkbom