java.lang.IllegalStateException: केवल फुलस्क्रीन अपारदर्शी गतिविधियाँ अभिविन्यास का अनुरोध कर सकती हैं


187

Android 8.0 Oreo java.lang.IllegalStateException में संपर्क पुस्तक से संपर्कों को पुनर्प्राप्त करते समय मैं समस्या का सामना कर रहा हूं: केवल फुलस्क्रीन अपारदर्शी गतिविधियां अभिविन्यास का अनुरोध कर सकती हैं

मैं फोन संपर्क पुस्तक से अपनी गतिविधि में संपर्क पाने की कोशिश कर रहा हूं और यह लॉलीपॉप, मार्शमैलो, नूगाट, आदि के लिए एकदम सही काम करता है, लेकिन यह मुझे ओरेओ के लिए त्रुटि देगा जैसे कि कृपया मेरी मदद करें। मेरा कोड यहाँ नीचे है।

डेमो कोड: -

private void loadContacts() {
            contactAsync = new ContactLoaderAsync();
            contactAsync.execute();
        }

        private class ContactLoaderAsync extends AsyncTask<Void, Void, Void> {
            private Cursor numCursor;

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                Uri numContacts = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
                String[] numProjection = new String[]{ContactsContract.CommonDataKinds.Phone.CONTACT_ID, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.TYPE};
                if (android.os.Build.VERSION.SDK_INT < 11) {
                    numCursor = InviteByContactActivity.this.managedQuery(numContacts, numProjection, null, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " COLLATE NOCASE ASC");
                } else {
                    CursorLoader cursorLoader = new CursorLoader(InviteByContactActivity.this, numContacts, numProjection, null, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " COLLATE NOCASE ASC");
                    numCursor = cursorLoader.loadInBackground();
                }

            }

            @Override
            protected Void doInBackground(Void... params) {
                if (numCursor.moveToFirst()) {
                    try {
                        final int contactIdIndex = numCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID);
                        final int displayNameIndex = numCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
                        final int numberIndex = numCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
                        final int typeIndex = numCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE);
                        String displayName, number, type;
                        do {
                            displayName = numCursor.getString(displayNameIndex);
                            number = numCursor.getString(numberIndex);
                            type = getContactTypeString(numCursor.getString(typeIndex), true);
                            final ContactModel contact = new ContactModel(displayName, type, number);
                            phoneNumber = number.replaceAll(" ", "").replaceAll("\\(", "").replaceAll("\\)", "").replaceAll("-", "");

                            if (phoneNumber != null || displayName != null) {
                                contacts.add(phoneNumber);
                                contactsName.add(displayName);
                                contactsChecked.add(false);

                                filterdNames.add(phoneNumber);
                                filterdContactNames.add(displayName);
                                filterdCheckedNames.add(false);
                            }
                        } while (numCursor.moveToNext());
                    } finally {
                        numCursor.close();
                    }
                }


                Collections.sort(contacts, new Comparator<String>() {
                    @Override
                    public int compare(String lhs, String rhs) {
                        return lhs.compareToIgnoreCase(rhs);
                    }
                });

                InviteByContactActivity.this.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        mContactAdapter.notifyDataSetChanged();
                    }
                });

                return null;
            }
        }

        private String getContactTypeString(String typeNum, boolean isPhone) {
            String type = PHONE_TYPES.get(typeNum);
            if (type == null)
                return "other";
            return type;
        }

        static HashMap<String, String> PHONE_TYPES = new HashMap<String, String>();

        static {
            PHONE_TYPES.put(ContactsContract.CommonDataKinds.Phone.TYPE_HOME + "", "home");
            PHONE_TYPES.put(ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE + "", "mobile");
            PHONE_TYPES.put(ContactsContract.CommonDataKinds.Phone.TYPE_WORK + "", "work");
        }
}

त्रुटि संग्रह:-

E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example, PID: 6573
                                                             java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example/com.example.Activity.InviteByContactActivity}: java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation
                                                              Caused by: java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation

इसे देखें: stackoverflow.com/questions/6745797/…
yash786

1
यह आपकी मदद कर सकता है stackoverflow.com/questions/46980697/…
नीलेश राठौड़

इसे भी देखें: stackoverflow.com/questions/46980697/…
yash786

1
सभी सुझावों की कोशिश की लेकिन मेरे लिए कोई काम नहीं किया गया।
शुभम सेजलपाल

