java.lang.IllegalStateException: seules les activités opaques en plein écran peuvent demander une orientation


200

Je suis confronté au problème lors de la récupération des contacts du carnet de contacts dans Android 8.0 Oreo java.lang.IllegalStateException: seules les activités opaques en plein écran peuvent demander une orientation

J'essaie d'obtenir le contact dans mon activité à partir du répertoire téléphonique et cela fonctionne parfaitement pour Lollipop, Marshmallow, Nougat, etc. mais cela me donnera l'erreur pour Oreo comme ça, aidez-moi. Mon code est ci-dessous.

Code démo: -

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

Journal des erreurs: -

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
J'ai essayé toutes les suggestions mais personne n'a travaillé pour moi.
Shubham Sejpal

1
utilisez-vous android: screenOrientation = "portrait" dans le manifeste?
Ragesh Ramesh

Réponses:


66

Le problème semble se produire lorsque votre SDK cible est de 28. Donc, après avoir essayé de nombreuses options, cela a finalement fonctionné.

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

style:-

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

Remarque: parent = "Theme.AppCompat.Light.NoActionBar" est nécessaire pour l'api 28. Auparavant, il y avait autre chose à api 26. Cela fonctionnait très bien mais a commencé à poser problème à 28. J'espère que cela aide quelqu'un ici. EDIT: Pour certains seulement en définissant <item name="android:windowIsTranslucent">false</item> and <item name="android:windowIsFloating">false</item> travaillé.Peut-être dépend de la façon dont vous implémentez la solution fonctionne.Dans mon cas, cela a fonctionné en les mettant à true


24
À toute autre personne qui tombe sur ce "correctif", je devais régler <item name="android:windowIsTranslucent">false</item>et aussi définir <item name="android:windowIsFloating">false</item>avant que cela fonctionne.
th317erd

8
Où est exactement la solution à cela? Il n'y a pas d' screenOrientationattribut dans la activitybalise, et la seule chose qui cause le plantage est en screenOrientationcours de définition alors qu'elle android:windowIsTranslucentest définie sur true.
développeur android

Cela ne fonctionne pas, sauf si les commentaires ci-dessus sont utilisés. Voir la réponse de Radesh, qui couvre les commentaires ci-dessus, et plus, et est claire
arberg

Définir translucide à faux fonctionne pour moi <item name = "android: windowIsTranslucent"> false </item>
Tran Quan

Dans mon cas, la solution était de supprimer «android: thème» de l'activité dans AndroidManifest.xml. Mais si vous en avez besoin, vous pouvez l'ajouter par programme avant 'super.onCreate': setTheme (R.style.Theme_AppCompat_Light_Dialog);
Pavel Kataykin

147

Dans Android Oreo (API 26), vous ne pouvez pas changer l'orientation des activités qui ont une ou plusieurs lignes en dessous de style

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

ou

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

Vous avez plusieurs façons de résoudre ce problème:

1) Vous pouvez simplement supprimer la (les) ligne (s) ci-dessus (ou la définir sur false ) et votre application fonctionne correctement.

2) Ou vous pouvez d'abord supprimer la ligne ci-dessous du manifeste pour cette activité

android:screenOrientation="portrait"

Ensuite, vous devez ajouter cette ligne à votre activité (dans onCreate ())

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

3) Vous pouvez créer styles.xmldans le values-v26dossier et l' ajouter à votre style.xml. (Merci au commentaire d' AbdelHady )

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

25
sur Android PIE, cela fonctionne comme prévu. Donc le chèque devrait vraiment être:android.os.Build.VERSION.SDK_INT != Build.VERSION_CODES.O
Entreco

@avisper pourriez-vous s'il vous plaît partager le code de condition complet
Manikandan K

Dans un dispositif / émulateur API en cours d' exécution 26, l' option 2 ne fonctionne pas, je devais faire un nouveau styles.xmldans values-v26de désactiver android:windowIsTranslucentpour cette API uniquement.
AbdelHady

@AbdelHady Bonne solution, je l'ajouterai à ma réponse, mais vérifiez votre code et bien pourquoi l'option 2 ne fonctionne pas, cette option suggérée,
Radesh

1
J'ai utilisé l'option 3 avec une valeur booléenne <bool name="allowWindowFullScreenTranslucent">true</bool>et y ai fait référence <item name="android:windowIsTranslucent">@bool/allowWindowFullScreenTranslucent</item>. Ensuite, dans styles.xml sous values-v26, définissez-le sur falseet dans values ​​et values-v27 définissez-le sur true.
drorsun

