java.lang.IllegalStateException: solo las actividades opacas de pantalla completa pueden solicitar orientación

Estoy enfrentando el problema al recuperar los contactos del libro de contactos en Android 8.0 Oreo java.lang.IllegalStateException: Solo las actividades opacas de pantalla completa pueden solicitar orientación

Estoy tratando de obtener el contacto en mi actividad del libro de contactos del teléfono y funciona perfectamente para Lollipop, Marshmallow, Nougat, etc. pero me da el error para Oreo así por favor ayúdenme. Mi código está aquí abajo.

Código de demostración: –

private void loadContacts() { contactAsync = new ContactLoaderAsync(); contactAsync.execute(); } private class ContactLoaderAsync extends AsyncTask { 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() { @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 PHONE_TYPES = new HashMap(); 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"); } } 

Registro de errores:-

 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 

En Android O y más tarde este error ocurre cuando configura

  android:screenOrientation="portrait" 

en Manifiesto

Eliminar esa línea y usar

  setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

en tu actividad

Esto solucionará tu problema.

Google arroja esta excepción en el método onCreate de onCreate después de v27, su significado es: si una actividad es translúcida o flotante, su orientación debe confiarse en la actividad principal (de fondo), no puede tomar decisiones por sí misma.

Incluso si elimina android:screenOrientation="portrait" de la actividad flotante o translúcida, pero corrige la orientación en su actividad principal (de fondo), el padre todavía lo arregla, ya lo he probado.

Una situación especial: si haces translúcido en una actividad de iniciador, no tiene el elemento principal (fondo), por lo tanto, siempre rota con el dispositivo. Desea repararlo, tiene que tomar otra forma de reemplazar el estilo true .

Si usa una actividad transparente a pantalla completa, no es necesario especificar el locking de orientación en la actividad. Tomará los ajustes de configuración de la actividad principal. Entonces, si la actividad principal tiene en el manifiesto:

android: screenOrientation = “retrato”

su actividad translúcida tendrá el mismo locking de orientación: retrato.

en Android Oreo no puedes cambiar oritation para Activity que tiene línea debajo en estilo

  true 

Primero debes eliminar la línea inferior del manifiesto para esa actividad

 android:screenOrientation="portrait" 

En segundo lugar, debe agregar esta línea al archivo java

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

No puedo aceptar la mayoría de las respuestas calificadas, porque

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

causa un error

java.lang.IllegalStateException: solo las actividades opacas de pantalla completa pueden solicitar orientación

pero esto hace que funcione para mí

  

y úsala para tu actividad, cuando te extiendas de

 InterstitialActivity extends AppCompatActivity 

en AndroidManifest.xml

   

La única solución que realmente funciona:

Cambio:

 true 

a:

 false 

en styles.xml

Pero esto podría provocar un problema con su pantalla emergente (pantalla blanca al inicio) … ¡Buena suerte! 🙂

Última oportunidad: objective SDK 26 en lugar o 27. Y espere SDK 28 que debería solucionar este problema (¡normalmente!)

Muchas personas dieron una solución, así que hablaré sobre el origen del problema.

De acuerdo con el registro de excepción:

 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) 

El código que activó la excepción en 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; } 

De acuerdo con el análisis de código anterior, cuando TargetSdkVersion> = 27, cuando se utiliza SCREEN_ORIENTATION_LANDSCAPE, SCREEN_ORIENTATION_PORTRAIT y otros atributos relacionados, el uso de los atributos de tema windowIsTranslucent, windowIsFloating y windowSwipeToDismiss desencadenará una excepción.

Después de encontrar el problema, puede cambiar TargetSdkVersion o eliminar los atributos relacionados del tema de acuerdo con sus necesidades.

en el archivo de manifiesto establezca la segunda actividad parentActivityName como primera actividad y elimine el parámetro screenOrientation de la segunda actividad. significa que su primera actividad es el padre y decide una orientación de su segunda actividad.

   

No sé si esto es un error de Google o un comportamiento previsto, pero yo (al menos momentáneamente) lo resolvió al cambiar compileSdkVersion y targetSdkVersion a 26 en Gradle …

Si no ha resuelto su problema simplemente registre la actividad del anuncio en el manifiesto de esta manera:

  

También necesita actualizar a la última versión del SDK.

Probablemente muestre Actividad parecida a Diálogo (no pantalla completa), por lo tanto, elimine screenOrientation de Manifiesto o del código. Esto solucionará el problema.

Solo establece la orientación de la actividad en Manifiest.xml

 android:screenOrientation="unspecified" 

esto sucedió después de 27, use targetSdkVersion 26 replace, espere a que google lo arregle

Tuve el mismo problema, y ​​mi solución fue eliminar la línea

 android:screenOrientation="portrait" 

y luego agregue esto en la actividad:

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