1
क्या आप android: screenOrientation = "पोर्ट्रेट" का उपयोग कर रहे हैं?
रागेश रमेश

जवाबों:


62

समस्या तब हो रही है जब आपका लक्ष्य 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>

नोट: माता-पिता = "Theme.AppCompat.Light.NoActionBar" को एपी 28 के लिए आवश्यक है। पहले एपी 26 में कुछ और था। महान काम कर रहा था, लेकिन 28 पर समस्या देना शुरू कर दिया। आशा है कि यह किसी को यहाँ से मदद करता है। संपादित करें: कुछ के लिए केवल सेटिंग द्वारा <item name="android:windowIsTranslucent">false</item> and <item name="android:windowIsFloating">false</item> काम किया जा सकता है। जिस तरह से आप समाधान कार्यों को लागू करते हैं उस पर निर्भर करता है। मेरे मामले में यह उन्हें सच करने के लिए सेट करके काम किया।


22
किसी और के लिए जो इस "फिक्स" पर ठोकर खाता है, मुझे इसे <item name="android:windowIsTranslucent">false</item>सेट <item name="android:windowIsFloating">false</item>करना होगा और काम करने से पहले भी सेट करना होगा।
th317erd

8
इसका समाधान वास्तव में कहां है? टैग screenOrientationमें कोई विशेषता नहीं है activity, और केवल एक चीज जो दुर्घटना का कारण बनती है, screenOrientationजबकि android:windowIsTranslucentइसे सही पर सेट किया जाता है।
Android डेवलपर

यह तब तक काम नहीं करता है, जब तक कि उपरोक्त टिप्पणियों का उपयोग नहीं किया जाता है। राकेश द्वारा उत्तर देखें, जो ऊपर और अधिक टिप्पणियों को शामिल करता है, और स्पष्ट है
arberg

मेरे लिए झूठे काम के लिए पारभासी की स्थापना <आइटम का नाम = "android: windowIsTranslucent"> false </ item>
Tran Quan

मेरे मामले में, समाधान AndroidManifest.xml में गतिविधि से 'एंड्रॉइड: थीम' को हटाने के लिए था। लेकिन अगर आपको इसकी आवश्यकता है, तो आप इसे 'super.onCreate' से पहले प्रोग्रामेटिक रूप से जोड़ सकते हैं: setTheme (R.style.Theme_AppCompat_Light_Dialog);
पावल कात्यायिन

132

Android Oreo (API 26) में आप उन गतिविधि के लिए अभिविन्यास नहीं बदल सकते हैं जिनकी शैली नीचे रेखा (ओं) की है

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

या

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

आपके पास इसे हल करने के कई तरीके हैं:

1) आप बस ऊपर लाइन (एस) को हटा सकते हैं (या इसे गलत तरीके से बदल सकते हैं ) और आपका ऐप ठीक काम करता है।

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। ( अब्देलहदी टिप्पणी के लिए धन्यवाद )

 <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
एंट्रेको

@avisper क्या आप पूर्ण स्थिति कोड साझा कर सकते हैं
मणिकंदन K

एक युक्ति / एपीआई 26 चल एमुलेटर में, विकल्प 2 काम नहीं करता, मैं एक नया करना था styles.xmlमें values-v26अक्षम करने के लिए android:windowIsTranslucentही नहीं एपीआई के लिए।
अब्देलहेडी

@AbdelHady अच्छा समाधान, मैं इसे अपने उत्तर में जोड़ूंगा, लेकिन आप कोड की जांच करेंगे और ठीक है कि विकल्प 2 काम क्यों नहीं करता है, कि मेरा सुझाया विकल्प,
राकेश

1
मैंने बूलियन मान के साथ विकल्प 3 का उपयोग किया <bool name="allowWindowFullScreenTranslucent">true</bool>और इसमें संदर्भित किया <item name="android:windowIsTranslucent">@bool/allowWindowFullScreenTranslucent</item>। फिर स्टाइल में। Xml मानों-v26 के तहत इसे falseमूल्यों में सेट करें और मूल्यों-v27 में इसे सेट करें true
ड्रोरसन

86

Android O में और बाद में यह त्रुटि तब होती है जब आप सेट करते हैं

 android:screenOrientation="portrait"

मेनिफेस्ट में।

उस लाइन को हटा दें और उपयोग करें

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

