254 votes

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

Je suis confronté au problème lors de l'extraction des contacts à partir du carnet d'adresses en Android 8.0 Oreo java.lang.IllegalStateException: Uniquement en plein écran opaque activités peuvent demander de l'orientation

J'essaie de le contacter dans mon activité à partir du téléphone de contact livre et il fonctionne parfaitement pour Lollipop, Guimauve, Nougat, etc, mais il me donne l'erreur pour Oreo comme cela, s'il vous plaît aider moi. Mon code est ci-dessous.

Le Code De Démonstration :-

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

201voto

Radesh Points 2416

Dans android Oreo API (26) vous ne pouvez pas changer d'orientation pour les Activités qui ont en dessous de la ligne dans le style

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

Vous avez deux façons de résoudre ce :

1) Vous pouvez simplement supprimer la ligne ci-dessus (ou de le mettre à false) et que votre application fonctionne très bien.

2) Ou vous pouvez tout d'abord supprimer en dessous de la ligne de manifester pour cette activité

android:screenOrientation="portrait"

Ensuite, vous devez ajouter cette ligne au fichier java

    //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 de nouveaux styles.xml en values-v26 le dossier et les ajouter à votre style.xml. Grâce à AbdelHady commentaire

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

93voto

Ragesh Ramesh Points 2860

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

  android:screenOrientation="portrait"
 

dans manifeste.

Supprimer cette ligne et utiliser

  setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
 

dans votre activité.

Cela résoudra votre problème.

85voto

Steven Sun Points 711

Google lance cette exception d'Activité, en onCreate méthode après v27, leur signification est la suivante : si une Activité est translucide ou flottant, son orientation doit être invoqué parent(arrière-plan) de l'Activité, ne peut pas prendre une décision sur lui-même.

Même si vous supprimez android:screenOrientation="portrait" du flottant ou translucide, mais un correctif de l'orientation de sa mère(arrière-plan) de l'Activité, il est toujours fixée par le parent, j'ai testé déjà.

Une situation particulière : si vous en faites translucide sur un lanceur d'Activité, il a pas de parent(arrière-plan), il faut donc toujours faire pivoter l'appareil. Vouloir le résoudre, vous devez prendre une autre manière de remplacer <item name="android:windowIsTranslucent">true</item> style.

72voto

Debasish Ghosh Points 634

Le problème semble se produire quand votre cible sdk est 28. Donc, après avoir essayé de nombreuses options finalement cela a 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="Thème.AppCompat.La lumière.NoActionBar" est nécessaire pour l'api 28. Auparavant, avait quelque chose d'autre à l'api de 26. A été génial de travailler, mais a commencé à donner de problème à 28. Espérons que cela aide quelqu'un ici. EDIT: Pour certains, que par la mise en <item name="android:windowIsTranslucent">false</item> and <item name="android:windowIsFloating">false</item> travaillé.Peut-être dépend de la façon d'implémenter la solution fonctionne.Dans mon cas, il a travaillé en paramètre à true.

33voto

gellyke Points 500

Si vous utilisez une activité transparente en plein écran, il n'est pas nécessaire de spécifier le verrou d'orientation de l'activité. Il faudra 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X