91

Dans Android O et versions ultérieures, cette erreur se produit lorsque vous définissez

 android:screenOrientation="portrait"

dans Manifest.

Supprimez cette ligne et utilisez

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

dans votre activité.

Cela résoudra votre problème.


7
C'est un bug du côté de Google. Devrait être corrigé dans les futures mises à jour. setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); empêchera votre application d'entrer dans le paysage. Assurez-vous de l'utiliser pour créer toutes vos activités.
Ragesh Ramesh

45
Retirer <item name="android:windowIsTranslucent">true</item> de mon style qui hérite de Theme.AppCompat.Light.NoActionBar travaillé pour moi.
shadowsheep

16
Cette solution fonctionne, mais elle gâche mon splashScreenTheme. Honte à Google pour les déploiements fréquents et bâclés ...
doctorram

3
"Destiné" à casser les applications qui fonctionnaient sur des versions antérieures? Cet objectif a été définitivement atteint. Au moins, nous avons une solution, grâce à @Ragesh
Oleg Gryb

9
Le remplacement de l'attribut manifest en définissant l'orientation sur la classe Activity ne résout pas le problème.
rmgoncalo

76

Google lève cette exception sur la onCreateméthode Activity après la version 27, leur signification est: si une activité est translucide ou flottante, son orientation doit être basée sur l'activité parent (arrière-plan), ne peut pas prendre de décision sur elle-même.

Même si vous supprimez android:screenOrientation="portrait"de l'activité flottante ou translucide mais que vous fixez l'orientation sur son activité parent (arrière-plan), elle est toujours fixée par le parent, j'ai déjà testé.

Une situation particulière: si vous rendez translucide sur une activité de lanceur, elle n'a pas de parent (arrière-plan), alors faites toujours pivoter avec l'appareil. Vous voulez le réparer, vous devez prendre une autre façon de remplacer le <item name="android:windowIsTranslucent">true</item>style.


2
Je n'ai pas ce problème sur mon OnePlus exécutant Android PIE. Donc ce n'est pas après la v27, mais quand v! = 28
Entreco

Avez-vous un lien vers la documentation à ce sujet? Je n'arrive pas à le trouver.
Shivam Verma

problème translucide est vraiment fou, merci, il résout mon problème
Abhishek Garg

Merci d'avoir noté cette dernière section 'Une situation spéciale ...'
guy_m

Cela devrait être la réponse acceptée. Ça a du sens!
stoefln

30

Si vous utilisez une activité transparente plein écran, il n'est pas nécessaire de spécifier le verrou d'orientation sur l'activité. Il prendra les paramètres de configuration de l'activité parent. Donc, si l'activité parent a dans le manifeste:

android: screenOrientation = "portrait"

votre activité translucide aura le même verrou d'orientation: portrait.


Je pense que vous avez fait une petite faute de frappe: devrait être "si vous utilisez une activité translucide plein écran , elle prendra le paramètre de configuration de son activité parente" ^^
Josselin

2
Et si mon activité transparente était mon activité de lanceur (c'est-à-dire l'écran de démarrage)
Bhupesh

2
Est-ce vrai pour toutes les versions d'Android? Ou est-ce seulement Android O et plus?
abhiank

Cela ne fonctionnera pas s'il s'agit de la seule activité utilisée (exemple: démarrage à partir d'un service)
Développeur Android

26

J'ai utilisé à la android:screenOrientation="behind"place de android:screenOrientation="portrait". Fondamentalement, vous avez créé une boîte de dialogue (dans une activité) et la boîte de dialogue ne peut pas demander l'orientation par elle-même, elle a besoin d'une activité parent pour le faire (car un parent est visible en arrière-plan et a sa propre mise en page).

"derrière" La même orientation que l'activité qui se trouve immédiatement en dessous dans la pile d'activités.


Que faire si je veux que l'activité que j'ai créée soit transparente, montrant ce qui se trouve en dessous (y compris d'autres applications), tout en conservant l'orientation actuelle? Si je le laisse rester "derrière", il peut toujours changer d'orientation sur divers cas ...
développeur android

20

La seule solution qui fonctionne vraiment:

Changement:

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

à:

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

dans styles.xml

Mais cela peut induire un problème avec votre écran de démarrage (écran blanc au démarrage) ... Dans ce cas, ajoutez la ligne suivante à votre styles.xml:

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

juste en dessous de la ligne windowIsTranslucent.

Dernière chance si les astuces précédentes ne fonctionnent pas: ciblez SDK 26 à la place o 27.


1
Changer le SDK cible à 26 au lieu de 27 a fonctionné pour moi. Changer windowIsTranslucent n'a pas fait.
Cliche818

Cela a fonctionné pour moi en utilisant targetSDK: 27. C'est particulièrement important car j'avais un écran de démarrage configuré.
Leonardo G.12

18

Si vous devez utiliser setRequestedOrientation(), il n'y a pas d'autre moyen que de sacrifier l'attribut windowIsTranslucent sur Android 8.0

values\styles.xml pour le niveau api 25- (<8,0)

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

values-v26\styles.xml pour api niveau 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 pour api niveau 27+ (> 8,0)

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

14

Beaucoup de gens ont donné une solution, je vais donc parler de la source du problème.

Selon le journal des exceptions :

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)

Le code qui a déclenché l'exception dans 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;
        }