आपकी गतिविधि में।

इससे आपकी समस्या ठीक हो जाएगी।


7
गूगल की तरफ से इसका एक बग। भविष्य के अपडेट में तय किया जाना चाहिए। setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); आपके ऐप को लैंडस्केप में जाने से प्रतिबंधित कर देगा। सुनिश्चित करें कि आप अपनी सभी गतिविधियों के निर्माण में इसका उपयोग करते हैं।
रागेश रमेश

44
निकाला जा रहा है <item name="android:windowIsTranslucent">true</item> मेरी शैली से से विरासत में मिली है कि Theme.AppCompat.Light.NoActionBar मेरे लिए काम किया।
शैडोशीप

16
यह समाधान काम करता है, लेकिन यह मेरे स्पलैशस्क्रीनथी को गड़बड़ कर देता है। बार-बार
टेढ़े

3
पहले के संस्करणों पर काम करने वाले ऐप्स को तोड़ने के लिए "इरादा"? वह लक्ष्य निश्चित रूप से हासिल किया गया है। कम से कम हमारे पास एक समाधान है, @Ragesh
ओलेग ग्रीब

9
गतिविधि वर्ग पर अभिविन्यास सेट करके प्रकट विशेषता को प्रतिस्थापित करने से समस्या हल नहीं होती है।
rmgoncalo

75

Google onCreatev27 के बाद गतिविधि के तरीके पर इस अपवाद को फेंकता है , उनका अर्थ है: यदि कोई गतिविधि पारभासी या अस्थायी है, तो उसका अभिविन्यास माता-पिता (पृष्ठभूमि) गतिविधि पर निर्भर होना चाहिए, स्वयं निर्णय नहीं कर सकता है।

भले ही आप android:screenOrientation="portrait"फ्लोटिंग या ट्रांसलूसेंट एक्टिविटी से हटा दें लेकिन इसकी पैरेंट (बैकग्राउंड) एक्टिविटी पर ओरिएंटेशन फिक्स कर दें , यह अभी भी पेरेंट द्वारा तय है, मैंने पहले ही टेस्ट कर लिया है।

एक विशेष स्थिति: यदि आप किसी लॉन्चर गतिविधि पर पारभासी बनाते हैं, तो इसमें अभिभावक (पृष्ठभूमि) नहीं होते हैं, इसलिए हमेशा डिवाइस के साथ घूमें। इसे ठीक करना चाहते हैं, आपको <item name="android:windowIsTranslucent">true</item>स्टाइल को बदलने के लिए एक और तरीका लेना होगा ।


2
मेरे पास Android PIE पर चलने वाले अपने OnePlus का यह मुद्दा नहीं है। तो यह v27 के बाद नहीं है, लेकिन जब v! = 28
Entreco

क्या आपके पास इसके लिए दस्तावेज का लिंक होना चाहिए? मैं इसे ढूंढ नहीं सकता।
शिवम वर्मा

पारभासी समस्या वास्तव में पागल है, धन्यवाद, यह मेरी समस्या को ठीक करता है
अभिषेक गर्ग

कि पिछले अनुभाग 'एक विशेष स्थिति ...' ध्यान देने योग्य बात के लिए धन्यवाद
guy_m

यह स्वीकृत उत्तर होना चाहिए। सही समझ में आता है!
जूल

28

यदि आप एक पूर्ण स्क्रीन पारदर्शी गतिविधि का उपयोग करते हैं, वहाँ गतिविधि पर उन्मुखीकरण ताला निर्दिष्ट करने के लिए कोई जरूरत नहीं है। यह मूल गतिविधि की कॉन्फ़िगरेशन सेटिंग्स ले जाएगा। यदि माता-पिता गतिविधि में प्रकट होते हैं:

एंड्रॉयड: screenOrientation = "चित्र"

आपकी पारभासी गतिविधि में एक ही अभिविन्यास लॉक होगा: पोर्ट्रेट।


मुझे लगता है कि आपने एक छोटा टाइपो बनाया है: "यदि आप एक फुलस्क्रीन पारभासी गतिविधि का उपयोग करते हैं तो यह उसकी मूल गतिविधि की कॉन्फ़िगरेशन सेटिंग लेगा" ^ ^
जोसेलिन

2
क्या होगा अगर मेरी पारदर्शी गतिविधि मेरी लॉन्चर गतिविधि (यानी स्प्लैश स्क्रीन) है
भूपेश

