SYSTEM_ALERT_WINDOW - Android 6.0 और targetSdkVersion 23 पर स्वचालित रूप से यह अनुमति कैसे प्राप्त करें


82

फेसबुक, एवरनोट, पॉकेट - सभी ऐप्स को यह अनुमति एंड्रॉइड 6.0 पर स्वचालित रूप से मिलती है, भले ही वे 23 ( targetSdkVersion=23) को लक्षित कर रहे हों ।

नए मार्शमैलो अनुमति मॉडल के बारे में बहुत सारे दस्तावेज हैं। उनमें से एक SYSTEM_ALERT_WINDOWको 'खतरनाक' अनुमति वर्ग के लिए 'पदोन्नत' किया गया है , इस प्रकार उन लोगों को दिए जाने वाले ऐप्स के लिए एक विशेष उपयोगकर्ता के हस्तक्षेप की आवश्यकता होती है। यदि ऐप में targetSdkVersion22 या उससे कम है, तो ऐप को यह अनुमति स्वचालित रूप से मिलती है (यदि प्रकट में अनुरोध किया गया है)।

हालाँकि, मैंने कुछ एप्लिकेशन पर ध्यान दिया है, जो उपयोगकर्ता को Draw over other appsअनुमति के विशेष पृष्ठ पर भेजने की आवश्यकता के बिना, यह अनुमति प्राप्त करता है । मैंने फेसबुक, एवरनोट, पॉकेट देखा - और शायद वहाँ अधिक हैं।

किसी को भी पता है कि उपयोगकर्ता द्वारा जाने के बिना किसी एप्लिकेशन को यह अनुमति कैसे दी जा सकती है Settings -> Apps -> Draw over other apps?

धन्यवाद


stackoverflow.com/questions/33139754/… इसने मेरी मदद की
भारथ

stackoverflow.com/questions/33139754/… इस पोस्ट ने मुझे बाहरी को लिखने की संवाद अनुमति दिखाने में मदद की
Bharath

1
अद्यतन 2020: stackoverflow.com/a/60005258/4720433
Kzaf

जवाबों:


116

यह मार्शमैलो 6.0.1 में पेश किया गया एक नया व्यवहार है ।

प्रत्येक ऐप जो SYSTEM_ALERT_WINDOWअनुमति का अनुरोध करता है और जो प्ले स्टोर (संस्करण 6.0.5 या उच्चतर आवश्यक है) के माध्यम से इंस्टॉल किया गया है, ने अनुमति स्वचालित रूप से दी है।

यदि इसके बजाय एप्लिकेशन को साइडलोड किया जाता है, तो अनुमति स्वचालित रूप से प्रदान नहीं की जाती है। आप apkmirror.com से एवरनोट एपीके डाउनलोड और स्थापित करने का प्रयास कर सकते हैं । जैसा कि आप देख सकते हैं कि आपको मैन्युअल रूप से अनुमति देने की आवश्यकता है Settings -> Apps -> Draw over other apps

ये कमिट्स [1] [2] हैं जो प्ले स्टोर को अनुमति के स्वत: अनुदान देने की SYSTEM_ALERT_WINDOWअनुमति देते हैं।


6
हालांकि मुझे आश्चर्य है कि अचानक एक 'ऊपर खतरनाक' अनुमति कैसे आ गई 'अब सामान्य से नीचे' है। मेरा मतलब है, आपको यह अनुमति किसी पॉपअप में देखने को नहीं मिलती है, और ऐप्स इसे स्वचालित रूप से प्राप्त कर सकते हैं। कोई विचार?
ओरिहेल

अनुमति बनी हुई है above dangerousयदि आप एप्लिकेशन को अनुमति नहीं देते हैं तो अनुमति वास्तव में है। यह केवल प्ले स्टोर है जिसमें एक अलग व्यवहार है और स्वचालित रूप से अनुमति देता है, शायद उन्होंने सोचा था कि प्ले स्टोर पर ऐप्स दुर्भावनापूर्ण नहीं हैं और उन पर भरोसा किया जा सकता है। या हो सकता है कि उन्हें इस बदलाव के बारे में बहुत सारी शिकायतें मिलीं और उन्होंने वर्कअराउंड खोजने का फैसला किया।
मटिया मेस्त्रिनी

