java.lang.IllegalStateException : 전체 화면 불투명 활동 만 방향을 요청할 수 있습니다.


187

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

이것을 확인하십시오 : stackoverflow.com/questions/6745797/…
— yash786

1
이것은 당신이 도움이 될 수 stackoverflow.com/questions/46980697/...
— Nilesh Rathod에게

이것도 확인하십시오 : stackoverflow.com/questions/46980697/…
— yash786

1
모든 제안을 시도했지만 아무도 나를 위해 일하지 않았습니다.
— Shubham Sejpal

1
매니페스트에서 android : screenOrientation = "portrait"를 사용하고 있습니까?
— Ragesh Ramesh

답변:


63

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

참고 : parent = "Theme.AppCompat.Light.NoActionBar"는 api 28에 필요합니다. 이전에는 api 26에 다른 ​​것이 있었지만 28 일에 문제를 일으키기 시작했습니다. 누군가에게 도움이되기를 바랍니다. 편집 : 일부만 <item name="android:windowIsTranslucent">false</item> and <item name="android:windowIsFloating">false</item> 작동하여 설정했습니다. 솔루션 작동 방식에 따라 달라질 수 있습니다. 제 경우에는 true로 설정하여 작동했습니다.


22
이 "수정"을 우연히 발견하는 다른 사람에게는 내가 <item name="android:windowIsTranslucent">false</item>설정 <item name="android:windowIsFloating">false</item>해야했고 작동하기 전에 설정 해야했습니다.
— th317erd

8
이것에 대한 해결책은 정확히 어디에 있습니까? 태그에 screenOrientation속성 이 없으며 activity충돌을 일으키는 유일한 것은 screenOrientation설정되어있는 동안 android:windowIsTranslucenttrue입니다.
— 안드로이드 개발자

위의 주석을 사용하지 않으면 작동하지 않습니다.
— Radesh의

나를 위해 반투명을 거짓으로 설정 <item name = "android : windowIsTranslucent"> false </ item>
— Tran Quan

필자의 경우 해결책은 AndroidManifest.xml의 활동에서 'android : theme'을 제거하는 것이 었습니다. 그러나 필요한 경우 'super.onCreate'전에 프로그래밍 방식으로 추가 할 수 있습니다. setTheme (R.style.Theme_AppCompat_Light_Dialog);
— Pavel Kataykin

133

Android Oreo (API 26)에서는 스타일이 아래 줄이있는 활동의 방향을 변경할 수 없습니다

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

또는

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

이 문제를 해결하는 몇 가지 방법이 있습니다.

1) 단순히 위의 줄을 제거하거나 false 로 설정하면 앱이 제대로 작동합니다.

2) 또는 먼저 해당 활동에 대한 매니페스트에서 아래 줄을 제거 할 수 있습니다

android:screenOrientation="portrait"

그런 다음 이 줄을 활동에 추가 해야합니다 (onCreate ()).

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

3) 당신은 새로운 만들 수 styles.xml있는 values-v26폴더와 당신이 추가 style.xml. ( AbdelHady 의견 감사합니다 )

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

25
Android PIE에서는 예상대로 작동합니다. 따라서 수표는 다음과 같아야합니다.android.os.Build.VERSION.SDK_INT != Build.VERSION_CODES.O
— Entreco

@avisper 당신은 전체 조건 코드를 공유하시기 바랍니다
— Manikandan K

API (26)를 실행하는 장치 / 에뮬레이터에서 옵션이 작동하지 않습니다, 나는 새로운했습니다 styles.xml에 values-v26사용하지 않으려면 android:windowIsTranslucent이 API 만.
— AbdelHady

@AbdelHady 좋은 솔루션, 난 내 대답에 추가하지만 옵션 2는,하지 작업을 수행하는 것이 왜 당신에게 코드와 벌금을 확인합니다 나의 제안 옵션
— Radesh

1
옵션 3을 부울 값 <bool name="allowWindowFullScreenTranslucent">true</bool>과 함께 사용 하여에서 참조했습니다 <item name="android:windowIsTranslucent">@bool/allowWindowFullScreenTranslucent</item>. 그런 다음 styles.xml에서 values-v26 아래로 설정하고 falsevalues ​​및 values-v27에서로 설정하십시오 true.
— drorsun