2
क्या यह सभी Android संस्करणों के लिए सही है? या यह केवल एंड्रॉइड ओ और ऊपर की तरफ है?
अभयंक

यह काम नहीं करेगा यदि यह एकमात्र गतिविधि है जिसका उपयोग किया जा रहा है, हालांकि (उदाहरण: इसे एक सेवा से शुरू करना)
Android डेवलपर

24

मैं के android:screenOrientation="behind"बजाय इस्तेमाल किया android:screenOrientation="portrait"। मूल रूप से, आपने एक संवाद (एक गतिविधि में) बनाया था और संवाद स्वयं अभिविन्यास का अनुरोध नहीं कर सकता है, इसे करने के लिए मूल गतिविधि की आवश्यकता है (क्योंकि एक माता-पिता पृष्ठभूमि में दिखाई देते हैं और इसका अपना लेआउट है)।

"पीछे" गतिविधि के रूप में एक ही अभिविन्यास जो गतिविधि स्टैक में इसके नीचे है।


क्या होगा यदि मैं चाहता हूं कि जो गतिविधि मैंने बनाई है वह पारदर्शी हो, यह दिखाते हुए कि इसके नीचे क्या है (अन्य ऐप्स सहित), जबकि वर्तमान अभिविन्यास पर भी रहते हैं? अगर मैंने इसे "पीछे" रहने दिया, तो यह अभी भी विभिन्न मामलों पर अभिविन्यास बदल सकता है ...
एंड्रॉइड डेवलपर

19

एकमात्र समाधान जो वास्तव में काम करता है:

परिवर्तन:

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

सेवा:

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

शैलियों में

लेकिन यह आपकी स्पलैशस्क्रीन (स्टार्टअप पर सफेद स्क्रीन) के साथ एक समस्या उत्पन्न कर सकता है ... इस मामले में, अपनी शैलियों में निम्न पंक्ति जोड़ें। xml:

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

windowIsTranslucent लाइन के ठीक नीचे।

यदि पिछले युक्तियां काम नहीं करती हैं तो आखिरी मौका: एसडी 27 के बजाय एसडीके 26 को लक्षित करें।


1
27 के बजाय 26 को लक्ष्य एसडीके को बदलना मेरे लिए काम किया। WindowIsTranslucent को बदलना नहीं था।
Cliche818

इसने मेरे लिए targetSDK: 27 का उपयोग करके काम किया। यह विशेष रूप से महत्वपूर्ण है क्योंकि मैंने एक स्प्लैशस्क्रीन कॉन्फ़िगर किया था।
लियोनार्डो जी

18

यदि आपको उपयोग करना है setRequestedOrientation(), तो कोई तरीका नहीं है, लेकिन एंड्रॉइड 8.0 पर windowIsTranslucent विशेषता का त्याग करें

values\styles.xml एपीआई स्तर 25 के लिए- (<8.0)

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

values-v26\styles.xml एपीआई स्तर 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 एपीआई स्तर 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)

कोड जो गतिविधि में अपवाद को ट्रिगर करता है। जावा

    //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, संबंधित विंडो विशेषताओं का उपयोग किया जाता है।

समस्या का पता लगने के बाद, आप अपनी आवश्यकताओं के अनुसार टारगेटसड्रोवर्जन को बदल सकते हैं या थीम के संबंधित विशेषताओं को हटा सकते हैं।


1
इस समय मास्टर पर कोड की जाँच करना, यह पहले से ही फ्रेमवर्क से हटा दिया गया है: दर्पण / platform_frameworks_base / प्रतिबद्ध / e83f34cde79c51efb66f27f2770c2e8e572e96bb # diff-a9aa0352703240c8ae70f1c83add4b88 दिलचस्प है।
एरिक एम। स्प्रेंगेल

क्या आप इस भाग के स्रोत कोड का लिंक दिखा सकते हैं? क्या कोई वर्कअराउंड है जो मुझे विशिष्ट अभिविन्यास के साथ एक गतिविधि देगा और एक पारदर्शी पृष्ठभूमि होगी, ताकि यह देखना संभव होगा कि इसके पीछे क्या है (अन्य ऐप्स सहित)?
Android डेवलपर

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