Selon l'analyse de code ci-dessus, lorsque TargetSdkVersion> = 27, lors de l'utilisation des attributs de rubrique SCREEN_ORIENTATION_LANDSCAPE, SCREEN_ORIENTATION_PORTRAIT et d'autres attributs associés, l'utilisation des attributs de rubrique windowIsTranslucent, windowIsFloating et windowSwipeToDismiss déclenchera une exception.

Une fois le problème détecté, vous pouvez modifier TargetSdkVersion ou supprimer les attributs associés du thème en fonction de vos besoins.


1
En vérifiant le code sur master en ce moment, il est déjà supprimé du framework: mirror / platform_frameworks_base / commit / e83f34cde79c51efb66f31f2770c2e8e572e96db # diff-a9aa0352703240c8ae70f1c83add4bc8 Il est intéressant de voir le message de commit.
Erick M. Sprengel

Pouvez-vous s'il vous plaît montrer un lien vers le code source de cette partie? Existe-t-il une solution de contournement qui me permettra d'avoir une activité avec une orientation spécifique ET un arrière-plan transparent, de sorte qu'il soit possible de voir ce qu'il y a derrière (y compris d'autres applications)?
développeur android

9

Je ne peux pas accepter la réponse la plus notée, car

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

provoque une erreur

java.lang.IllegalStateException: seules les activités opaques en plein écran peuvent demander une orientation

mais cela fonctionne pour moi

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

et utilisez-le pour votre activité, lorsque vous

InterstitialActivity extends AppCompatActivity

dans AndroidManifest.xml

    <activity
        android:name=".InterstitialActivity"
        ...
        android:screenOrientation="portrait"
        android:theme="@style/TranslucentTheme" />

<item name = "android: windowIsTranslucent"> false </item> <item name = "android: windowFullscreen"> true </item> => cela a corrigé le problème pour moi sur Android 8.0. Je pourrais toujours laisser screenOrientation dans le manifeste.
Frank

1
Cela ne fonctionne pas de la même manière que windowIsTranslucent, car vous ne pouvez plus voir ce qui se cache derrière l'activité.
développeur android

8

Supprimez simplement cette ligne android:screenOrientation="portrait"d'activité dans Manifiest.xml

Cette activité obtiendra une orientation de son activité précédente, donc pas besoin d'appliquer l'orientation qui a <item name="android:windowIsTranslucent">true</item>.


Et si l'activité précédente a une orientation différente de ce que vous voulez dans l'activité en cours?
ClassA

6

il semble que le sdk cible est à tarte (niveau de l'API 28.0) et que windowIsTranslucent est vrai

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

et vous essayez d'accéder à l'orientation. problème vient avec android oreo 8.0 (api niveau 26) il y a deux façons de résoudre ce problème

  1. supprimer l'orientation
  2. ou définissez windowIsTranslucent sur false

si vous définissez l'orientation dans un manifeste comme celui-ci

android:screenOrientation="portrait"

ou en classe d'activités comme celle-ci

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

supprimer des deux endroits.

et observé lorsque vous définissez windowIsTranslucent sur true, il prend l'orientation de l'activité parent.


5

dans le fichier manifeste, définissez la deuxième activité parentActivityName comme première activité et supprimez le paramètre screenOrientation de la deuxième activité. cela signifie que votre première activité est le parent et décidez d'une orientation de votre deuxième activité.

<activity
        android:name=".view.FirstActiviy"
        android:screenOrientation="portrait"
        android:theme="@style/AppTheme" />

<activity
        android:name=".view.SecondActivity"
        android:parentActivityName=".view.FirstActiviy"
        android:theme="@style/AppTheme.Transparent" />

5

Définissez simplement l'orientation de l'activité dans Manifiest.xml

android:screenOrientation="unspecified"

OU pour restreint à l'orientation portrait

Vous pouvez également utiliser dans Activity, In onCreatemethod call avant super.onCreate(...)eg

@Override
    protected void onCreate(Bundle savedInstanceState) {
        setOrientation(this);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.your_xml_layout);
        //...
        //...
}

// Method 
public static void setOrientation(Activity context) {
   if (android.os.Build.VERSION.SDK_INT == Build.VERSION_CODES.O)
        context.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
      else
        context.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

4

J'ai eu le même problème, et ma solution était d'éliminer la ligne

android:screenOrientation="portrait"

puis ajoutez ceci dans l'activité:

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

1
Veuillez utiliser l'anglais sur Stack Overflow. Merci!
Michael Myers

3

Après quelques recherches, il semble que ce problème soit dû à un bug de Google. Pour moi, j'ai pu laisser cette ligne dans ma méthode Activities onCreate:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

ET j'ai changé ma targetSdkVersion à 26. Avoir cette ligne dans mon onCreate entraînait toujours un plantage alors que ma targetSdkVersion était toujours définie à 27. Puisque la solution de personne d'autre n'a fonctionné pour moi jusqu'à présent, j'ai trouvé que cela fonctionne comme une solution temporaire pour maintenant.


1
Celui-ci a fonctionné pour moi en définissant targetSdkVersion sur 26, android: screenOrientation = "portrait" et <item name = "android: windowIsTranslucent"> true </item>
siripan

@siripan pour moi aussi
Acauã Pitta

Mais finalement, vous devrez définir la targetSdkVersion à 28 cette année: support.google.com/googleplay/android-developer/answer/… . Que vas-tu faire?
développeur android

3

Il s'agit d'un conflit (bogue) entre les thèmes à l'intérieur du fichier style.xml dans les versions Android 7 (niveaux Api 24,25) et 8 (niveaux api 26,27), lorsque vous avez

android:screenOrientation="portrait" : à l'intérieur d'une activité spécifique (qui plante) dans AndroidManifest.xml

&

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

dans le thème qui s'appliquait à cette activité dans style.xml

Il peut être résolu de ces manières en fonction de vos besoins:

1- Supprimer l'une des propriétés mentionnées ci-dessus qui créent des conflits

2- Changez l'orientation de l'activité sur l'une de ces valeurs selon vos besoins: unspecifiedou behindet ainsi de suite que vous pouvez trouver ici: référence Google pour Android: screenOrientation `

3- Définir l'orientation par programmation en temps d'exécution


J'ai essayé cette solution, mais l'application plante toujours: j'ai besoin d'une activité de portrait transparent, j'ai donc besoin de ces deux options. Essayé ensemble dans l'écran manifesteOrientation non spécifiée, mais pas de chance.
anber

Non. J'ai essayé de supprimer l'orientation dans le manifeste et de rendre l'activité en plein écran, mais cela plante toujours. Uniquement sur 1 appareil - honor 9 lite. Sur Samsung, cela fonctionne bien.
anber

La définition de l'orientation par programme provoque également le plantage. Comment l'avez-vous utilisé exactement?
développeur android

@androiddeveloper comment puis-je accéder à votre code source?! Je dois voir ce que vous avez fait
Hamed Jaliliani

@HamedJaliliani Le paramétrer par programme est comme tel, par exemple: `setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);`
développeur android

3

Utilisation

android:screenOrientation="behind"

Et thème

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

3

J'ai récemment fait face au problème et voici la solution.

Pas besoin de modifier le paramètre d'orientation de l'écran que vous définissez dans le fichier manifeste Android.

Ajoutez simplement deux dossiers dans

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

Copiez ensuite votre fichier styles.xml et themes.xml ici.

et modifiez les paramètres suivants de TRUE à FALSE.

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

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

Ça va marcher.

Un bogue commun d'Android 8.0


2

J'ai rencontré ce problème uniquement dans le SDK 26 (8.0.0) si vous utilisez windowIsTranslucent `` true '' et définissez l'orientation avec force:

Voici la solution:

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

Mais alors vous perdez la fonctionnalité d'avoir réellement l'orientation définie sur ce que vous vouliez.
développeur android

2

J'obtenais cette erreur lorsque j'essayais de capturer une image ou de prendre une image de la galerie, ce qui fonctionne pour moi est de supprimer les deux

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

et

android:screenOrientation="portrait"

maintenant mon activité utilise ce thème:

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

Cela ne fonctionne pas, car cela windowIsFloatingprovoque le même crash que windowIsTranslucent.
développeur android

2

seulement 8.0.0 lance l'exception, au-dessus de 8.0 a supprimé l'exception

8.0.0 lancer l'exception


Android 7, 7.1, 8.0, 8.1 ont tous ce problème
Hamed Jaliliani

appInfo.targetSdkVersion > Ojeter l'exception
Mingo

Il vérifie la targetversion sdk. Peu importe la version SDK exécutée par l'appareil, vous compilez avec Android O (28) mais ne suivez pas les conventions de cette version de la plate-forme.
Tomáš Beňo

2

La seule chose qui a fonctionné pour moi a été de changer

android:screenOrientation="portrait"

à

android:screenOrientation="unspecified"

dans le manifeste pour toutes les activités translucides.

De cette façon, il est compatible avec toutes les versions d'API puisque l'activité translucide semble hériter de son orientation de l'activité parente à partir du targetApi: 28.

Le style peut être laissé tel quel <item name="android:windowIsTranslucent">true</item>.


J'ai essayé cette solution, mais l'application plante toujours
anber

Mais alors vous perdez la fonction de réglage de l'orientation
développeur Android

@androiddeveloper: D'après ce que je comprends, l'orientation sera héritée de l'activité parent. Si vous voulez définir explicitement une autre orientation sur l'activité translucide qui ne fonctionnerait pas de cette façon ...
Max Heimer

Parfois, vous ne pouvez pas contrôler l'activité précédente. Parfois, vous souhaitez afficher votre transparent au-dessus de ce que l'utilisateur voit actuellement. Donc, cela ne peut pas aider :(
développeur Android

1

Je ne sais pas s'il s'agit d'un bogue de Google ou d'un comportement prévu mais je l'ai (au moins momentanément) résolu en remettant compileSdkVersion et targetSdkVersion à 26 dans Gradle ...


3
Vous ne devez pas baisser le niveau de targetdk. Votre application sera éventuellement bloquée du Play Store. Toujours cibler le dernier niveau d' API
Shmuel

1
@Shmuel: faux. Vous pouvez cibler 26 et être disponible sur 28 sur la boutique.
Regis_AG

1
Corriger, je l' ai écrit « finalement » si vous construisez votre application ciblant un niveau api plus vous serez dans un monde de douleur lorsque vous êtes obligé de mise à jour
Shmuel

Ce n'est pas une solution mais une solution de contournement. Un jour, vous devez migrer votre application vers 28 et donc!
sud007

1

Si vous n'avez pas résolu votre problème, enregistrez simplement l'activité publicitaire dans le manifeste comme suit:

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

Vous devez également mettre à jour la dernière version du sdk.


1

Vous affichez probablement une activité ressemblant à une boîte de dialogue (non plein écran), supprimez donc screenOrientation du manifeste ou du code. Cela résoudra le problème.


Hmm très étrange, pour moi c'était le cas. Essayez d'exécuter l'application sur différentes versions d'Android, voyez quel sera le résultat cela peut vous aider ...
Balflear

1

cela s'est produit après 27, utilisez targetSdkVersion 26 remplacer, attendez que Google le corrige


2
Veuillez fournir toute référence (lien ou cité) lors de la publication d'une réponse. Ainsi, les futurs utilisateurs peuvent comprendre facilement. Bienvenue également dans la communauté SO .
Mohammedsalim Shivani

@MohammedsalimShivani Ici: issuetracker.google.com/issues/68454482#comment4 "Notre équipe d'ingénierie a résolu ce problème. Il sera disponible dans une prochaine version d'Android, veuillez donc garder un œil sur les notes de publication."
développeur android

C'est un mauvais conseil
Chris

0

Je viens de supprimer les balises "portrait" des éléments non plein écran et tout s'est bien passé.

android:screenOrientation="portrait"

0

Veuillez vérifier le style de votre activité et assurez-vous que si vous n'utilisez pas d'éléments liés à Translucent, changez le style pour alterner. Afin que nous puissions résoudre ce problème.

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

0

J'ai résolu ce problème en supprimant android:screenOrientation="portrait"et en ajoutant le code ci-dessous dans mon onCreate

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

tandis que mes propriétés de thème sont

<item name="android:windowIsTranslucent">true</item>
<item name="android:windowDisablePreview">true</item>
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.