web-dev-qa-db-ja.com

java.lang.IllegalStateException:全画面の不透明なアクティビティだけが方向を要求できます

Android 8.0 Oreo Java.lang.IllegalStateExceptionで連絡先帳から連絡先を取得しているときに問題が発生する

私は電話の連絡先から私の活動の連絡先を取得しようとしています、そしてそれはLollipop、Marshmallow、Nougatなどには完璧に働きます、しかしそれは私に助けてください私のようなOreoのためのエラーを与えます。私のコードは以下の通りです。

デモコード: - /

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
110
Shubham Sejpal

ターゲットsdkが28のときに問題が発生しているようです。多くのオプションを試した後、これはついにうまくいきました。

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

注:parent = "Theme.AppCompat.Light.NoActionBar"はapi 28に必要です。以前はapi 26に何か他のものがありました。28でうまくいっていましたが、問題を起こし始めました。

20
Debasish Ghosh

Android O以降では、設定したときにこのエラーが発生します。

 Android:screenOrientation="portrait"

マニフェスト.

その行を削除して使用

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

あなたの活動に。

これで問題は解決します。

75
Ragesh Ramesh

Googleは、v27以降のActivityのonCreateメソッドでこの例外をスローしています。それらの意味は、Activityが半透明またはフローティングの場合、その方向性は親(バックグラウンド)Activityに依存するべきであり、それ自体では決定できません。

たとえあなたが浮動型または半透明のアクティビティからAndroid:screenOrientation="portrait"を削除してもその親(背景)アクティビティの向きを修正しても、それはまだ親によって修正されています、私はすでにテストしました。

特別な状況の1つ:ランチャーActivityを半透明にする場合、それは親(背景)を持たないので、常にデバイスと一緒に回転させます。修正したい場合は、<item name="Android:windowIsTranslucent">true</item>スタイルを置き換える別の方法をとらなければなりません。

62
Steven Sun

Android Oreoでは、行の下にあるアクティビティの向きを変更できません

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

これを解決する方法はあります。

1) 上記の行を削除するだけで、アプリは正常に動作します。

2) または あなたは最初に 削除することができます そのアクティビティのマニフェストから行の下に

Android:screenOrientation="portrait"

それなら add この行をJavaファイルに追加する必要があります。

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

フルスクリーンの透明なアクティビティを使用する場合は、アクティビティに方向ロックを指定する必要はありません。それは親アクティビティの設定を取ります。それで、親アクティビティがマニフェストにあるならば:

Android:screenOrientation = "ポートレート"

あなたの半透明の活動は同じ向きのロックを持ちます:縦。

23
gellyke

私はAndroid:screenOrientation="behind"の代わりにAndroid:screenOrientation="portrait"を使いました。基本的に、ダイアログを(アクティビティ内に)作成し、ダイアログはそれ自体では方向を要求できません(親が背景に表示され、独自のレイアウトを持っているため)。

"後ろ"アクティビティスタックのすぐ下にあるアクティビティと同じ向きです。

14
Paul

本当にうまくいく唯一の解決策:

変化する:

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

に:

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

styles.xmlで

しかし、これはスプラッシュスクリーン(起動時の白い画面)に問題を引き起こす可能性があります。この場合は、styles.xmlに次の行を追加します。

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

windowIsTranslucent行のすぐ下にあります。

前回のヒントがうまくいかない場合は、最後のチャンスです。ターゲットSDK 26ではなく27をターゲットにしてください。

12
Regis_AG

多くの人が修正をしてくれたので、私は問題の原因について話します。

