it-swarm.com.de

java.lang.IllegalStateException: Nur opake Aktivitäten im Vollbildmodus können die Ausrichtung anfordern

Ich stehe vor dem Problem beim Abrufen der Kontakte aus dem Kontaktbuch in Android 8.0 Oreo Java.lang.IllegalStateException: Nur opake Aktivitäten im Vollbildmodus können die Ausrichtung anfordern

Ich versuche, den Kontakt in meiner Aktivität aus dem Telefonbuch zu erhalten, und es funktioniert perfekt für Lollipop, Marshmallow, Nougat usw. Aber es gibt mir den Fehler für Oreo. Bitte helfen Sie mir. Mein Code ist hier unten.

Demo Code: -

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");
        }
}

Fehlerprotokoll:-

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

Das Problem scheint zu bestehen, wenn das Ziel-SDK 28 ist. Nachdem also viele Optionen ausprobiert wurden, funktionierte es schließlich.

 <activity
        Android:name=".activities.FilterActivity"
        Android:theme="@style/Transparent"
        Android:windowSoftInputMode="stateHidden|adjustResize" />

stil:-

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

Hinweis: Für api 28 ist parent = "Theme.AppCompat.Light.NoActionBar" erforderlich. Hatte zuvor etwas anderes bei api 26. Hat großartig gearbeitet, aber mit 28 ..__ Problem angefangen.

13
Debasish Ghosh

In Android O und später tritt dieser Fehler bei der Einstellung auf

 Android:screenOrientation="portrait"

in Manifest.

Entfernen Sie diese Zeile und verwenden Sie

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

in deiner Tätigkeit. 

Dies wird Ihr Problem beheben.

64
Ragesh Ramesh

Google wirft diese Ausnahme für die onCreate-Methode von Activity nach v27 aus. Ihre Bedeutung ist: Wenn eine Aktivität durchscheinend oder fließend ist, sollte ihre Orientierung auf der übergeordneten Aktivität (Hintergrundaktivität) beruhen, sie kann sich nicht entscheiden. 

Selbst wenn Sie Android:screenOrientation="portrait" aus der schwebenden oder durchscheinenden Aktivität entfernen, aber die Ausrichtung auf die übergeordnete (Hintergrund-) Aktivität fixieren, wird dies immer noch vom übergeordneten Element behoben, das ich bereits getestet habe.

Eine besondere Situation: Wenn Sie eine Starteraktivität durchsichtig machen, hat sie keinen übergeordneten Hintergrund (Hintergrund). Drehen Sie sie daher immer mit dem Gerät. Um es zu beheben, müssen Sie einen anderen Weg nehmen, um den <item name="Android:windowIsTranslucent">true</item>-Stil zu ersetzen.

52
Steven Sun

In Android Oreo können Sie die Ausrichtung für Aktivitäten nicht ändern, deren Stil unterhalb der Linie liegt

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

Sie müssen zuerst entfernen unterhalb der Zeile des Manifests für diese Aktivität auswählen

Android:screenOrientation="portrait"

Zweitens müssen Sie add diese Zeile zur Java-Datei hinzufügen 

    //Android O fix bug orientation
    if (Android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }
46
Radesh

Wenn Sie eine transparente Vollbildaktivität verwenden, müssen Sie die Orientierungssperre für die Aktivität nicht angeben. Es werden die Konfigurationseinstellungen der übergeordneten Aktivität übernommen. Wenn also die übergeordnete Aktivität im Manifest steht: 

Android: screenOrientation = "Porträt"

ihre durchscheinende Aktivität hat dieselbe Orientierungssperre: Hochformat. 

23
gellyke

Ich habe Android:screenOrientation="behind" anstelle von Android:screenOrientation="portrait" verwendet. Grundsätzlich haben Sie ein Dialogfeld (in einer Aktivität) erstellt, und das Dialogfeld kann keine Ausrichtung anfordern, da dies übergeordnete Aktivität erfordert (da ein übergeordnetes Element im Hintergrund sichtbar ist und ein eigenes Layout besitzt).

"hinter" Die gleiche Ausrichtung wie die Aktivität, die sich unmittelbar im Aktivitätsstapel darunter befindet.

