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

187

Beim Abrufen der Kontakte aus dem Kontaktbuch in Android 8.0 tritt das Problem auf. Oreo java.lang.IllegalStateException: Nur undurchsichtige Vollbildaktivitäten können eine Orientierung anfordern

Ich versuche, den Kontakt in meiner Aktivität aus dem Telefonkontaktbuch zu erhalten, und es funktioniert perfekt für Lollipop, Marshmallow, Nougat usw., aber es gibt mir den Fehler für Oreo wie diesen, 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
Shubham Sejpal
quelle
Überprüfen Sie dies: stackoverflow.com/questions/6745797/…
yash786
1
Dies kann Ihnen helfen, stackoverflow.com/questions/46980697/…
Nilesh Rathod
Überprüfen Sie dies auch: stackoverflow.com/questions/46980697/…
yash786
1
Versuchte alle Vorschläge, aber niemand ist für mich gearbeitet.
Shubham Sejpal
1
Verwenden Sie Android: screenOrientation = "Porträt" im Manifest?
Ragesh Ramesh

Antworten:

62

Das Problem scheint aufzutreten, wenn Ihr Ziel-SDK 28 ist. Nachdem Sie also viele Optionen ausprobiert haben, hat dies endlich funktioniert.

<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:windowIsFloating">true</item>
     <item name="android:windowContentOverlay">@null</item>
     <item name="android:windowNoTitle">true</item>
     <item name="android:backgroundDimEnabled">false</item>
 </style>

Hinweis: parent = "Theme.AppCompat.Light.NoActionBar" wird für API 28 benötigt. Hatte zuvor etwas anderes in API 26. Hat großartig funktioniert, hat aber mit 28 angefangen, Probleme zu verursachen. Ich hoffe, es hilft jemandem hier draußen. BEARBEITEN: Für einige nur durch Setzen von <item name="android:windowIsTranslucent">false</item> and <item name="android:windowIsFloating">false</item> funktioniert. Kann davon abhängen, wie Sie die Lösung implementieren. In meinem Fall hat es funktioniert, indem Sie sie auf true setzen.

Debasish Ghosh
quelle
22
Für alle anderen, die über dieses "Update" stolpern, musste ich es einstellen <item name="android:windowIsTranslucent">false</item>und musste es auch einstellen, <item name="android:windowIsFloating">false</item>bevor es funktionieren würde.
th317erd
8
Wo genau ist die Lösung dafür? screenOrientationDas activityTag enthält kein Attribut , und das einzige, was den Absturz verursacht, wird screenOrientationgesetzt, während android:windowIsTranslucentauf true gesetzt wird.
Android-Entwickler
Dies funktioniert nur, wenn die obigen Kommentare verwendet werden. Siehe Antwort von Radesh, die Kommentare oben und mehr
abdeckt
Setzen von transluzent auf falsch Arbeit für mich <item name = "android: windowIsTranslucent"> falsch </ item>
Tran Quan
In meinem Fall bestand die Lösung darin, 'android: theme' aus der Aktivität in AndroidManifest.xml zu entfernen. Wenn Sie es benötigen, können Sie es programmgesteuert vor 'super.onCreate' hinzufügen: setTheme (R.style.Theme_AppCompat_Light_Dialog);
Pavel Kataykin
131

In Android Oreo (API 26) können Sie die Ausrichtung für Aktivitäten nicht ändern, deren Stil unter den Zeilen liegt

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

oder

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

Sie haben mehrere Möglichkeiten, dies zu lösen:

1) Sie können einfach die obigen Zeilen entfernen (oder auf false setzen ) und Ihre App funktioniert einwandfrei.

2) Oder Sie können zuerst die folgende Zeile aus dem Manifest für diese Aktivität entfernen

android:screenOrientation="portrait"

Dann müssen Sie diese Zeile zu Ihrer Aktivität hinzufügen (in onCreate ())

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

3) Sie können neue erstellen styles.xmlin values-v26Ordner und fügen Sie diese zu Ihrer style.xml. (Danke an AbdelHady Kommentar)

 <item name="android:windowIsTranslucent">false</item>
 <item name="android:windowIsFloating">false</item>