86

Android O 이상에서 설정하면이 오류가 발생합니다.

 android:screenOrientation="portrait"

매니페스트에서.

그 줄을 제거하고 사용하십시오

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

당신의 활동에서.

문제가 해결됩니다.


7
구글 측의 버그입니다. 향후 업데이트에서 수정해야합니다. setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 앱이 가로로 들어가는 것을 제한합니다. 모든 활동을 만들 때 이것을 사용하십시오.
— Ragesh Ramesh

44
<item name="android:windowIsTranslucent">true</item>상속받은 스타일에서 제거하면Theme.AppCompat.Light.NoActionBar 나를 위해 일했습니다.
— shadowsheep

16
이 솔루션은 작동하지만 splashScreenTheme가 엉망입니다. 부주의 한 롤아웃이 빈번한 경우 Google에 부끄러운 일이 있습니다.
— doctorram

3
이전 버전에서 작동했던 앱을 중단하려는 "의도"? 그 목표는 분명히 달성되었습니다. @Ragesh
— Oleg Gryb

9
Activity 클래스에서 방향을 설정하여 매니페스트 속성을 바꾸어도 문제가 해결되지 않습니다.
— rmgoncalo

75

Google은 onCreatev27 이후 Activity의 메소드 에서이 예외를 throw합니다 .의 의미는 다음과 같습니다. 활동이 반투명하거나 부동이면 방향은 부모 (배경) 활동에 의존해야하며 자체 결정을 내릴 수 없습니다.

android:screenOrientation="portrait"부동 또는 반투명 액티비티에서 제거 하지만 부모 (배경) 액티비티에서 방향을 수정 하더라도 여전히 부모에 의해 고정되어 있지만 이미 테스트했습니다.

하나의 특별한 상황 : 런처 활동에서 반투명하게 만들면 부모 (배경)가 없으므로 항상 장치와 함께 회전하십시오. 그것을 고치려면 <item name="android:windowIsTranslucent">true</item>스타일 을 바꾸는 다른 방법을 사용해야합니다 .


2
Android PIE를 실행하는 OnePlus에는이 문제가 없습니다. v27 이후가 아니라 v! = 28 일 때
— Entreco

이 문서에 대한 링크가 있습니까? 나는 그것을 찾을 수없는 것 같습니다.
— Shivam Verma

반투명 문제는 정말 미친, 감사합니다, 그것은 내 문제를 해결
— Abhishek Garg

'하나의 특별한 상황 ...'마지막 부분을 지적 해 주셔서 감사합니다
— guy_m을

이것이 정답입니다. 완벽하게 이해합니다!
— stoefln

29

전체 화면 투명 활동을 사용하는 경우 활동에 방향 잠금을 지정할 필요가 없습니다. 상위 활동의 ​​구성 설정이 사용됩니다. 따라서 부모 활동에 매니페스트가있는 경우 :

android : screenOrientation = "세로"

반투명 액티비티의 방향 잠금은 세로입니다.


나는 당신이 작은 오타를 만들었다 고 생각합니다. "전체 화면 반투명 액티비티 를 사용하면 부모 액티비티의 구성 설정이 필요합니다"^^
— Josselin

2
투명한 활동이 런처 활동이라면 (예 : 스플래시 화면)
— Bhupesh

2
이것은 모든 안드로이드 버전에 해당됩니까? 아니면 안드로이드 O 이상입니까?
— abhiank

하지만 이것이 사용중인 유일한 활동 인 경우에는 작동하지 않습니다 (예 : 서비스에서 시작)
— android developer

24

android:screenOrientation="behind"대신에 사용 했습니다 android:screenOrientation="portrait". 기본적으로 대화 상자 (활동에서)를 만들고 대화 상자 자체에서 오리엔테이션을 요청할 수 없습니다. 부모는 백그라운드에서 볼 수 있고 자체 레이아웃이 있기 때문에 부모 활동이 필요합니다.

"뒤에"활동 스택에서 바로 아래에있는 활동과 동일한 방향입니다.