<आइटम का नाम = "android: windowIsTranslucent"> false </ item> <item name = "android: windowFullscreen"> true </ item> => इसने इसे मेरे लिए एंड्रॉइड 8.0 पर तय किया। मैं अभी भी स्क्रीन ऑप्रेशन को छोड़ सकता हूं।
फ्रैंक

1
यह windowIsTranslucent के समान काम नहीं करता है, क्योंकि अब आप यह नहीं देख सकते हैं कि गतिविधि के पीछे क्या है।
Android डेवलपर

8

बस android:screenOrientation="portrait"Manifiest.xml में गतिविधि की इस लाइन को हटा दें

यह गतिविधि पिछली गतिविधि से उन्मुखीकरण प्राप्त करेगी, ताकि अभिविन्यास लागू करने की कोई आवश्यकता न हो <item name="android:windowIsTranslucent">true</item>


क्या होगा यदि पिछली गतिविधि में एक अलग अभिविन्यास है जो आप वर्तमान गतिविधि में चाहते हैं?
ClassA

6

ऐसा लगता है कि लक्ष्य sdk पाई है (एपीआई स्तर 28.0) और windowIsTranslucent सच है

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

और आप अभिविन्यास तक पहुँचने का प्रयास करते हैं। समस्या एंड्रॉइड ओरियो 8.0 (एपी स्तर 26) के साथ आती है इसे हल करने के दो तरीके हैं

  1. अभिविन्यास निकालें
  2. या झूठा करने के लिए windowIsTranslucent सेट करें

यदि आप इस तरह प्रकट में अभिविन्यास सेट कर रहे हैं

android:screenOrientation="portrait"

या इस तरह गतिविधि वर्ग में

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

दोनों स्थानों से फार्म निकालें।

और जब यू ने windowIsTranslucent को सच में सेट किया, तो यह मूल गतिविधि से अभिविन्यास लेता है।


5

मेनिफ़ेस्ट फ़ाइल में पहली गतिविधि के रूप में दूसरी गतिविधि पैरेंट एक्टिविटीनाम सेट करें और दूसरी गतिविधि के लिए स्क्रीनऑरिएशन पैरामीटर निकालें। इसका मतलब है कि आपकी पहली गतिविधि माता-पिता है और आपकी दूसरी गतिविधि के उन्मुखीकरण का फैसला करती है।

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

या पोर्ट्रेट ओरिएंटेशन के लिए प्रतिबंधित है

तुम भी गतिविधि में उपयोग कर सकते हैं, में 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 बग के कारण हो सकती है। मेरे लिए, मैं अपनी गतिविधियों पर इस विधि को छोड़ने में सक्षम था onCreate विधि:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

और मैंने अपना टारगेट बदलकर 26 को बदल दिया है। मेरे ऑनक्रिएट में वह लाइन होने के बावजूद अभी भी एक दुर्घटना हुई है, जबकि मेरा टारसडेकवर्सन अभी भी 27 पर सेट है। चूंकि किसी और के समाधान ने मेरे लिए अब तक काम नहीं किया है, इसलिए मैंने पाया कि यह एक अस्थायी फिक्स के रूप में काम करता है। अभी।


1
इसने मेरे लिए 26 के लिए लक्ष्यविकास सेट करके काम किया, android: screenOrientation = "पोर्ट्रेट" और <आइटम का नाम = "android: windowIsTranslucent"> true </ item>
siripan

मेरे लिए @siripan भी
Acauã Pitta

लेकिन अंतत: आपको इस वर्ष targetSdkVersion को 28 पर सेट करना होगा: support.google.com/googleplay/android-developer/answer/… । आप क्या करेंगे?
Android डेवलपर

3

यह एंड्रॉइड वर्जन 7 (Api level 24,25) और 8 (एपीआई लेवल 26,27) में स्टाइल.xml फाइल के अंदर थीम्स के बीच एक संघर्ष (बग) है, जब आपके पास होता है

android:screenOrientation="portrait" : AndroidManifest.xml में विशिष्ट गतिविधि (जो क्रैश) के अंदर

और

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

style.xml के अंदर उस गतिविधि पर लागू होने वाले विषय में

इसे अपनी आवश्यकता के अनुसार इन तरीकों से हल किया जा सकता है:

1- उपर्युक्त गुणों को हटाएं जो संघर्ष करते हैं