Radesh
quelle
25
unter Android PIE funktioniert dies wie erwartet. Der Scheck sollte also wirklich lauten:android.os.Build.VERSION.SDK_INT != Build.VERSION_CODES.O
Entreco
@avisper könnten Sie bitte vollständigen Zustandscode teilen
Manikandan K
In einem Gerät / Emulator API 26, Option 2 nicht funktioniert, hatte ich ein neues machen styles.xmlin values-v26zu deaktivieren android:windowIsTranslucentnur für diese API.
AbdelHady
@AbdelHady Gute Lösung, ich werde es zu meiner Antwort hinzufügen, aber überprüfen Sie Ihren Code und gut, warum Option 2 nicht funktioniert, dass meine vorgeschlagene Option,
Radesh
1
Ich habe Option 3 mit einem booleschen Wert verwendet <bool name="allowWindowFullScreenTranslucent">true</bool>und in darauf verwiesen <item name="android:windowIsTranslucent">@bool/allowWindowFullScreenTranslucent</item>. Setzen Sie es dann in styles.xml unter values-v26 auf falseund in values ​​and values-v27 auf true.
Drorsun
86

In Android O und höher tritt dieser Fehler beim Festlegen auf

 android:screenOrientation="portrait"

im Manifest.

Entfernen Sie diese Linie und verwenden Sie

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

in Ihrer Tätigkeit.

Dies wird Ihr Problem beheben.

Ragesh Ramesh
quelle
7
Es ist ein Fehler von Google-Seite. Sollte in zukünftigen Updates behoben werden. setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); verhindert, dass Ihre App in die Landschaft gelangt. Stellen Sie sicher, dass Sie dies beim Erstellen aller Ihrer Aktivitäten verwenden.
Ragesh Ramesh
44
Entfernen <item name="android:windowIsTranslucent">true</item> von meinem Stil, der von Theme.AppCompat.Light.NoActionBar für mich gearbeitet erbt .
Schattenschaf
16
Diese Lösung funktioniert, aber sie bringt mein splashScreenTheme durcheinander. Schade bei Google für häufige schlampige Roll-outs ...
Doctorram
3
"Beabsichtigt", Apps zu brechen, die auf früheren Versionen funktionierten? Dieses Ziel wurde definitiv erreicht. Zumindest haben wir eine Lösung, dank @Ragesh
Oleg Gryb
9
Das Ersetzen des Manifestattributs durch Festlegen der Ausrichtung für die Aktivitätsklasse löst das Problem nicht.
Rmgoncalo
75

Google onCreatelöst diese Ausnahme für die Methode von Activity nach Version 27 aus. Ihre Bedeutung lautet: Wenn eine Aktivität durchscheinend oder schwebend ist, sollte ihre Ausrichtung auf der übergeordneten Aktivität (Hintergrundaktivität) beruhen. Sie kann keine Entscheidung über sich selbst treffen.

Selbst wenn Sie android:screenOrientation="portrait"aus der schwebenden oder durchscheinenden Aktivität entfernen, aber die Ausrichtung auf die übergeordnete Aktivität (Hintergrundaktivität) festlegen, wird sie dennoch von der übergeordneten Aktivität behoben, die ich bereits getestet habe.

Eine besondere Situation: Wenn Sie eine Launcher-Aktivität durchscheinend machen, hat sie kein übergeordnetes Element (Hintergrund). Drehen Sie sie daher immer mit dem Gerät. Wenn Sie das Problem beheben möchten, müssen Sie einen anderen Weg einschlagen, um den <item name="android:windowIsTranslucent">true</item>Stil zu ersetzen .

Steven Sun.
quelle
2
Ich habe dieses Problem nicht auf meinem OnePlus mit Android PIE. Es ist also nicht nach v27, sondern wenn v! = 28
Entreco
Haben Sie zufällig einen Link zur Dokumentation dazu? Ich kann es nicht finden.
Shivam Verma
Das durchscheinende Problem ist wirklich verrückt, danke, es behebt mein Problem
Abhishek Garg
Vielen Dank, dass Sie den letzten Abschnitt 'Eine besondere Situation ...'
guy_m
Dies sollte die akzeptierte Antwort sein. Macht perfekt Sinn!
stoefln
28