내가 만든 활동을 투명하게하고 그 아래에있는 내용 (다른 앱 포함)을 표시하면서 현재 방향을 유지하려면 어떻게해야합니까? 내가 "뒤에"있게두면 여전히 다양한 경우에 방향을 바꿀 수 있습니다 ...
— android developer

19

실제로 작동하는 유일한 솔루션 :

변화:

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

에:

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

styles.xml에서

그러나 이로 인해 스플래시 화면 (시작시 흰색 화면)에 문제가 발생할 수 있습니다.이 경우 styles.xml에 다음 줄을 추가하십시오.

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

windowIsTranslucent 줄 바로 아래에 있습니다.

이전 팁이 작동하지 않는 경우 마지막 기회 : 27 대신 SDK 26을 타겟팅하십시오.


1
대상 SDK를 27 대신 26으로 변경하면 나에게 도움이되었습니다. windowIsTranslucent를 변경하지 않았습니다.
— Cliche818

이것은 targetSDK를 사용하여 나를 위해 일했습니다 : 27. 스플래시 화면이 구성되어 있기 때문에 특히 중요합니다.
— Leonardo G.

18

을 사용해야하는 경우 setRequestedOrientation()Android 8.0에서 windowIsTranslucent 속성을 희생 할 수는 없습니다.

values\styles.xml 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 API 레벨 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 API 레벨 27 이상 (> 8.0)

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

14

많은 사람들이 문제를 해결 했으므로 문제의 원인에 대해 이야기하겠습니다.

예외 로그에 따르면 :

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

위의 코드 분석에 따르면 SCREEN_ORIENTATION_LANDSCAPE, SCREEN_ORIENTATION_PORTRAIT 및 기타 관련 속성을 사용할 때 TargetSdkVersion> = 27 인 경우 windowIsTranslucent, windowIsFloating 및 windowSwipeToDismiss 토픽 속성을 사용하면 예외가 트리거됩니다.

문제가 발견되면 TargetSdkVersion을 변경하거나 필요에 따라 테마의 관련 속성을 제거 할 수 있습니다.


1
이 시점에서 마스터 코드를 확인하면 이미 프레임 워크에서 제거되었습니다.
— Erick M. Sprengel

이 부분의 소스 코드에 대한 링크를 보여 주시겠습니까? 특정 방향의 활동을하고 투명한 배경을 가질 수있는 해결 방법이 있습니까? 따라서 그 뒤에 무엇이 있는지 (다른 앱 포함) 볼 수 있습니까?
— 안드로이드 개발자

8

가장 많은 답변에 동의 할 수 없습니다.

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

<item name = "android : windowIsTranslucent"> false </ item> <item name = "android : windowFullscreen"> true </ item> => Android 8.0에서 수정되었습니다. 여전히 매니페스트에 screenOrientation을 남길 수 있습니다.
— Frank

1
windowIsTranslucent와 동일하게 작동하지 않습니다. 이제 활동의 배후에있는 내용을 볼 수 없기 때문입니다.
— 안드로이드 개발자

8

android:screenOrientation="portrait"Manifiest.xml 에서이 행 을 제거하십시오.

해당 액티비티는 이전 액티비티에서 오리엔테이션을 가져 오므로가있는 오리엔테이션을 적용 할 필요가 없습니다 <item name="android:windowIsTranslucent">true</item>.


이전 활동이 현재 활동에서 원하는 방향과 다른 방향을 가지면 어떻게됩니까?
— ClassA

6

대상 SDK가 파이 (api 레벨 28.0)이고 windowIsTranslucent가 true 인 경우

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

당신은 방향에 접근하려고합니다. 안드로이드 오레오 8.0 (api 레벨 26)에 문제가 있습니다.이 문제를 해결하는 두 가지 방법이 있습니다

  1. 방향을 제거
  2. 또는 windowIsTranslucent를 false로 설정하십시오.

다음과 같이 매니페스트에서 방향을 설정하는 경우

android:screenOrientation="portrait"

또는 이와 같은 활동 수업에서

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

두 장소에서 양식을 제거하십시오.

u windowIsTranslucent를 true로 설정하면 부모 활동에서 방향을 취합니다.


5

