java.lang.IllegalStateException: Yalnızca tam ekran opak etkinlikler yönlendirme isteyebilir


187

Android 8.0 Oreo java.lang.IllegalStateException kişi defterinden kişileri alırken sorunla karşı karşıya: Sadece tam ekran opak etkinlikler yönlendirme talep edebilir

Telefon iletişim kitabından aktivitemdeki kişiyi almaya çalışıyorum ve Lollipop, Marshmallow, Nougat, vb.İçin mükemmel çalışıyor, ancak bana böyle Oreo için hata veriyor lütfen bana yardım edin. Kodum aşağıda.

Demo Kodu: -

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

Hata Günlüğü: -

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




1
Tüm önerileri denedim ama kimse benim için çalışmıyor.
Shubham Sejpal

1
manifest'te android: screenOrientation = "portrait" mu kullanıyorsunuz?
Ragesh Ramesh

Yanıtlar:


63

Hedef sdk 28 olduğunda sorun oluyor gibi görünüyor. Yani birçok seçenek denedikten sonra nihayet bu çalıştı.

<activity
            android:name=".activities.FilterActivity"
            android:theme="@style/Transparent"
            android:windowSoftInputMode="stateHidden|adjustResize" />

stili: -

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

Not: parent = "Theme.AppCompat.Light.NoActionBar" api 28 için gereklidir. Daha önce api 26'da başka bir şey vardı. Harika çalışıyordum ama 28'de sorun vermeye başladı. Umarım burada birine yardımcı olur. DÜZENLEME: Bazıları sadece <item name="android:windowIsTranslucent">false</item> and <item name="android:windowIsFloating">false</item> çalışarak ayarlayarak çözüm çalışmasını uygulama şekline bağlı olabilir.


23
Bu "düzeltme" üzerinde tökezleyen herkes için ben ayarlamak <item name="android:windowIsTranslucent">false</item>ve ayrıca <item name="android:windowIsFloating">false</item>işe yaramadan önce ayarlamak zorunda kaldı .
th317erd

8
Bunun çözümü tam olarak nerede? Hiçbir yoktur screenOrientationöznitelik activityetiketi ve kilitlenme olduğunu neden tek şey screenOrientationise ayarlanan android:windowIsTranslucenttrue olarak ayarlanır.
android geliştirici

Yukarıdaki yorumlar kullanılmadıkça bu çalışmaz. Yukarıdaki yorumları ve daha fazlasını kapsayan Radesh'in cevabına bakınız ve açıktır
arberg

Yarı saydam benim için yanlış çalışmaya ayarlama <item name = "android: windowIsTranslucent"> false </item>
Tran Quan

Benim durumumda, çözüm AndroidManifest.xml'deki Etkinlikten 'android: theme' kaldırmaktı. Ancak ihtiyacınız varsa, 'super.onCreate' öğesinden önce programlı olarak ekleyebilirsiniz: setTheme (R.style.Theme_AppCompat_Light_Dialog);
Pavel Kataykin

133

Android Oreo'da (API 26), stilin altında satır (lar) içeren Etkinlik için yön değiştiremezsiniz

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

veya

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

Bunu çözmenin birkaç yolu var:

1) Yukarıdaki satır (lar) ı kaldırabilir (veya yanlış değerine dönüştürebilirsiniz ) ve uygulamanız iyi çalışır.

2) Veya ilk önce bu etkinlik için manifest'ten aşağıdaki satırı kaldırabilirsiniz

android:screenOrientation="portrait"

Ardından bu satırı etkinliğinize eklemeniz gerekir (onCreate () içinde)

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

3) Yeni oluşturabilir styles.xmliçinde values-v26klasöründe ve bu ekleyin style.xml. ( AbdelHady yorumuna teşekkürler )

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

25
Android PIE'de bu beklendiği gibi çalışıyor. Yani çek gerçekten şöyle olmalı:android.os.Build.VERSION.SDK_INT != Build.VERSION_CODES.O
Entreco