11
Paul

Die einzige Lösung, die wirklich funktioniert:

Veränderung:

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

zu:

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

in styles.xml

Dies kann jedoch zu Problemen mit Ihrem Begrüßungsbildschirm führen (weißer Bildschirm beim Start) ... In diesem Fall fügen Sie Ihrer styles.xml die folgende Zeile hinzu:

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

direkt unter der windowIsTranslucent-Zeile.

Letzte Chance, wenn die vorherigen Tipps nicht funktionieren: Ziel SDK 26 statt 27.

9
Regis_AG

Viele Leute haben eine Lösung gegeben, deshalb werde ich über die Ursache des Problems sprechen.

Laut Ausnahmelog:

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)

Der Code, der die Ausnahme in Activity.Java ausgelöst hat

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

Gemäß der obigen Codeanalyse wird bei Verwendung von TargetSdkVersion> = 27 bei Verwendung von SCREEN_ORIENTATION_LANDSCAPE, SCREEN_ORIENTATION_PORTRAIT und anderen zugehörigen Attributen die Verwendung von windowIsTranslucent, windowIsFloating und windowSwipeToDismiss-Themenattributen eine Ausnahme ausgelöst.

Nachdem das Problem gefunden wurde, können Sie die TargetSdkVersion ändern oder die zugehörigen Attribute des Designs gemäß Ihren Anforderungen entfernen.

9
Bingerz

Ich kann der meist bewerteten Antwort nicht zustimmen, weil 

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

verursacht einen Fehler 

Java.lang.IllegalStateException: Nur undurchsichtige Vollbildaktivitäten können Orientierung anfordern

aber das macht es für mich

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

und verwenden Sie es für Ihre Aktivität, wenn Sie aus 

InterstitialActivity extends AppCompatActivity

in AndroidManifest.xml

    <activity
        Android:name=".InterstitialActivity"
        ...
        Android:screenOrientation="portrait"
        Android:theme="@style/TranslucentTheme" />
6
hannes ach

Entfernen Sie einfach diese Zeile Android:screenOrientation="portrait" der Aktivität in Manifest.xml

Diese Aktivität erhält eine Orientierung aus der vorherigen Aktivität, so dass keine Orientierung mit <item name="Android:windowIsTranslucent">true</item> angewendet werden muss. 

5
Sanket Kachhela

es scheint, als ob das Ziel-SDK pie (API-Level 28.0) und windowIsTranslucent true ist

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

und Sie versuchen, Orientierung zuzugreifen. Das Problem ist mit Android oreo 8.0 (API-Level 26) verbunden. Es gibt zwei Möglichkeiten, dieses Problem zu lösen

  1. entfernen Sie die Ausrichtung
  2. oder setze windowIsTranslucent auf false

wenn Sie in einem solchen Manifest die Orientierung festlegen

Android:screenOrientation="portrait"

oder in einer solchen Aktivitätsklasse

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

entfernen Sie von beiden Stellen.

und beobachtet, wenn Sie windowIsTranslucent auf true setzen, wird die Orientierung von der übergeordneten Aktivität übernommen.

4
Avinash Jadaun

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

legen Sie in der Manifestdatei die zweite Aktivität parentActivityName als erste Aktivität fest und entfernen Sie den Parameter screenOrientation für die zweite Aktivität. es bedeutet, dass Ihre erste Aktivität der Elternteil ist und entscheiden Sie sich für eine Orientierung Ihrer zweiten Aktivität. 

<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

Dieses Problem trat nur in SDK 26 (8.0.0) auf, wenn windowIsTranslucent 'true' verwendet und die Ausrichtung gewaltsam festgelegt wurde:

Hier ist die Lösung:

    @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

Nach einigen Nachforschungen scheint es, dass dieses Problem auf einen Google-Fehler zurückzuführen ist. Für mich konnte ich diese Zeile in meiner Activities onCreate-Methode belassen:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