매니페스트 파일에서 두 번째 활동 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" />

5

Manifiest.xml에서 활동 방향 설정

android:screenOrientation="unspecified"

또는 세로 방향으로 제한

예를 들어 Activity, In 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);
}

4

나는 같은 문제가 있었고 해결책은 선을 제거하는 것이었다

android:screenOrientation="portrait"

그런 다음 활동에 이것을 추가하십시오.

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

1
스택 오버플로에서 영어를 사용하십시오. 감사!
— 마이클 마이어스

3

약간의 연구를 한 후에이 문제는 Google 버그로 인한 것일 수 있습니다. 나를 위해 Activities onCreate 메서드 에이 줄을 남길 수있었습니다.

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

내 targetSdkVersion을 26으로 변경했습니다. onCreate에 해당 줄이 있으면 여전히 targetSdkVersion이 27로 설정되어있는 동안 충돌이 발생했습니다. 지금까지 다른 솔루션이 작동하지 않았기 때문에 이것이 임시 수정으로 작동한다는 것을 알았습니다. 지금.


1
이 사람은 26 targetSdkVersion을 설정하여 나를 위해 일한, 안드로이드 : screenOrientation = "세로"와 <항목 이름 = "안드로이드 : windowIsTranslucent"> 진정한 </ 항목>
— Siripan에

@siripan도 나를 위해
— Acauã Pitta

:하지만 결국 당신은 (28)에 올해 targetSdkVersion을 설정해야합니다 support.google.com/googleplay/android-developer/answer/... . 무엇을 하시겠습니까?
— 안드로이드 개발자

3

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- 충돌을 일으키는 위에서 언급 한 속성 중 하나를 제거하십시오.