Wenn Sie eine transparente Vollbildaktivität verwenden, muss die Orientierungssperre für die Aktivität nicht angegeben werden. Es werden die Konfigurationseinstellungen der übergeordneten Aktivität übernommen. Wenn also die übergeordnete Aktivität im Manifest enthalten ist:

android: screenOrientation = "Porträt"

Ihre durchscheinende Aktivität hat dieselbe Orientierungssperre: Porträt.

Gellyke
quelle
Ich denke, Sie haben einen kleinen Tippfehler gemacht: sollte lauten: "Wenn Sie eine durchscheinende Vollbildaktivität verwenden , wird die Konfigurationseinstellung der übergeordneten Aktivität übernommen" ^^
Josselin
2
Was ist, wenn meine transparente Aktivität meine Launcher-Aktivität ist (dh
Begrüßungsbildschirm
2
Gilt das für alle Android-Versionen? Oder ist es nur Android O und höher?
Abhiank
Dies wird nicht funktionieren, wenn dies die einzige Aktivität ist, die verwendet wird (Beispiel: Starten von einem Dienst)
Android-Entwickler
24

Ich habe android:screenOrientation="behind"statt verwendet android:screenOrientation="portrait". Grundsätzlich haben Sie ein Dialogfeld (in einer Aktivität) erstellt, und das Dialogfeld kann keine eigene Orientierung anfordern. Dazu ist eine übergeordnete Aktivität erforderlich (da ein übergeordnetes Element im Hintergrund sichtbar ist und ein eigenes Layout hat).

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

Paul
quelle
Was ist, wenn die von mir erstellte Aktivität transparent sein soll und zeigt, was sich darunter befindet (einschließlich anderer Apps), während gleichzeitig die aktuelle Ausrichtung beibehalten wird? Wenn ich es "zurückbleiben" lasse, kann es in verschiedenen Fällen immer noch die Ausrichtung ändern ...
Android-Entwickler
19

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 einem Problem mit Ihrem Begrüßungsbildschirm führen (weißer Bildschirm beim Start) ... Fügen Sie in diesem Fall die folgende Zeile zu Ihrer styles.xml hinzu:

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

direkt unter der windowIsTranslucent-Linie.

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

Regis_AG
quelle
1
Das Ändern des Ziel-SDK auf 26 statt 27 hat bei mir funktioniert. Das Ändern von windowIsTranslucent hat dies nicht getan.
Cliche818
Dies funktionierte bei mir mit targetSDK: 27. Dies ist besonders wichtig, da ich einen Begrüßungsbildschirm konfiguriert hatte.
Leonardo G.
18

Wenn Sie verwenden müssen setRequestedOrientation(), gibt es keine andere Möglichkeit, als das Attribut windowIsTranslucent unter Android 8.0 zu opfern

values\styles.xml für API-Level 25- (<8,0)

<style name="Base.Theme.DesignDemo" parent="Base.Theme.AppCompat.Light">
        ...
        <item name="android:windowIsTranslucent">true</item>
        ...
    </style>

values-v26\styles.xml für API-Level 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 für API Level 27+ (> 8,0)

<style name="Base.Theme.DesignDemo" parent="Base.Theme.AppCompat.Light">
    ...
    <item name="android:windowIsTranslucent">true</item>
    ...
</style>
Leigo
quelle
14

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

Laut Ausnahmeprotokoll:

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 löst die Verwendung der Themenattribute windowIsTranslucent, windowIsFloating und windowSwipeToDismiss bei Verwendung von SCREEN_ORIENTATION_LANDSCAPE, SCREEN_ORIENTATION_PORTRAIT und anderen verwandten Attributen eine Ausnahme aus, wenn TargetSdkVersion> = 27 ist.

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

Bingerz
quelle
1
Wenn Sie den Code auf dem Master in diesem Moment überprüfen, wird er bereits aus dem Framework entfernt: Mirror / platform_frameworks_base / commit / e83f34cde79c51efb66f31f2770c2e8e572e96db # diff-a9aa0352703240c8ae70f1c83add4bc8 Es ist interessant, die Commit-Nachricht zu sehen.
Erick M. Sprengel
Können Sie bitte einen Link zum Quellcode dieses Teils anzeigen? Gibt es eine Problemumgehung, die es mir ermöglicht, eine Aktivität mit einer bestimmten Ausrichtung UND einem transparenten Hintergrund zu erstellen, damit Sie sehen können, was dahinter steckt (einschließlich anderer Apps)?
Android-Entwickler
8

Ich kann der am besten bewerteten Antwort nicht zustimmen, weil

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

verursacht einen Fehler

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

aber das macht es für mich funktioniert

<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 von verlängern

InterstitialActivity extends AppCompatActivity

in AndroidManifest.xml

    <activity
        android:name=".InterstitialActivity"
        ...
        android:screenOrientation="portrait"
        android:theme="@style/TranslucentTheme" />
hannes ach
quelle
<item name = "android: windowIsTranslucent"> false </ item> <item name = "android: windowFullscreen"> true </ item> => Dies hat es für mich unter Android 8.0 behoben. Ich könnte screenOrientation immer noch im Manifest belassen.
Frank
1
Dies funktioniert nicht wie windowIsTranslucent, da Sie jetzt nicht sehen können, was sich hinter der Aktivität verbirgt.
Android-Entwickler
8

Entfernen Sie einfach diese android:screenOrientation="portrait"Aktivitätszeile in Manifiest.xml

Diese Aktivität wird von der vorherigen Aktivität orientiert, sodass keine Orientierung angewendet werden muss <item name="android:windowIsTranslucent">true</item>.

Sanket Kachhela
quelle
Was ist, wenn die vorherige Aktivität eine andere Ausrichtung hat als die aktuelle Aktivität?
ClassA
6

es scheint, wenn das Ziel sdk pie ist (API-Level 28.0) und windowIsTranslucent wahr ist

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

und Sie versuchen, auf die Orientierung zuzugreifen. Problem kommt mit Android Oreo 8.0 (API Level 26) Es gibt zwei Möglichkeiten, um dies zu lösen

  1. Entfernen Sie die Ausrichtung
  2. oder setzen Sie windowIsTranslucent auf false

wenn Sie die Ausrichtung in einem solchen Manifest festlegen

android:screenOrientation="portrait"

oder in einer Aktivitätsklasse wie dieser

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

an beiden Stellen entfernen.

und beobachtet, wenn Sie windowIsTranslucent auf true setzen, orientiert es sich an der übergeordneten Aktivität.

Avinash Jadaun
quelle
5

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. Dies bedeutet, dass Ihre erste Aktivität der Elternteil ist und Sie sich für eine Ausrichtung Ihrer zweiten Aktivität entscheiden.

<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" />
mustafa.ertrk
quelle
5

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

android:screenOrientation="unspecified"

ODER für auf Porträtorientierung beschränkt

Sie können auch in Aktivität, In onCreateMethodenaufruf vor super.onCreate(...)z

@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);
}
Attaullah
quelle
4

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