2- इन मूल्यों में से किसी एक के लिए गतिविधि अभिविन्यास बदलें: unspecifiedया behindतो और उस पर यहां पाया जा सकता है: Android के लिए Google संदर्भ: स्क्रीनिंग विचलन `

3- रन टाइम में ओरिएंटेशन को प्रोग्रामेटिक रूप से सेट करें


इस समाधान की कोशिश की है, लेकिन एप्लिकेशन अभी भी दुर्घटनाग्रस्त हो जाता है: मुझे पोर्ट्रेट पारदर्शी गतिविधि की आवश्यकता है इसलिए मुझे यह दोनों विकल्प चाहिए। प्रकट स्क्रीन में सेट किए गए प्रयास अप्रमाणित हैं, लेकिन कोई भाग्य नहीं।
14:

नहीं, मैंने सब पर प्रकट होने में अभिविन्यास हटाने की कोशिश की, और गतिविधि को पूर्णस्क्रीन बना दिया, लेकिन यह अभी भी दुर्घटनाग्रस्त है। केवल 1 डिवाइस पर - 9 लाइट का सम्मान करें। सैमसंग पर यह ठीक काम करता है।
गुस्सा

ओरिएंटेशन को प्रोग्रामेटिक रूप से सेट करना भी क्रैश का कारण बनता है। आपने इसका सही उपयोग कैसे किया?
Android डेवलपर

@androiddeveloper मैं आपके स्रोत कोड तक कैसे पहुंच सकता हूं? मुझे यह देखना चाहिए कि आपने क्या किया
हमीद जलिलानी

@HamedJaliliani इसे प्रोग्राममैटिकली सेट करना इस प्रकार है, उदाहरण के लिए: `setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);`
Android डेवलपर

3

मैंने हाल ही में इस मुद्दे का सामना किया और यहां समाधान है।

स्क्रीन अभिविन्यास पैरामीटर को बदलने की आवश्यकता नहीं है जिसे आपने एंड्रॉइड मेनिफ़ेस्ट फ़ाइल में सेट किया है।

बस दो फ़ोल्डर में जोड़ें

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

इसके बाद वहां अपने स्टाइल.एक्सएमएल और थीम्स.एक्सएमएल फाइल को कॉपी करें।

और TRUE से FALSE तक निम्नलिखित पैरामीटर बदलें।

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

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

यह काम करेगा।

एंड्रॉइड 8.0 का एक सामान्य बग


2

मैं इस समस्या का सामना केवल SDK 26 (8.0.0) में कर रहा हूँ अगर windowIsTranslucent 'true' और बलपूर्वक सेटिंग ओरिएंटेशन का उपयोग कर रहे हैं:

यहाँ समाधान है:

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

लेकिन तब आप वास्तव में जो आप चाहते थे उसके लिए उन्मुखीकरण सेट होने की कार्यक्षमता खो देते हैं।
Android डेवलपर

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
Android डेवलपर

2

केवल 8.0.0 अपवाद को फेंक देते हैं, 8.0 से ऊपर के अपवाद को हटा दिया है

8.0.0 अपवाद छोड़ दें


एंड्रॉइड 7, 7.1, 8.0, 8.1 सभी में यह समस्या है
Hamed Jaliliani

appInfo.targetSdkVersion > Oअपवाद फेंक
मिंगो

इसकी जाँच targetएसडीके संस्करण। इससे कोई फर्क नहीं पड़ता कि डिवाइस वास्तव में कौन सा sdk संस्करण चला रहा है, आप Android O (28) के खिलाफ संकलन कर रहे हैं, लेकिन मंच के उस संस्करण के सम्मेलनों का पालन नहीं कर रहे हैं।
बेंजिको९

2

मेरे लिए काम करने वाली एकमात्र चीज बदल रही थी

android:screenOrientation="portrait"

सेवा

android:screenOrientation="unspecified"

सभी पारभासी गतिविधियों की अभिव्यक्ति में।

इस तरह यह सभी एपीआई संस्करणों के साथ संगत है क्योंकि पारभासी गतिविधि के रूप में मूल गतिविधि से इसकी अभिविन्यास विरासत में मिली है targetApi: 28

शैली को इसमें शामिल किया जा सकता है <item name="android:windowIsTranslucent">true</item>


इस समाधान की कोशिश की, लेकिन एप्लिकेशन अभी भी दुर्घटनाग्रस्त हो जाता है
anber

लेकिन फिर आप ओरिएंटेशन सेट करने का कार्य खो देते हैं
एंड्रॉइड डेवलपर

@androiddeveloper: जिस तरह से मैं समझता हूं कि यह अभिविन्यास मूल गतिविधि से विरासत में मिला होगा। यदि आप स्पष्ट रूप से पारभासी गतिविधि पर एक और अभिविन्यास सेट करना चाहते हैं जो इस तरह से काम नहीं करेगा ...
मैक्स हाइमर

कभी-कभी आपके पास पिछली गतिविधि का नियंत्रण नहीं हो सकता है। कभी-कभी आप अपने पारदर्शी को दिखाना चाहते हैं जो उपयोगकर्ता वर्तमान में देखता है। तो यह मदद नहीं कर सकता :(
एंड्रॉयड डेवलपर

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 से एक बग है या एक इच्छित व्यवहार है, लेकिन मैंने (कम से कम क्षण भर में) इसे कंपाइलडासवर्जन और टार्गेटडस्कवर्सन को 26 में बदलकर ग्रैडल में हल कर दिया ...


3
आपको targetdk स्तर कम नहीं करना चाहिए। आपका ऐप अंततः प्ले स्टोर से ब्लॉक हो जाएगा। हमेशा नवीनतम एंड्रॉयड एपीआई स्तर को लक्षित android-developers.googleblog.com/2017/12/...
श्मुएल

1
@ शमूएल: गलत। आप 26 को लक्षित कर सकते हैं और स्टोर पर 28 पर उपलब्ध हो सकते हैं।
रेगिस_एजी

1
सही है, मैंने 'अंततः' लिखा है यदि आप अपने ऐप का निर्माण एक पुराने एपीआई स्तर को लक्षित करते हैं तो आप दर्द की दुनिया में होंगे जब आपको अपडेट करने के लिए मजबूर किया जाता है
शमूएल

यह एक समाधान नहीं बल्कि एक समाधान है। एक दिन आपको अपने ऐप को 28 पर स्थानांतरित करना होगा और इसलिए!
सूद .००

1

यदि आपने अपनी समस्या का समाधान नहीं किया है, तो विज्ञापन गतिविधि को इस तरह प्रकट करें:

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

आपको sdk के नवीनतम संस्करण में भी अपडेट करना होगा।


1

शायद आप गतिविधि संवाद (गैर फुलस्क्रीन) की तरह लग रही दिखा रहा है, इसलिए हटाने screenOrientation से प्रकट या कोड से। इससे समस्या ठीक हो जाएगी।


हम्म बहुत अजीब है, मेरे लिए यह मामला था। अलग-अलग एंड्रॉइड वर्जन पर ऐप चलाने की कोशिश करें, देखें कि इससे आपको क्या
फायदा

1

यह 27 के बाद हुआ, targetSdkVersion 26 प्रतिस्थापित का उपयोग करें, इसके लिए Google की प्रतीक्षा करें


2
उत्तर पोस्ट करते समय कृपया कोई संदर्भ (लिंक या उद्धृत) प्रदान करें। तो भविष्य के उपयोगकर्ता आसानी से समझ सकते हैं। साथ ही, एसओ समुदाय में आपका स्वागत है ।
मोहम्मदसलीम शिवानी

@MohammedsalimShivani यहां: जारीकर्ता पटाखा.google.com/issues/68454482#comment4 "हमारी इंजीनियरिंग टीम ने इस मुद्दे को ठीक कर दिया है। यह भविष्य के Android रिलीज़ में उपलब्ध होगा, इसलिए कृपया रिलीज़ नोटों पर नज़र रखें।"
Android डेवलपर

यह बुरी सलाह है
क्रिस

0

मैंने गैर-स्क्रीन तत्वों से टैग "पोर्ट्रेट" को हटा दिया है और सब कुछ ठीक हो गया है।

android:screenOrientation="portrait"

0

कृपया अपनी गतिविधि की शैली की जांच करें और सुनिश्चित करें कि यदि आप किसी भी पारभासी संबंधित चीजों का उपयोग नहीं कर रहे हैं, तो शैली को वैकल्पिक में बदलें। ताकि हम इस समस्या को ठीक कर सकें।

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

0

मैंने हटाकर इस समस्या को हल किया android:screenOrientation="portrait"और अपने ऑनक्रिएट में कोड नीचे जोड़ा

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>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.