2- 필요에 따라 활동 방향을 다음 값 중 하나로 변경하십시오. unspecified또는 behind다음에서 찾을 수 있습니다. android : screenOrientation에 대한 Google 참조 `

3- 프로그래밍 방식으로 런타임에 방향 설정


이 솔루션을 시도했지만 앱이 여전히 충돌합니다. 세로 투명 활동이 필요하므로이 옵션이 모두 필요합니다. 매니페스트 화면에서 설정하려고합니다. 방향을 지정하지 않았지만 운이 없습니다.
— anber

아니요. 매니페스트에서 방향을 전혀 제거하려고 시도했지만 활동을 전체 화면으로 만들었지 만 여전히 충돌합니다. 하나의 장치에서만-명예 9 라이트. 삼성에서는 정상적으로 작동합니다.
— anber

프로그래밍 방식으로 방향을 설정하면 충돌이 발생합니다. 정확히 어떻게 사용 했습니까?
— 안드로이드 개발자

@androiddeveloper 소스 코드에 어떻게 액세스 할 수 있습니까?! 난 당신이 무슨 짓을했는지 볼 수 있어야합니다
— 하메드 Jaliliani에게

@HamedJaliliani 프로그래밍 방식으로 설정하는 방법은 다음과 같습니다.`setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);`
— 안드로이드 개발자

3

나는 최근에 문제에 직면했으며 여기에 해결책이 있습니다.

안드로이드 매니페스트 파일에서 설정 한 화면 방향 매개 변수를 변경할 필요가 없습니다.

두 개의 폴더를 추가하십시오.

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

그런 다음 styles.xml 및 themes.xml 파일을 복사하십시오.

다음 매개 변수를 TRUE에서 FALSE로 변경하십시오.

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

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

작동합니다.

안드로이드 8.0의 일반적인 버그


2

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

이미지를 캡처하거나 갤러리에서 이미지를 가져 오려고 할 때이 오류가 발생했습니다.

 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>

windowIsFloating와 같은 충돌을 일으켜 작동하지 않습니다 windowIsTranslucent.
— 안드로이드 개발자

2

8.0 이상에서 예외가 제거되었습니다.

8.0.0 예외 발생


안드로이드 7, 7.1, 8.0, 8.1이 모든 문제가
— 하메드 Jaliliani

appInfo.targetSdkVersion > O예외를 던져
— Mingo

targetSDK 버전을 확인 중 입니다. 장치가 실제로 실행중인 SDK 버전은 중요하지 않습니다 .Android O (28)에 대해 컴파일하고 있지만 해당 버전의 플랫폼 규칙을 따르지 않습니다.
— Benjiko99

2

나를 위해 일한 유일한 것은 변화했다

android:screenOrientation="portrait"

에

android:screenOrientation="unspecified"

모든 반투명 활동에 대한 매니페스트.

이렇게하면 반투명 액티비티가의 부모 액티비티에서 방향을 상속하는 것처럼 보이기 때문에 모든 API 버전과 호환됩니다 targetApi: 28.

스타일은를 포함하여 그대로 둘 수 있습니다 <item name="android:windowIsTranslucent">true</item>.


이 솔루션을 시도했지만 앱이 여전히
— 중단됨

그러나 방향을 설정하는 기능을 잃어 버립니다
— Android 개발자

@ androididdeveloper : 오리엔테이션을 이해하는 방식은 부모 활동에서 상속됩니다. 이런 방식으로 작동하지 않는 반투명 액티비티에 대해 다른 방향을 명시 적으로 설정하려면 ...
— Max Heimer

때때로 이전 활동을 제어 할 수 없습니다. 때로는 사용자가 현재보고있는 것 위에 투명한 것을 보여주고 싶을 때가 있습니다. 그래서 이것은 도움이되지 않습니다 :(
— Android 개발자

2

사용하다

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>

1

이것이 Google의 버그인지 의도 된 동작인지는 모르지만 Gradle에서 compileSdkVersion 및 targetSdkVersion을 다시 26으로 변경하여 (적어도 일시적으로) 해결했습니다 ...


3
targetsdk 레벨을 낮추지 않아야합니다. 앱이 결국 Play 스토어에서 차단됩니다. 항상 최신 Android Api 레벨 android-developers.googleblog.com/2017/12/…를
— Shmuel

1
@Shmuel : 잘못되었습니다. 상점에서 26을 타겟팅하고 28에서 사용할 수 있습니다.
— Regis_AG

1
당신이 강제로 업데이트 할 때 당신은 당신이 고통의 세계에있을 것 이전 API 레벨을 대상으로하여 응용 프로그램을 만든다면, 나는 '결국'쓴 수정
— 쉬 무엘

이것은 해결책이 아니라 해결책입니다. 어느 날 앱을 28로 마이그레이션해야합니다.
— sud007

1

문제를 해결하지 못한 경우 다음과 같이 매니페스트에 광고 활동을 등록하십시오.

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

또한 최신 SDK 버전으로 업데이트해야합니다.


1

아마도 대화 상자 (비 전체 화면)와 같은 활동을 표시하므로 Manifest 또는 코드에서 screenOrientation 을 제거하십시오 . 문제가 해결됩니다.


흠, 매우 이상합니다. 다른 안드로이드 버전에서 앱을 실행 해보십시오. 결과가 어떤 도움이 될지 알아보십시오 ...
— Balflear

1

이것은 27 이후에 발생했으며 targetSdkVersion 26 replace를 사용하고 Google이 수정하기를 기다립니다.


2
답변을 게시 할 때 참조 (링크 또는 인용)를 제공하십시오. 따라서 미래의 사용자는 쉽게 이해할 수 있습니다. 또한 SO 커뮤니티에 오신 것을 환영합니다 .
— Mohammedsalim Shivani

@MohammedsalimShivani 여기 : issuetracker.google.com/issues/68454482#comment4 "Google 엔지니어링 팀에서이 문제를 해결했습니다. 향후 Android 버전에서 제공 될 예정이므로 출시 정보를 주시하십시오."
— 안드로이드 개발자

이것은 나쁜 충고입니다
— Chris

0

전체 화면이 아닌 요소에서 "초상화"태그를 제거했으며 모든 것이 제대로 작동했습니다.

android:screenOrientation="portrait"

0

활동의 스타일을 확인하고 반투명 관련 항목을 사용하지 않는 경우 스타일을 대체로 변경하십시오. 이 문제를 해결할 수 있습니다.

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

0

android:screenOrientation="portrait"아래 코드를 제거 하고 onCreate에 추가 하여이 문제를 해결했습니다.

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>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.