java.lang.IllegalStateException:只有全屏不透明活动才能请求定向

java.lang.IllegalStateException:只有全屏不透明活动才能请求定向,java,android,android-8.0-oreo,android-8.1-oreo,Java,Android,Android 8.0 Oreo,Android 8.1 Oreo,我在Android 8.0 Oreo java.lang.IllegalStateException中从联系人簿中检索联系人时遇到了这个问题:只有全屏不透明活动才能请求定向 我试图在我的活动中从电话联系簿中获得联系,它适用于棒棒糖、棉花糖、牛轧糖等,但它会给我这样的奥利奥错误,请帮助我。我的代码在下面 演示代码:- private void loadContacts() { contactAsync = new ContactLoaderAsync();

我在Android 8.0 Oreo java.lang.IllegalStateException中从联系人簿中检索联系人时遇到了这个问题:只有全屏不透明活动才能请求定向

我试图在我的活动中从电话联系簿中获得联系,它适用于棒棒糖、棉花糖、牛轧糖等,但它会给我这样的奥利奥错误,请帮助我。我的代码在下面

演示代码:-

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

在Android O和更高版本中,当设置

 android:screenOrientation="portrait"
在舱单上

拆下那根线并使用

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
在你的活动中

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

这将解决您的问题。

Google在v27之后对Activity的
onCreate
方法抛出此异常,其含义是:如果某个活动是半透明或浮动的,则其方向应依赖于父(背景)活动,而不能自行决定

即使您从浮动或半透明活动中删除了android:screenOrientation=“纵向”,但在其父(背景)活动中修复了方向,它仍然由父(背景)活动修复,我已经测试过了


一种特殊情况:若你们在一个启动器活动中使其半透明,那个么它并没有父(背景),所以总是和设备一起旋转。想要修复它,你必须采取另一种方式来替换
true
样式。

我不知道这是谷歌的错误还是一种预期行为,但我(至少是暂时的)通过将compileSdkVersion和targetSdkVersion更改回Gradle中的26来解决此问题…

如果您尚未解决问题,请在清单中注册ad活动,如下所示:

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


您还需要更新到sdk的最新版本。

可能您显示的活动看起来像对话框(非全屏),因此从清单或代码中删除屏幕方向。这将解决这个问题。

我不能同意大多数评级的答案,因为

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
引起错误

java.lang.IllegalStateException:只能使用全屏不透明活动 请求定向

但这对我来说很有用

<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>
在AndroidManifest.xml中

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

唯一有效的解决方案:

更改:

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

false
在styles.xml中

但这可能会导致splashscreen出现问题(启动时出现白色屏幕)。。。在本例中,请将以下行添加到styles.xml中:

 <item name="android:windowDisablePreview">true</item> 
true
就在窗户透光线的下方


如果前面的提示不起作用,最后一次机会是:将目标SDK 26改为o 27。

如果使用全屏透明活动,则无需在活动上指定方向锁定。它将采用父活动的配置设置。因此,如果父活动在清单中有:

android:screenOrientation=“肖像”


半透明活动将具有相同的方向锁定:纵向

很多人已经给出了解决方案,所以我将谈谈问题的根源

根据异常日志:

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)
触发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():

根据以上代码分析,当TargetSdkVersion>=27时,当使用SCREEN_ORIENTATION_横向、SCREEN_ORIENTATION_纵向和其他相关属性时,使用windowIsTranslucent、windowIsFloating和windowSwipeToDismiss主题属性将触发异常

发现问题后,您可以根据需要更改TargetSdkVersion或删除主题的相关属性。

在android Oreo(API 26)中,您不能更改样式中有下线的活动的方向

然后必须将该行添加到活动中(在onCreate()中)

3)您可以在
values-v26
文件夹中创建新的
style.xml
,并将其添加到
style.xml
中。(感谢评论)

false
假的

这发生在27之后,使用targetSdkVersion 26替换,等待google在清单文件中将其修复,将第二个活动parentActivityName设置为第一个活动,并将screenOrientation参数删除到第二个活动。这意味着你的第一项活动是父母,决定第二项活动的方向

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

我也遇到了同样的问题,我的解决方案是取消线路

android:screenOrientation="portrait"
然后将其添加到活动中:

if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
if(android.os.Build.VERSION.SDK\u INT
只需在Manifiest.xml中设置活动方向

android:screenOrientation="unspecified"
或仅限于纵向方向

您还可以在活动中,在
onCreate
方法调用中,在
super.onCreate(…)
之前使用

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

我使用了
android:screenOrientation=“behind”
而不是
android:screenOrientation=“trait”
。基本上,您创建了一个对话框(在活动中),而对话框本身不能请求方向,它需要父活动来执行此操作(因为父活动在后台可见,并且有自己的布局)

“后面”与活动堆栈中紧靠其下方的活动方向相同


在做了一些研究后,似乎这个问题可能是由于谷歌的错误。对我来说,我可以在Activities onCreate方法中留下这一行:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

我把targetSdkVersion改为26。在onCreate中使用该行仍然会导致崩溃,而我的targetSdkVersion仍然设置为27。由于到目前为止还没有其他人的解决方案对我有效,我发现这只是暂时的解决方案。

我只在SDK 26(8.0.0)中遇到了这个问题,如果使用windowIsTranslucent“true”并强制设置方向:

以下是解决方案:

<item name="android:windowIsTranslucent">false</item> <item name="android:windowIsFloating">false</item>
<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" />
android:screenOrientation="portrait"
if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
android:screenOrientation="unspecified"
@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);
}
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    @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>
<activity
            android:name=".activities.FilterActivity"
            android:theme="@style/Transparent"
            android:windowSoftInputMode="stateHidden|adjustResize" />
<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>
<style name="Base.Theme.DesignDemo" parent="Base.Theme.AppCompat.Light">
        ...
        <item name="android:windowIsTranslucent">true</item>
        ...
    </style>
<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>
<style name="Base.Theme.DesignDemo" parent="Base.Theme.AppCompat.Light">
    ...
    <item name="android:windowIsTranslucent">true</item>
    ...
</style>
 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
android:screenOrientation="portrait"
  <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>
<item name="android:windowIsTranslucent">true</item> 
android:screenOrientation="portrait"
android:screenOrientation="behind"
<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>
android:screenOrientation="portrait"
 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
res>values
as  res>values-v26 
and res>values-v27
<item name="android:windowIsTranslucent">true</item>

<item name="android:windowIsTranslucent">false</item>
android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowDisablePreview">true</item>