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.xmlvalues-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.