例外ログによると:

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

        /**
        * 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;
        }

上記のコード分析によると、TargetSdkVersion> = 27、SCREEN_ORIENTATION_LANDSCAPE、SCREEN_ORIENTATION_PORTRAIT、およびその他の関連属性を使用する場合は、windowIsTranslucent、windowIsFloating、およびwindowSwipeToDismissトピック属性を使用すると例外が発生します。

問題が見つかったら、必要に応じてTargetSdkVersionを変更するか、テーマの関連属性を削除します。

9
Bingerz

最も評価の高い回答に同意できない

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>

あなたがから伸びるとき、そしてあなたの活動のためにそれを使う

InterstitialActivity extends AppCompatActivity

androidManifest.xmlの中の

    <activity
        Android:name=".InterstitialActivity"
        ...
        Android:screenOrientation="portrait"
        Android:theme="@style/TranslucentTheme" />
8
hannes ach

Manifest.xmlからこの行のアクティビティのAndroid:screenOrientation="portrait"を削除するだけです。

そのアクティビティは前のアクティビティからオリエンテーションを取得するので、<item name="Android:windowIsTranslucent">true</item>を持つオリエンテーションを適用する必要はありません。

6
Sanket Kachhela

ターゲットSDKがパイ(APIレベル28.0)で、windowIsTranslucentがtrueの場合

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

オリエンテーションにアクセスしようとします。問題はAndroid oreo 8.0(APIレベル26)に付属しています。これを解決する方法は2つあります

  1. 向きを削除する
  2. またはwindowIsTranslucentをfalseに設定します

このようなマニフェストで方​​向を設定している場合

Android:screenOrientation="portrait"

またはこのような活動クラスで

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

両方の場所からフォームを削除します。

また、windowIsTranslucentをtrueに設定すると、親アクティビティから方向を取得します。

4
Avinash Jadaun

values-v26create styles.xml(v26)

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

私は同じ問題を抱えていた、そして私の解決策は線を排除することだった

Android:screenOrientation="portrait"

そして、これをアクティビティに追加します。

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

マニフェストファイルで、2番目のアクティビティparentActivityNameを最初のアクティビティとして設定し、screenOrientationパラメータを2番目のアクティビティに削除します。それはあなたの最初の活動が親であり、あなたの2番目の活動の方向性を決めることを意味します。

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

WindowIsTranslucent 'true'を使用して強制的に方向を設定した場合、私はSDK 26(8.0.0)でのみこの問題に直面しました。

これが解決策です。

    @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>
2
Hamza Khan

いくつかの調査を行った後、この問題はGoogleのバグが原因である可能性があります。私にとっては、この行をActivities onCreateメソッドに残しておくことができました。

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

そして私は私のtargetSdkVersionを26に変更しました。私のtargetSdkVersionがまだ27に設定されている間私のonCreateのその行を持っていることはまだクラッシュをもたらしました今すぐ.

2
NaturallyAsh

Manifest.xmlでアクティビティの方向を設定するだけです

Android:screenOrientation="unspecified"
2
Attaullah

Androidバージョン7(APIレベル24、25)および8(APIレベル26、27)のstyle.xmlファイル内のテーマ間の競合(バグ)です。

Android:screenOrientation="portrait":AndroidManifest.xml内の特定のアクティビティの内部(クラッシュする)

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

style.xml内のそのアクティビティに適用されるテーマ内

それはあなたの必要性に従ってこれらの方法によって解決することができます:

1-競合する上記のプロパティのうち1つを削除します

2 - 必要に応じて、アクティビティの方向を次のいずれかの値に変更します。unspecifiedまたはbehindなど。これは次の場所にあります。 Android用Googleリファレンス:screenOrientation `

3-プログラムで実行時に向きを設定する

2
Hamed Jaliliani

私のために働いていた唯一のことは変化していました

Android:screenOrientation="portrait"

Android:screenOrientation="unspecified"

すべての半透明の活動のためのマニフェストで。

半透明なアクティビティはtargetApi: 28の時点で親アクティビティからその方向を継承しているように見えるので、そのようにそれはすべてのAPIバージョンと互換性があります。

<item name="Android:windowIsTranslucent">true</item>を含むスタイルはそのまま残すことができます。

2
Max Heimer

おそらく、Dialogのように表示されている(フルスクリーンではない)Activityを示しているので、 screenOrientation from Manifest またはコードから削除します。これで問題は解決します。

1
Balflear

画像をキャプチャしようとしたとき、またはギャラリーから画像を取得しようとしたときにこのエラーが発生しました

 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>
1
Nouman Ch

これは27の後に起こった、targetSdkVersion 26の置き換えを使う、グーグルがそれを修正するのを待つ

1
yihang wu

これがGoogleのバグなのか意図した動作なのかはわかりませんが、少なくとも一時的にGradleでcompileSdkVersionとtargetSdkVersionを26に戻すことで解決しました...

1
Seven

問題が解決していない場合は、次のようにマニフェストに広告アクティビティを登録してください。

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

また、最新バージョンのsdkにアップデートする必要があります。

1
Gardax

8.0.0のみが例外をスローし、8.0を超えると例外が削除されます。

8.0.0 throw the exception

0
Mingo

私は同じ問題を抱えていたので、これを設定するだけで修正しました:styles.xmlの<item name="Android:windowIsFloating">false</item>

ユーザーはAppCompatActivityを拡張します。

テーマの行を削除してみてください。

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

そして

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

その後、アクティビティにAndroid:screenOrientation="portrait"を追加してください。

0
paul_parkbom

つかいます

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>
0
Mostafa Imran

非フルスクリーン要素から「ポートレート」タグを削除したところ、すべてうまくいきました。

Android:screenOrientation="portrait"
0
Victor Tavares