2
@oriharel मुझे आश्चर्य है कि अगर फेसबुक मैसेंजर के बड़े पैमाने पर इस समर्थन के लिए Google को इस दिशा में नग्न किया गया। हो सकता है कि फेसबुक ने उपयोगकर्ता को अनुमति देने के लिए बाध्य न करने के लिए एक सौदा w / Google को मारा ताकि चैटहेड काम करना जारी रख सके।
डेनिसड्रू

3
जब मैंने इस अनुमति को स्वतः-अनुदान देने के व्यवहार के बारे में पूछा (मुझे लगा कि इसका कारण कुछ और है: targetSdk) Google की प्रतिक्रिया थी "यह एक लोकप्रिय व्यवहार है जब तक कि हमारे पास वैकल्पिक APIs नहीं है तब तक लोकप्रिय ऐप्स को काम करते रहने दें इन ऐप्स के माइग्रेट करने के लिए प्लेटफ़ॉर्म। " । ये पद यहां हैं: code.google.com/p/android/issues/detail?id=227123 code.google.com/p/android/issues/detail?id=222195
Android डेवलपर

1
@MattiaMaestrini क्या आप इस तरह के प्रश्न पर एक नज़र डाल सकते हैं? stackoverflow.com/questions/54378632/…
राम

74

मार्शमैलो आने के बाद एंड्रॉइड सिक्योरिटी लेवल को स्टिक, बट फॉर

SYSTEM_ALERT_WINDOW

आप फ़्लोटिंग एक्शन और कुछ भी दिखा सकते हैं। आप उपयोगकर्ता को इसके लिए अनुमति देने के लिए बाध्य कर सकते हैं। अपनी onCreate()विधि में निम्नलिखित कोड्स के अनुसार इस कोड को सेट करें

    // Check if Android M or higher
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        // Show alert dialog to the user saying a separate permission is needed
        // Launch the settings activity if the user prefers
        Intent myIntent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
        startActivity(myIntent);
    }

कार्रवाई ACTION_MANAGE_OVERLAY_PERMISSIONसीधे 'अन्य एप्लिकेशन पर ड्रा' अनुमति स्क्रीन लॉन्च करती है।


संपादित करें: मेरा उपरोक्त कोड 100% सही काम करता है

लेकिन मैंने अभी पाया कि बहुत से लोग अभी भी खोज कर रहे हैं कि कैसे अनुमति दे सकते हैं ACTION_MANAGE_OVERLAY_PERMISSION स्थायी रूप से जैसे कि यदि उपयोगकर्ता ने अनुमति दी है तो एक बार यह मत पूछिए कि वह हर बार आवेदन खोलते हैं तो आपके लिए समाधान सुनें-

  1. जांचें कि डिवाइस में एपीआई 23+ है या नहीं

  2. यदि 23+ एपीआई तब जांचें कि उपयोगकर्ता के पास परमिट है या नहीं

  3. यदि परमिट था तो एक बार उसे ड्राइव न करें Settings.ACTION_MANAGE_OVERLAY_PERMISSIONऔर अगर अभी तक अनुमति नहीं दी है, तो रनटाइम अनुमति की जांच करें

अपनी onCreate()विधि में नीचे पंक्ति रखें । इसके बाद इसे लगाएंsetContentView

checkPermission();

अब नीचे दिए गए कोड को डालें onActivityResult

@TargetApi(Build.VERSION_CODES.M)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE) {
        if (!Settings.canDrawOverlays(this)) {
            // You don't have permission
            checkPermission();
        } else {
            // Do as per your logic 
        }

    }

}

अब अंत में चेकपर्मिशन मेथड कोड

public void checkPermission() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (!Settings.canDrawOverlays(this)) {
            Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                    Uri.parse("package:" + getPackageName()));
            startActivityForResult(intent, ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE);
        }
    }
}

और इस सार्वजनिक चर को अपनी कक्षा में घोषित करना न भूलें

public static int ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE = 5469;

1
@JaymanJani हाय यह मेरे लिए काम कर रहा है, लेकिन मुझे ऑफ इवेंट में स्विच बटन चाहिए
प्रियंकाचौहान

onPermission मुझे क्या करना चाहिए? मैं ऐप खोलना चाहता हूं
संतनु सूर

अच्छा समाधान। लेकिन onActivityResult विधि में canDrawOverlays अनुमति की जाँच करने की कोई आवश्यकता नहीं है क्योंकि हम पहले से ही चेकप्रर्मिशन () विधि में जाँच करते हैं।
वाहिदशिर