android:screenOrientation="portrait"

und fügen Sie dies dann in die Aktivität ein:

if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
jrivas
quelle
1
Bitte verwenden Sie Englisch für den Stapelüberlauf. Vielen Dank!
Michael Myers
3

Nach einigen Recherchen scheint dieses Problem auf einen Google-Fehler zurückzuführen zu sein. Für mich konnte ich diese Zeile in meiner Activities onCreate-Methode belassen:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

UND ich habe meine targetSdkVersion in 26 geändert. Wenn diese Zeile in onCreate vorhanden war, kam es immer noch zu einem Absturz, während meine targetSdkVersion noch auf 27 festgelegt war. Da bisher keine andere Lösung für mich funktioniert hat, stellte ich fest, dass dies als vorübergehende Lösung für funktioniert jetzt.

NatürlichAsh
quelle
1
Dieser hat für mich funktioniert, indem targetSdkVersion auf 26 gesetzt wurde, android: screenOrientation = "Porträt" und <item name = "android: windowIsTranslucent"> true </ item>
siripan
@ Siripan auch für mich
Acauã Pitta
Aber irgendwann müssen Sie die targetSdkVersion in diesem Jahr auf 28 setzen: support.google.com/googleplay/android-developer/answer/… . Was wirst du machen?
Android-Entwickler
3