@avisper lütfen tam koşul kodunu paylaşabilir misiniz
Manikandan K

API 26 çalıştıran bir cihazda / emülatörde seçenek 2 çalışmıyor, yalnızca söz konusu API için devre dışı bırakmak için yeni bir styles.xmlgiriş yapmak zorunda kaldım . values-v26android:windowIsTranslucent
AbdelHady

@AbdelHady İyi bir çözüm, cevabımı ekleyeceğim, ancak kod 2'yi kontrol etmeliyim ve seçenek 2 neden işe yaramıyor, önerilen seçeneğim,
Radesh

1
Seçenek 3'ü bir boole değeriyle kullandım <bool name="allowWindowFullScreenTranslucent">true</bool>ve buna değindim <item name="android:windowIsTranslucent">@bool/allowWindowFullScreenTranslucent</item>. Sonra styles.xml dosyasında değerleri-v26 olarak falseve değerlerde ve değerlerde-v27 olarak ayarlayın true.
drorsun

87

Android O ve sonraki sürümlerde bu hata,

 android:screenOrientation="portrait"

Manifest Şehrindeki oteller.

Bu satırı kaldırın ve kullanın

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

faaliyetinizde.

Bu, sorununuzu çözecektir.


7
Google tarafında bir hata. Gelecekteki güncellemelerde düzeltilmelidir. setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); uygulamanızın yatay görünmesini kısıtlar. Tüm etkinliklerinizi oluştururken bunu kullandığınızdan emin olun.
Ragesh Ramesh

44
Çıkarma <item name="android:windowIsTranslucent">true</item> benim stilinden devralır o Theme.AppCompat.Light.NoActionBar benim için çalıştı.
shadowsheep

16
Bu çözüm işe yarıyor, ancak splashScreenTheme'mi karıştırıyor. Sık sık özensiz
sunumlar

3
Önceki sürümlerde çalışan uygulamaları kırmak için "amaçlandı" mı? Bu hedefe kesinlikle ulaşıldı. En azından @Ragesh
Oleg Gryb

9
Activity sınıfındaki yönlendirmeyi ayarlayarak manifest özniteliğini değiştirmek sorunu çözmez.
rmgoncalo

75

Google onCreate, v27'den sonra Etkinlik'in yöntemine bu istisnayı atar , anlamları: Bir Etkinlik yarı saydam veya yüzensa, yönlendirmesi ebeveyn (arka plan) Etkinliğine dayanmalıdır, kendi başına karar veremez.

Kaldırmak bile android:screenOrientation="portrait"üst (arka plan) Faaliyet yüzen veya yarı saydam Aktivite ama düzeltme yöneliminden, hala ebeveyn tarafından sabittir, ben zaten test ettik.

Özel bir durum: Bir başlatıcı Etkinliğinde yarı saydam yaparsanız, üst öğesi (arka plan) yoktur, bu nedenle her zaman cihazla birlikte döndürün. Düzeltmek istiyorum, <item name="android:windowIsTranslucent">true</item>stili değiştirmek için başka bir yol almalısınız.


2
Android PIE çalıştıran OnePlus'ımda bu sorun yok. Yani v27'den sonra değil, ama v! = 28
Entreco

Bunun için belgelere bir bağlantınız var mı? Onu bulamıyorum.
Shivam Verma

yarı saydam sorun gerçekten çılgınca, teşekkürler, sorunumu düzeltir
Abhishek Garg

Son bölüm olan 'Bir özel durum ...'
dikkatinizi çektiğiniz

Bu kabul edilen cevap olmalı. Mantıklı gelir!
stoefln

29

Tam ekran saydam bir etkinlik kullanıyorsanız, etkinlikte yönlendirme kilidini belirtmenize gerek yoktur. Üst etkinliğin yapılandırma ayarlarını alacaktır. Üst etkinliğin bildirimde varsa:

android: screenOrientation "portre" =

yarı saydam etkinliğiniz aynı yönlendirme kilidine sahip olacaktır: portre.