यह बहुत अच्छी तरह से काम करता है, लेकिन अब मैं टूलबार मेनू आइटम पर टैप नहीं कर सकता। क्या ऐसा करना संभव है?
पाब्लो आर।

हे अगर किसी को भी समस्या का सामना करना पड़ता है तो कृपया मुझे धन्यवाद दें
जयमान जानी

13

अब ( 2019 ) कि Google एंड्रॉइड क्यू में बुलबुलेSYSTEM_ALERT_WINDOW के रूप में एक वैकल्पिक एपीआई प्रदान करता है , Google ने अंततः अपचयन करने का निर्णय लिया हैSYSTEM_ALERT_WINDOW भविष्य के एंड्रॉइड रिलीज़ में ।

और Android Go डिवाइस अब यह अनुमति नहीं देंगे अर्थातSettings.canDrawOverlays() == false


तुम यह कैसे जानते हो? प्रलेखन का कहना है कि यह अभी भी पूर्वावलोकन में है। डेवलपर
bubbles

यह सच है कि @NoaDrach, यही कारण है कि मैंने भविष्य में कहा था कि Google अंततः SAW - यानी जब बबल एपीआई स्थिर होगा। youtu.be/td3Kd7fOROw?t=136
डिकसन डेवलपर

धन्यवाद, मैं अपने ऐप से b / c पूछ रहा था (जो अभी तक Q को लक्षित नहीं कर रहा है), प्ले स्टोर से इंस्टॉल होने पर इस अनुमति को स्वचालित रूप से प्राप्त करता था, और अब हम इसे स्वचालित रूप से प्राप्त नहीं करते हैं। मुझे लगता है कि यह इस बात का b / c है - reddit.com/r/androiddev/comments/a69q0i/…
Noa Drach

@Dicksonthedeveloper कृपया मुझे बताएं कि किस डिवाइस की पहचान करने के लिए किस डिवाइस में SYSTEM_ALERT_WINDOW या स्क्रीन ओवरले अनुमति की सुविधा नहीं है, मुझे इस stackoverflow.com/questions/63938787/… के
Shaikh साहिब

एंड्रॉइड 11 में यह एपीआई है
कुछ भी नहीं

9

उन लोगों के लिए जो ऐप को प्ले स्टोर से डाउनलोड करने के बाद स्वचालित रूप से यह अनुमति प्राप्त करना चाहते हैं, इसके अलावा मैनिफेस्ट में SYSTEM_ALERT_WINDOW के अलावा, आपको इस लिंक पर जाना चाहिए और Google से यह अनुरोध ।

आपको कुछ अतिरिक्त जानकारी प्रदान करनी होगी कि आपको इस अनुमति की आवश्यकता क्यों है और Google समीक्षा करेगा और आपको स्वचालित रूप से अनुमति देगा।

ध्यान रखें कि इससे पहले कि आप इसके लिए पूछें, आपको यह करना होगा:

  • मैनिफेस्ट में SYSTEM_ALERT_WINDOW की अनुमति लें

  • अपने ऐप के भीतर SYSTEM_ALERT_WINDOW की अनुमति देने के लिए उपयोगकर्ता को संकेत दें, जब पहले से ही अनुमति नहीं है

अगर मुझे कुछ याद आता है तो मैं उत्तर को अद्यतन करने के लिए स्वतंत्र महसूस करता हूँ


यह अब सही उत्तर होना चाहिए। धन्यवाद। कृपया अपना उत्तर केवल इस बात से जोड़ें कि कैसे हम उपयोगकर्ता से इस अनुमति के लिए प्रोग्राम कर सकते हैं।
एरेन टुफेकी

2

अगर ऐप API 22 या उससे कम का लक्ष्य करता है, तो Play Store, System_ALERT_WINDOW को अनुमति देगा और अन्य जब उपयोगकर्ता अपने डिवाइस एंड्रॉइड 6.0 को इंस्टॉल करने (अलर्ट दिखाने) पर क्लिक करता है, भले ही ऐप API 23 या इसके बाद के संस्करण को लक्षित करे, ताकि अनुमति रन टाइम में देने का अनुरोध किया जाएगा।


अपडेटेड प्ले स्टोर पॉलिसी के अनुसार (अगस्त 2018 से) आपको एसडीके को 26 से कम लक्ष्य नहीं करना चाहिए, यह संदर्भ लिंक 1 देखें) डेवलपर ।android.com/distribute/best-practices/develop/…
जयमान जानी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.