Es ist ein Konflikt (Fehler) zwischen Themen in der Datei style.xml in Android-Versionen 7 (API-Level 24,25) und 8 (API-Level 26,27), wenn Sie haben

android:screenOrientation="portrait" : innerhalb einer bestimmten Aktivität (die abstürzt) in AndroidManifest.xml

&

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

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

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

1- Entfernen Sie eine der oben genannten Eigenschaften, die zu Konflikten führen

2- Ändern Sie die Aktivitätsorientierung nach Bedarf in einen dieser Werte: unspecifiedoder behindso weiter. Diese finden Sie hier: Google-Referenz für Android: screenOrientation `

3- Stellen Sie die Ausrichtung programmgesteuert zur Laufzeit ein

Hamed Jaliliani
quelle
Versuchte diese Lösung, aber die App stürzt immer noch ab: Ich benötige eine transparente Porträtaktivität, daher benötige ich beide Optionen. Versucht, in Manifest ScreenOrientation nicht angegeben, aber kein Glück.
anber
Nein. Ich habe versucht, die Ausrichtung im Manifest zu entfernen und die Aktivität im Vollbildmodus anzuzeigen, aber sie stürzt immer noch ab. Nur auf 1 Gerät - Ehre 9 Lite. Bei Samsung funktioniert es einwandfrei.
Anber
Das programmgesteuerte Einstellen der Ausrichtung führt ebenfalls zum Absturz. Wie hast du es genau benutzt?
Android-Entwickler
@androiddeveloper Wie kann ich auf Ihren Quellcode zugreifen?! Ich muss sehen, was Sie getan haben
Hamed Jaliliani
@HamedJaliliani Die Programmierung ist wie folgt: `setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);`
Android-Entwickler
3

Ich habe mich kürzlich dem Problem gestellt und hier ist die Lösung.

Sie müssen den Bildschirmausrichtungsparameter, den Sie in der Android-Manifestdatei festgelegt haben, nicht ändern.

Fügen Sie einfach zwei Ordner hinzu

res>values
as  res>values-v26 
and res>values-v27

Kopieren Sie dann dort Ihre Datei styles.xml und themes.xml.

und ändern Sie die folgenden Parameter von TRUE in FALSE.

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

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

Es wird klappen.

Ein häufiger Fehler von Android 8.0

MD. Shafiul Alam Biplob
quelle
2

Ich habe dieses Problem nur in SDK 26 (8.0.0) festgestellt, wenn windowIsTranslucent 'true' verwendet und die Ausrichtung mit Nachdruck 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>
Hamza Khan
quelle
Aber dann verlieren Sie die Funktionalität, die Ausrichtung tatsächlich auf das einzustellen, was Sie wollten.
Android-Entwickler
2

Ich habe diesen Fehler erhalten, als ich versuchte, ein Bild aufzunehmen oder ein Bild aus der Galerie aufzunehmen. Bei mir funktioniert es, beide zu entfernen

 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>
Nouman Ch
quelle
Dies funktioniert nicht, da es windowIsFloatingden gleichen Absturz wie verursacht windowIsTranslucent.
Android-Entwickler
2

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

8.0.0 die Ausnahme auslösen

Mingo
quelle
Android 7, 7.1, 8.0, 8.1 haben alle dieses Problem
Hamed Jaliliani
appInfo.targetSdkVersion > Owerfen Sie die Ausnahme
Mingo
Es überprüft die targetSDK-Version. Es spielt keine Rolle, welche SDK-Version das Gerät tatsächlich ausführt. Sie kompilieren gegen Android O (28), befolgen jedoch nicht die Konventionen dieser Version der Plattform.
Benjiko99
2

Das einzige, was für mich funktioniert hat, war sich zu ändern

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 zu erben scheint targetApi: 28 .

Der Stil kann unverändert bleiben <item name="android:windowIsTranslucent">true</item>.

Max Heimer
quelle
Versuchte diese Lösung, aber App stürzt immer noch ab
anber
Aber dann verlieren Sie die Funktion zum Einstellen der Ausrichtung
Android-Entwickler
@androiddeveloper: So wie ich es verstehe, wird die Ausrichtung von der übergeordneten Aktivität übernommen. Wenn Sie explizit eine andere Ausrichtung auf die durchscheinende Aktivität festlegen möchten, die auf diese Weise nicht funktionieren würde ...
Max Heimer
Manchmal können Sie die vorherige Aktivität nicht kontrollieren. Manchmal möchten Sie Ihre transparente über dem anzeigen, was der Benutzer gerade sieht. Das kann also nicht helfen :(
Android-Entwickler
2

Verwenden

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>
Mostafa Imran
quelle
1

Ich weiß nicht, ob dies ein Fehler von Google oder ein beabsichtigtes Verhalten ist, aber ich habe ihn (zumindest vorübergehend) behoben, indem ich compileSdkVersion und targetSdkVersion in Gradle wieder auf 26 geändert habe ...

Sieben
quelle
3
Sie sollten das Targetsdk-Level nicht senken. Ihre App wird schließlich aus dem Play Store gesperrt. Zielen Sie
Shmuel
1
@Shmuel: falsch. Sie können auf 26 zielen und auf 28 im Geschäft verfügbar sein.
Regis_AG
1
Richtig, ich schrieb 'irgendwann', wenn Sie Ihre App auf ein älteres API-Level ausrichten, werden Sie in einer Welt voller Schmerzen sein, wenn Sie gezwungen sind, ein Update
durchzuführen
Dies ist keine Lösung, sondern eine Problemumgehung. Eines Tages müssen Sie Ihre App auf 28 und damit migrieren!
Sud007
1

Wenn Sie Ihr Problem nicht gelöst haben, registrieren Sie die Anzeigenaktivität einfach 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 des SDK aktualisieren.

Gardax
quelle
1

Wahrscheinlich sehen Sie eine Aktivität, die wie ein Dialog aussieht (nicht im Vollbildmodus). Entfernen Sie daher screenOrientation aus dem Manifest oder aus dem Code. Dies wird das Problem beheben.

Balflear
quelle
Hmm sehr seltsam, für mich war das der Fall. Versuchen Sie, die App auf verschiedenen Android-Versionen
auszuführen
1

Dies geschah nach 27, verwenden Sie targetSdkVersion 26 ersetzen, warten Sie, bis Google es behoben hat

yihang wu
quelle
2
Bitte geben Sie beim Veröffentlichen einer Antwort einen Verweis (Link oder Zitat) an. So können zukünftige Benutzer leicht verstehen. Willkommen auch in der SO Community .
Mohammedsalim Shivani
@MohammedsalimShivani Hier: issuetracker.google.com/issues/68454482#comment4 "Unser Engineering-Team hat dieses Problem behoben. Es wird in einer zukünftigen Android-Version verfügbar sein. Bitte beachten Sie die Versionshinweise ."
Android-Entwickler
Dies ist ein schlechter Rat
Chris
0

Ich habe gerade die Tags "Porträt" aus den Nicht-Vollbild-Elementen entfernt und alles ging gut.

android:screenOrientation="portrait"
Victor Tavares
quelle
0

Bitte überprüfen Sie den Stil Ihrer Aktivität und stellen Sie sicher, dass Sie den Stil ändern, wenn Sie keine durchscheinenden Dinge verwenden. Damit wir dieses Problem beheben können.

android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
Sreedhar
quelle
0

Ich habe dieses Problem behoben, indem android:screenOrientation="portrait"ich den folgenden Code entfernt und in mein onCreate eingefügt habe

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

während meine Themeneigenschaften sind

<item name="android:windowIsTranslucent">true</item>
<item name="android:windowDisablePreview">true</item>
Waheed Nazir
quelle