Sanırım küçük bir yazım hatası yaptınız: "tam ekran saydam bir etkinlik kullanıyorsanız , üst etkinliğinin yapılandırma ayarını alacaktır" ^ ^
Josselin

2
Şeffaf etkinliğim başlatıcı etkinliğimse (örn. Açılış ekranı)
Bhupesh

2
Bu tüm android sürümleri için geçerli mi? Yoksa sadece Android O ve üstü mü?
abhiank

Yine de bu, kullanılan tek Etkinlik ise işe yaramaz (örnek: bir Hizmetten başlatma)
android geliştirici

24

Bunun android:screenOrientation="behind"yerine kullandım android:screenOrientation="portrait". Temel olarak, bir iletişim kutusu oluşturdunuz (bir etkinlikte) ve iletişim kutusu kendi başına yönlendirme isteyemez (bunu yapmak için üst etkinliğe ihtiyaç duyar (bir üst öğe arka planda görünür ve kendi düzenine sahip olduğundan).

"arkada" Etkinlik yığınında hemen altındaki etkinlikle aynı yönelim.


Mevcut yönlendirmede kalırken oluşturduğum Etkinliğin altında (diğer uygulamalar dahil) ne olduğunu gösteren şeffaf olmasını istersem ne olur? Ben "arkasında" kalmasına izin, hala çeşitli durumlarda yönünü değiştirebilirsiniz ...
android geliştirici

19

Gerçekten işe yarayan tek çözüm:

Değişiklik:

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

için:

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

styles.xml içinde

Ancak bu, açılış ekranınızla ilgili bir soruna neden olabilir (başlangıçta beyaz ekran) ... Bu durumda, styles.xml dosyasına aşağıdaki satırı ekleyin:

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

windowIsTranslucent satırının hemen altında.

Önceki ipuçları işe yaramazsa son şans: SDK 26'yı hedefleyin o 27.


1
Hedef SDK'yı 27 yerine 26 olarak değiştirmek benim için çalıştı. WindowIsTranslucent değiştirilmedi.
Cliche818

Bu benim için targetSDK: 27'yi kullanarak işe yaradı. Bir açılış ekranı yapılandırıldığından özellikle önemlidir.
Leonardo G.

18

Eğer kullanımına varsa setRequestedOrientation(), hiçbir şekilde ancak Android 8.0 üzerinde windowIsTranslucent niteliğini feda

values\styles.xml api seviyesi 25- için (<8.0)

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

values-v26\styles.xml api seviye 26 için (= 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 seviyesi 27+ için (> 8.0)

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

14

Birçok insan bir düzeltme yaptı, bu yüzden sorunun kaynağı hakkında konuşacağım.

İstisna günlüğüne göre :

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'da özel durumu tetikleyen kod

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

Yukarıdaki kod analizine göre, TargetSdkVersion> = 27 olduğunda, SCREEN_ORIENTATION_LANDSCAPE, SCREEN_ORIENTATION_PORTRAIT ve diğer ilgili nitelikler kullanıldığında, windowIsTranslucent, windowIsFloating ve windowSwipeToDismiss konu özniteliklerinin kullanımı bir istisna tetikleyecektir.

Sorun bulunduktan sonra, TargetSdkVersion'ı değiştirebilir veya temanın ilgili niteliklerini ihtiyaçlarınıza göre kaldırabilirsiniz.


1
Şu anda master'daki kodu kontrol ederken, zaten çerçeveden kaldırıldı: mirror / platform_frameworks_base / commit / e83f34cde79c51efb66f31f2770c2e8e572e96db # diff-a9aa0352703240c8ae70f1c83add4bc8 Teslim mesajını görmek ilginç.
Erick M. Sprengel

Lütfen bu bölümün kaynak koduna bir bağlantı gösterebilir misiniz? Belirli bir yöne sahip bir Etkinliğe sahip olmamı ve şeffaf bir arka plana sahip olmamı sağlayacak herhangi bir geçici çözüm var mı, böylece arkasında ne olduğunu görmek mümkün olacak (diğer uygulamalar dahil)?
android geliştirici

8

En çok oy alan yanıtı kabul edemem, çünkü

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

hataya neden olur

java.lang.IllegalStateException: Yalnızca tam ekran opak etkinlikler yönlendirme isteyebilir

ama bu benim için çalışıyor

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

ve etkinlikleriniz için kullandığınız zaman

InterstitialActivity extends AppCompatActivity

AndroidManifest.xml'de

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

<item name = "android: windowIsTranslucent"> false </item> <item name = "android: windowFullscreen"> true </item> => bu benim için android 8.0'da düzeltildi. Yine de manifest içinde screenOrientation bırakabilirim.
Frank

1
Bu windowIsTranslucent ile aynı şekilde çalışmaz, çünkü artık Aktivitenin arkasında ne olduğunu göremezsiniz.
android geliştirici

8

Sadece bu satırı kaldır android:screenOrientation="portrait"Manifiest.xml dosyasındaki etkinlik yeterlidir

Bu etkinlik önceki etkinliğinden yönlendirme alacaktır, bu nedenle sahip olduğu yönlendirmeyi uygulamaya gerek yoktur <item name="android:windowIsTranslucent">true</item>.


Önceki etkinliğin geçerli etkinlikte istediğinizden farklı bir yönü varsa ne olur?
ClassA

6

hedef sdk pasta (api seviyesi 28.0) ve windowIsTranslucent doğru olduğunda görünüyor

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

ve yönlendirmeye erişmeye çalışıyorsunuz. sorun android oreo 8.0 (api seviye 26) ile geliyor bunu çözmek için iki yol vardır

  1. yönlendirmeyi kaldır
  2. veya windowIsTranslucent öğesini false olarak ayarlayın

yönelimi böyle bir şekilde ayarlıyorsanız

android:screenOrientation="portrait"

veya bunun gibi aktivite sınıfında

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

her iki yerden form kaldır.

ve windowIsTranslucent değerini true olarak ayarladığında gözlemlenir, üst etkinliğinden yönlendirme alır.


5

manifest dosyasında parentActivityName adlı ikinci etkinliği ilk etkinlik olarak ayarlayın ve screenOrientation parametresini ikinci etkinliğe kaldırın. bu, ilk etkinliğinizin ebeveyn olduğu ve ikinci etkinliğinizin yönlendirilmesine karar verdiğiniz anlamına gelir.

<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 dosyasında faaliyet yönlendirmesini ayarlamanız yeterlidir

android:screenOrientation="unspecified"

VEYA Dikey Yönlendirme ile sınırlı

Etkinlik, onCreateyöntem çağrısında önce super.onCreate(...)ör.

@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

Aynı sorunu yaşadım ve çözümüm çizgiyi ortadan kaldırmaktı

android:screenOrientation="portrait"

ve ardından bunu etkinliğe ekleyin:

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

1
Lütfen Stack Overflow'da İngilizce kullanın. Teşekkürler!
Michael Myers

3

Biraz araştırma yaptıktan sonra, bu sorunun bir Google hatasından kaynaklandığı anlaşılıyor. Benim için, bu çizgiyi Etkinlikler onCreate yöntemimde bırakabildim:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

AND targetSdkVersion'ımı 26 olarak değiştirdim. OnCreate'ımda bu satırın olması, targetSdkVersion'um hala 27 olarak ayarlanmışken hala bir çökme ile sonuçlandı. şimdi.


1
Bu, targetSdkVersion'ı 26 olarak ayarlayarak benim için çalıştı, android: screenOrientation = "portre" ve <item name = "android: windowIsTranslucent"> true </item>
siripan 19:18

@siripan benim için de
Acauã Pitta

Ancak sonuçta targetSdkVersion'ı bu yıl 28 olarak ayarlamanız gerekecek: support.google.com/googleplay/android-developer/answer/… . Ne yapacaksın?
android geliştirici

3

Android sürümleri 7 (Api seviyeleri 24,25) ve 8 (api seviyeleri 26,27) içindeki style.xml dosyası içindeki Temalar arasında bir çatışma (hata).

android:screenOrientation="portrait" : AndroidManifest.xml dosyasında belirli bir etkinliğin içinde (kilitleniyor)

&

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

style.xml içindeki bu etkinliğe uygulanan temada

İhtiyacınıza göre bu yollarla çözülebilir:

1- Çelişkili yukarıda belirtilen mülklerin kaldırılması

2- Etkinlik yönlendirmesini şu değerlerden birine ihtiyacınız olduğu gibi değiştirin: unspecifiedveya behindbenzeri bilgileri burada bulabilirsiniz: android için Google başvurusu: screenOrientation `

3- Yönü çalışma zamanında programlı olarak ayarlayın


Bu çözümü denedim, ancak uygulama hala çöküyor: Dikey şeffaf aktiviteye ihtiyacım var, bu yüzden her iki seçeneğe de ihtiyacım var. Manifest ekranında denendi Yön belirtilmedi, ancak şans yok.
anber

Hayır. Manifest'te oryantasyonu kaldırmayı ve etkinliği tam ekran yapmaya çalıştım, ancak yine de çöküyor. Sadece 1 cihazda - 9 lite onurlandırın. Samsung'da iyi çalışıyor.
anber

Yönün programlı olarak ayarlanması da çökmeye neden olur. Tam olarak nasıl kullandınız?
android geliştirici

@androiddeveloper kaynak kodunuza nasıl erişebilirim ?! Ne yaptığını
görmeliyim

@HamedJaliliani Programlı olarak ayarlamak şu şekildedir, örneğin: `setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);` `
android geliştirici

3

Kısa bir süre önce sorunla karşılaştım ve çözüm burada.

Android manifest dosyasında ayarladığınız ekran yönü parametresini değiştirmenize gerek yok.

Sadece iki klasör ekleyin

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

Ardından styles.xml ve themes.xml dosyanızı oraya kopyalayın.

ve aşağıdaki parametreleri TRUE yerine FALSE olarak değiştirin.

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

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

Çalışacak.

Android 8.0'ın yaygın bir hatası


2

Ben windowIsTranslucent 'true' kullanarak ve zorla yönünü ayarlamak durumunda sadece SDK 26 (8.0.0) bu sorunla karşı karşıya:

İşte çözüm:

    @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>

Ama sonra, oryantasyonun istediğiniz gibi ayarlanmış olmasının işlevselliğini kaybedersiniz.
android geliştirici

2

Resim çekmeye veya galeriden resim çekmeye çalıştığımda bu hatayı alıyordum benim için işe yarayan her ikisini de kaldırmak

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

ve

android:screenOrientation="portrait"

şimdi aktivitem bu temayı kullanıyor:

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

Bu windowIsFloatingaynı çökmeye neden olduğu için çalışmaz windowIsTranslucent.
android geliştirici

2

sadece 8.0.0 istisnayı atar, 8.0'ın üstünde istisnayı kaldırır

8.0.0 istisnayı atmak


Android 7, 7.1, 8.0, 8.1'de bu sorun var
Hamed Jaliliani

appInfo.targetSdkVersion > Oistisna atmak
Mingo

targetSdk sürümünü kontrol ediyor . Cihazın hangi sdk sürümünü çalıştırdığı önemli değil, Android O'ya (28) karşı derliyorsunuz, ancak platformun bu sürümünün kurallarına uymuyorsunuz.
Benjiko99

2

Benim için çalışan tek şey değişiyordu

android:screenOrientation="portrait"

için

android:screenOrientation="unspecified"

tüm saydam etkinlikler için manifest'te.

Bu şekilde, yarı saydam etkinlik, yönünü ana etkinliğinden itibaren devralmış gibi göründüğü için tüm API sürümleriyle uyumludur targetApi: 28.

Stil dahil olduğu gibi bırakılabilir <item name="android:windowIsTranslucent">true</item>.


Bu çözümü denedim, ancak uygulama hala çöküyor
anber

Ama sonra yönünü ayarlama işlevini kaybedersiniz
android geliştirici

@androiddeveloper: Oryantasyonu anlama biçimim, ana etkinlikten devralınacak. Yarı saydam aktivite üzerinde bu şekilde işe yaramayacak şekilde başka bir yönlendirme ayarlamak istiyorsanız ...
Max Heimer

Bazen önceki Etkinliğin kontrolünü elinde tutamazsınız. Bazen şeffaf olanı kullanıcının şu anda gördüklerinin üstünde göstermek istersiniz. Bu yardımcı olamaz :(
android geliştirici

2

kullanım

android:screenOrientation="behind"

Ve Tema

<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

Bunun Google'dan bir hata mı yoksa amaçlanan bir davranış mı olduğunu bilmiyorum ama (en azından anlık olarak) Gradle'da 26'ya compileSdkVersion ve targetSdkVersion'ı değiştirerek çözdüm ...


3
Targetsdk seviyesini düşürmemelisiniz. Uygulamanız sonunda oyun mağazasından engellenecek. Her zaman en son Android Api seviyesini hedefleyin android-developers.googleblog.com/2017/12/…
Shmuel

1
@Shmuel: yanlış. 26'yı hedefleyebilir ve 28'de mağazada bulabilirsiniz.
Regis_AG

1
Doğru, 'sonunda' yazdım, eğer uygulamanızı daha eski bir api seviyesini hedeflerseniz, güncellemeye zorlandığınızda acı dolu bir dünyada olacaksınız
Shmuel

Bu bir çözüm değil, bir çözümdür. Bir gün 28 ve dolayısıyla uygulamanızı taşımak zorunda!
sud007

1

Sorununuzu çözmediyseniz, reklam etkinliğini manifest'e şu şekilde kaydetmeniz yeterlidir:

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

Ayrıca sdk'nin en son sürümüne güncellemeniz gerekir.


1

Muhtemelen Dialog (non-tam ekran) gibi bakıyor Aktivite gösteren, bu yüzden kaldırmak screenOrientation dan Manifest veya koddan. Bu sorunu çözecektir.


Hmm çok garip, benim için durum buydu. Uygulamayı farklı Android sürümlerinde çalıştırmayı deneyin, bunun size yardımcı olabileceği sonucun ne olacağını görün ...
Balflear

1

bu 27 sonra oldu, targetSdkVersion 26 değiştirin kullanın, google sabitlemek için bekleyin


2
Lütfen yanıt gönderirken herhangi bir referans (bağlantı veya alıntı) sağlayın. Böylece gelecekteki kullanıcılar kolayca anlayabilir. Ayrıca, SO Topluluğuna hoş geldiniz .
Mohammedsalim Shivani

@MohammedsalimShivani İşte: issuetracker.google.com/issues/68454482#comment4 "Mühendislik ekibimiz bu sorunu düzeltti. İlerideki bir Android sürümünde mevcut olacak, bu yüzden lütfen sürüm notlarına göz atın ."
android geliştirici

Bu kötü bir tavsiye
Chris

0

Sadece "portre" etiketleri tam ekran olmayan öğelerden kaldırdım ve her şey yolunda gitti.

android:screenOrientation="portrait"

0

Lütfen Faaliyetinizin stilini kontrol edin ve Yarı Saydam ile ilgili herhangi bir şey kullanmadığınızdan emin olun, stili alternatif olarak değiştirin. Böylece bu sorunu çözebiliriz.

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

0

Bu sorunu kaldırarak android:screenOrientation="portrait"çözdüm ve onCreate'a aşağıdaki kodu ekledim

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

tema özelliklerim

<item name="android:windowIsTranslucent">true</item>
<item name="android:windowDisablePreview">true</item>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.