UND ich habe meine targetSdkVersion auf 26 geändert. Diese Zeile in onCreate hatte immer noch einen Absturz, während meine targetSdkVersion immer noch auf 27 festgelegt war. Da bisher noch keine Lösung für mich funktioniert hat, stellte ich fest, dass dies als temporäre Lösung für das Problem funktioniert jetzt.

2
NaturallyAsh

Ich hatte das gleiche Problem und meine Lösung bestand darin, die Leitung zu beseitigen

Android:screenOrientation="portrait"

und füge dies in die Aktivität ein:

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

Es ist ein Konflikt (Fehler) zwischen der Themes in der style.xml-Datei in Android-Versionen 7 (API-Ebenen 24,25) und 8 (API-Ebenen 26,27), wenn du. .. hast

Android:screenOrientation="portrait":ind eine bestimmte Aktivität (die abstürzt) in AndroidManifest.xml enthalten

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

in dem Design, das auf diese Aktivität in style.xml angewendet wurde

Es kann auf folgende Weise entsprechend Ihren Bedürfnissen gelöst werden:

1- Entfernen Sie eine der oben genannten Eigenschaften, die Konflikte verursachen

2- Ändern Sie die Aktivitätsausrichtung nach Bedarf in einen der folgenden Werte: unspecified oder behind usw., die Sie hier finden können: Google-Referenz für Android: screenOrientation ` 3- Stellen Sie die Ausrichtung programmatisch ein Laufzeit

2
Hamed Jaliliani

Das einzige, was für mich funktioniert hat, war die Veränderung

Android:screenOrientation="portrait"

zu

Android:screenOrientation="unspecified"

im Manifest für alle durchscheinenden Aktivitäten.

Auf diese Weise ist es mit allen API-Versionen kompatibel, da die durchscheinende Aktivität ihre Ausrichtung von der übergeordneten Aktivität ab targetApi: 28 zu erben scheint.

Der Stil kann so belassen werden, wie er <item name="Android:windowIsTranslucent">true</item> enthält.

2
Max Heimer

Wahrscheinlich zeigen Sie eine Aktivität, die wie Dialog (nicht voller Bildschirm) aussieht, entfernen Sie also screen Orientierung from Manifest oder aus Code. Dies wird das Problem beheben.

1
Balflear

dies geschah nach 27, benutze targetSdkVersion 26 ersetzen, warte, bis Google es behoben hat

1
yihang wu

Legen Sie einfach die Ausrichtung der Aktivität in Manifest.xml fest

Android:screenOrientation="unspecified"
1
Attaullah

Ich weiß nicht, ob dies ein Fehler von Google oder ein beabsichtigtes Verhalten ist, aber ich habe es (zumindest momentan) gelöst, indem ich compileSdkVersion und targetSdkVersion in Gradle auf 26 zurückgesetzt habe.

1
Seven

Wenn Sie Ihr Problem nicht gelöst haben, registrieren Sie die Anzeigenaktivität wie folgt im Manifest:

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

Sie müssen auch auf die neueste Version von SDK aktualisieren.

1
Gardax

nur 8.0.0 löst die Ausnahme aus, über 8.0 wurde die Ausnahme entfernt

 8.0.0 throw the exception

0
Mingo

Ich habe diese Fehlermeldung erhalten, als ich versuche, ein Bild aufzunehmen oder ein Bild aus der Galerie aufzunehmen

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

und

Android:screenOrientation="portrait"

jetzt verwendet meine Aktivität dieses Thema:

  <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

Ich hatte das gleiche Problem und ich habe es behoben, indem ich folgendes eingestellt habe: <item name="Android:windowIsFloating">false</item> in styles.xml

Benutzer erweitern AppCompatActivity & es wird funktionieren !!

0
Najib Puthawala

Entfernen Sie die Zeilen Ihres Designs:

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

und

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

danach fügen Sie in Ihrer Aktivität Android:screenOrientation="portrait" hinzu.

0
paul_parkbom

Benutzen

Android:screenOrientation="behind"

Und Thema

<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>
0
Mostafa Imran

Ich habe gerade die Tags "Hochformat" von den Nicht-Vollbild-Elementen entfernt und alles ist gut gelaufen.

Android:screenOrientation="portrait"
0
Victor Tavares