जब मैंने एक बहुत ही सरल आवश्यकता को लागू करने का प्रयास किया - एक छवि डाउनलोड करें और उसे स्थानीय संग्रहण में सहेजें - पहले तो सब कुछ ठीक लग रहा था।.
- हॉनर (एंड्रॉइड 10) - काम करता है
- रेडमी (एंड्रॉइड 11) – काम करता है
- Xiaomi (Android 13) – काम करता है
- सैमसंग (एंड्रॉइड 13) - पूरी तरह से विफल: भंडारण अनुमति संवाद कभी नहीं दिखाई देगा
वही कोड, वही फ़ीचर, लेकिन Android 13 पर एक डिवाइस ने अनुमति संदेश दिखाने से ही इनकार कर दिया। इस तरह यह छोटा सा "इमेज डाउनलोड करें" टास्क एक गहन खोज में बदल गया। स्कोप्ड स्टोरेज और बाहरी भंडारण प्रबंधित करें.
यह पोस्ट संक्षेप में बताती है कि मैंने स्टोरेज अनुमतियों को कैसे अनुकूलित किया Android 11 और इसके बाद के संस्करण, और मैं विभिन्न संस्करणों में विभिन्न व्यवहारों को कैसे संभालता हूँ।.
1. बग: स्टोरेज अनुमति डायलॉग कभी नहीं दिखता (सैमसंग एंड्रॉइड 13)
आवश्यकता स्पष्ट है:
एक छवि डाउनलोड करें और उसे डिवाइस में सेव करें ताकि वह गैलरी में दिखाई दे।.
मेरे तीन परीक्षण उपकरणों पर:
- Honor – Android 10 → ठीक है
- Redmi – Android 11 → ठीक है
- Xiaomi – Android 13 → ठीक है
लेकिन एक Android 13 पर चलने वाला Samsung डिवाइस, प्रणाली संग्रहण अनुमति संवाद कभी नहीं दिखाया गया, चाहे मैंने इसे कैसे भी अनुरोध किया हो।.



पहले तो मैंने सोचा कि यह सिर्फ एक और OEM विचित्रता थी, लेकिन एंड्रॉइड संस्करणों में भंडारण अनुमति परिवर्तनों की जांच करने के बाद, मुझे एहसास हुआ कि मैं उस व्यवहार पर भरोसा कर रहा था जिसे एसडीके 33 को लक्षित करते समय एंड्रॉइड 13 पर प्रभावी रूप से हटा दिया गया था।.
2. मूल कारण: WRITE/READ_EXTERNAL_STORAGE Android 13 (SDK 33) पर अप्रचलित हैं
पुराने एंड्रॉइड संस्करणों में, हम मैनिफ़ेस्ट में इन दो अनुमतियों की घोषणा कर सकते थे:
READ_EXTERNAL_STORAGEबाहरी संग्रहण लिखें
और फिर आवश्यकता पड़ने पर रनटाइम पर उनसे अनुरोध करें।.
Android 13 (SDK 33) पर targetSdkVersion = 33, वह दृष्टिकोण टूटने लगता है:
बाहरी संग्रहण लिखेंहै पदावनत और प्रभावी रूप से बेकार हाल के Android संस्करणों पर- यदि आप जोड़ते हैं
अधिकतमSdkसंस्करण=32इन अनुमतियों के बावजूद, वे अभी भी Android 11/12 पर काम करते हैं
लेकिन वे अवहेलना करना एंड्रॉइड 13 पर 33 को लक्षित करते समय - साथ ही, Play Store के लिए नए ऐप्स को कम से कम SDK 33 को लक्षित करना आवश्यक है
इसलिए Android 11+ के लिए हमें निम्नलिखित को अपनाना होगा:
- स्कोप्ड स्टोरेज
- और कुछ मामलों में, विशेष अनुमति:
बाहरी भंडारण प्रबंधित करें
बाहरी भंडारण प्रबंधित करें किसी ऐप को सभी साझा संग्रहण सामग्री (गैर-मीडिया फ़ाइलों सहित) तक व्यापक पहुँच प्रदान करता है। यह नहीं अन्य ऐप्स की निजी निर्देशिकाओं तक पहुंच की अनुमति देता है, लेकिन इसे अभी भी Google Play द्वारा अत्यधिक संवेदनशील अनुमति माना जाता है।.
विभिन्न एंड्रॉयड संस्करणों का समर्थन करने के लिए, मैंने अनुमति प्रबंधन को निम्नलिखित में विभाजित किया:
- Android 11 से पहले (API < 30) – पुरानी शैली की बाह्य भंडारण अनुमतियाँ
- Android 11 और इसके बाद के संस्करण - स्कोप्ड स्टोरेज + विशेष हैंडलिंग के साथ
बाहरी भंडारण प्रबंधित करेंजहाँ सख्त ज़रूरत हो
3. चरण-दर-चरण अनुकूलन
3.1 मैनिफ़ेस्ट में MANAGE_EXTERNAL_STORAGE घोषित करें
में AndroidManifest.xml:
<uses-permission
android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />⚠️ नोट: क्योंकि
बाहरी भंडारण प्रबंधित करेंयह एक संवेदनशील अनुमति है, इसलिए यह Google Play पर प्रतिबंधित है। अगर आप सिर्फ़ इमेज सेव करना चाहते हैं, तो मैं बाद में विकल्पों के बारे में बात करूँगा।.
3.2 जाँच करें कि अनुमति दी गई है या नहीं
मैंनें इस्तेमाल किया आसान अनुमतियाँ अनुमति जांच को सरल बनाने के लिए.
निजी फ़न चेकपर (गतिविधि: प्रीव्यूएक्टिविटी): बूलियन { रिटर्न अगर (बिल्ड.वर्जन.एसडीके_आईएनटी >= 30) { ईज़ीपरमिशन.हैपरमिशन(गतिविधि, एंड्रॉइड.मैनिफ़ेस्ट.परमिशन.मैनेज_एक्सटर्नल_स्टोरेज) } अन्यथा { ईज़ीपरमिशन.हैपरमिशन(गतिविधि, एंड्रॉइड.मैनिफ़ेस्ट.परमिशन.राइट_एक्सटर्नल_स्टोरेज) } }
- पर एंड्रॉइड 11+ (API >= 30): मैं जाँचता हूं
बाहरी भंडारण प्रबंधित करें - पर Android 10 और उससे नीचे के संस्करण: मैं अभी भी जाँच करता हूँ
बाहरी संग्रहण लिखें
यह विभाजन महत्वपूर्ण है, क्योंकि बाहरी संग्रहण लिखें अब यह उस तरह से व्यवहार नहीं करता जैसा कि नए संस्करणों में करता था।.
3.3 अनुमति न मिलने पर अनुरोध करें
यदि अनुमति नहीं दी जाती है, तो मैं सिस्टम संस्करण के आधार पर अलग तरीके से अनुरोध करता हूं।.
निजी फ़न requestStoragePermission(activity: PreViewActivity, curImg: Int) { यदि (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { // Android 11+ – सिस्टम "सभी फ़ाइलों तक पहुँच" सेटिंग पृष्ठ पर रीडायरेक्ट करें val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION) intent.data = Uri.parse("package:" + activity.packageName) activity.startActivityForResult(intent, 200) } अन्यथा { // Android 10 और नीचे – सामान्य रनटाइम अनुमति val perm = android.Manifest.permission.WRITE_EXTERNAL_STORAGE PaperThreeVariable.isToRequestPer = true EasyPermissions.requestPermissions( PermissionRequest.Builder( activity, 200, perm ).build() ) } }
- पर एंड्रॉइड 11+: आप इसके लिए सामान्य रनटाइम संवाद को "पॉप" नहीं कर सकते
बाहरी भंडारण प्रबंधित करें
आपको उपयोगकर्ता को सिस्टम सेटिंग पृष्ठ पर भेजना होगा जहां वे मैन्युअल रूप से “सभी फ़ाइलों तक पहुंच” प्रदान करते हैं।. - पर Android 10 और उससे नीचे के संस्करण: क्लासिक रनटाइम अनुमति संवाद अभी भी काम करता है।.
3.4 अनुमति कॉलबैक संभालें
EasyPermissions गतिविधि के कॉलबैक और हमारे अपने तर्क को जोड़ने में मदद करता है:
ओवरराइड फ़न onRequestPermissionsResult( requestCode: Int, अनुमतियाँ: Array , अनुदान परिणाम: IntArray ) { super.onRequestPermissionsResult(अनुरोध कोड, अनुमतियाँ, अनुदान परिणाम) EasyPermissions.onRequestPermissionsResult(अनुरोध कोड, अनुमतियाँ, अनुदान परिणाम, यह) } ओवरराइड fun onPermissionsGranted(अनुरोध कोड: Int, perms: MutableList ) { AppInitUtils().saveFreshAppImageToGallery(this, curImg) PaperThreeVariable.isToRequestPer = false } ओवरराइड fun onPermissionsDenied(requestCode: Int, perms: MutableList ) { PaperThreeVariable.isToRequestPer = गलत यदि (EasyPermissions.somePermissionPermanentlyDenied(यह, perms)) { AppSettingsDialog.Builder(यह) .setRationale("इस फ़ंक्शन को सक्षम करने के लिए संग्रहण अनुमति की आवश्यकता है") .setNegativeButton("नहीं") .setPositiveButton("हाँ") .build() .show() } }
मैं यहाँ EasyPermissions का उपयोग क्यों करता हूँ:
- उपयोगकर्ता कर सकते हैं स्थायी रूप से अस्वीकार करें अनुमतियाँ, जिसके कारण बार-बार किए गए अनुरोध चुपचाप विफल हो जाते हैं
- EasyPermissions इसे आसान बनाता है:
- “स्थायी रूप से अस्वीकृत” स्थिति का पता लगाएं
- एक संवाद दिखाएं जो उपयोगकर्ताओं को मार्गदर्शन करता है सिस्टम सेटिंग्स → ऐप अनुमतियाँ संग्रहण पहुँच को मैन्युअल रूप से सक्षम करने के लिए
एक बार अनुमति मिल जाने पर, मैं फोन करता हूँ:
AppInitUtils().saveFreshAppImageToGallery(यह, curImg)
वास्तव में छवि को सहेजने और गैलरी को ताज़ा करने के लिए।.
इस अनुकूलन के बाद, सैमसंग एंड्रॉइड 13 डिवाइस ने अंततः दूसरों के समान ही व्यवहार किया।.
साइड नोट: मेरे Xiaomi डिवाइस ने Android 13 के रूप में रिपोर्ट किया लेकिन Android Studio के "ऐतिहासिक कनेक्टेड डिवाइस" ने इसे Android 12 के रूप में पहचाना। यह समझा सकता है कि यह अभी भी कुछ मामलों में क्यों काम करता है - लेकिन यही कारण है कि संस्करण-जागरूक अनुमति प्रबंधन महत्वपूर्ण है।.
4. MANAGE_EXTERNAL_STORAGE और Google Play प्रतिबंधों के बारे में
बाहरी भंडारण प्रबंधित करें शक्तिशाली है:
यह पढ़ने/लिखने की पहुँच प्रदान करता है सभी साझा संग्रहण डिवाइस पर.
इस वजह से, Google Play इसे एक के रूप में मानता है अत्यधिक संवेदनशील अनुमति:
- इसका मुख्य उद्देश्य फ़ाइल प्रबंधक / बैकअप / एंटीवायरस ऐप्स टाइप करें
- आपको इसका उपयोग करने के लिए एक औचित्य प्रस्तुत करना होगा
- यदि आपका ऐप केवल एक सामान्य उपभोक्ता ऐप है (उदाहरण के लिए, चित्र सहेजना, सरल डाउनलोड), तो आपका अनुरोध सबसे अधिक संभावना होगा अस्वीकार कर दिया
तो यदि आपकी एकमात्र आवश्यकता यह है:
“एक छवि को गैलरी में सहेजें और इसे उपयोगकर्ता के लिए दृश्यमान बनाएं।”
तो आपको चाहिए इससे बचने पर दृढ़ता से विचार करें बाहरी भंडारण प्रबंधित करें और इसके बजाय:
- उपयोग मीडियास्टोर सिस्टम मीडिया लाइब्रेरी में चित्र सम्मिलित करने के लिए
- या ऐसे API का उपयोग करें जो पूर्ण फ़ाइल एक्सेस की आवश्यकता के बिना छवियों को सहेज सकें
इसके कई पैटर्न हैं:
- चित्र/DCIM निर्देशिका में छवि सहेजें
- मीडिया स्कैनर को सूचित करें या मीडियास्टोर पर भरोसा करें ताकि गैलरी इसे उठा सके
- यह सब करो MANAGE_EXTERNAL_STORAGE का अनुरोध किए बिना
आंतरिक या गैर-Play स्टोर वितरण (जैसे, एंटरप्राइज़ आंतरिक ऐप स्टोर) के लिए, आप तकनीकी रूप से अभी भी उपयोग कर सकते हैं पर्यावरण.getExternalStorageDirectory(), लेकिन मैं 2025 में इसके आसपास एक नया ऐप डिजाइन करने की अनुशंसा नहीं करता हूं।.
5. संस्करण-दर-संस्करण सारांश (एंड्रॉइड 9 → 13)
सब कुछ एक जगह पर रखने के लिए, यहां एक उच्च-स्तरीय सारांश दिया गया है कि विभिन्न संस्करणों में बाह्य भंडारण और अनुमतियां किस प्रकार कार्य करती हैं।.
Android 9 और उससे नीचे (API 28 और उससे पहले)
- अनुमतियां:
READ_EXTERNAL_STORAGEबाहरी संग्रहण लिखें
- व्यवहार:
- ऐप्स स्वतंत्र रूप से एक्सेस कर सकते हैं
/एसडी कार्डऔर इसकी उपनिर्देशिकाएँ - ऐप द्वारा बनाई गई फ़ाइलें ऐप अनइंस्टॉल होने के बाद भी डिवाइस पर बनी रहती हैं
- ऐप्स स्वतंत्र रूप से एक्सेस कर सकते हैं
- विशिष्ट दृष्टिकोण:
- बाह्य भंडारण पथों के अंतर्गत सीधे पढ़ना/लिखना
Android 10 (API 29) – स्कोप्ड स्टोरेज पेश किया गया
- अनुमतियां:
READ_EXTERNAL_STORAGEअभी भी काम करता हैबाहरी संग्रहण लिखेंअभी भी मौजूद है, लेकिन इसका प्रभावी दायरा कम हो गया है
- व्यवहार:
- स्कोप्ड स्टोरेज प्रस्तुत है:
- ऐप्स अपनी स्वयं की ऐप-विशिष्ट निर्देशिका तक सीमित हैं
Android/डेटा/आपका.पैकेज.नाम/ - अन्य ऐप्स की फ़ाइलों तक सीधी पहुँच प्रतिबंधित है
- ऐप्स अपनी स्वयं की ऐप-विशिष्ट निर्देशिका तक सीमित हैं
- मीडिया फ़ाइलों (छवियाँ, वीडियो, ऑडियो) तक पहुँच निम्न माध्यम से होनी चाहिए मीडियास्टोर
requestLegacyExternalStorage=सत्यअस्थायी रूप से पुराना व्यवहार बनाए रख सकते हैं
(लेकिन एंड्रॉइड 11 से इस ध्वज को अनदेखा कर दिया गया है)
- स्कोप्ड स्टोरेज प्रस्तुत है:
- अनुशंसित दृष्टिकोण:
- छवियों/वीडियो/ऑडियो के लिए: उपयोग करें मीडियास्टोर
- निजी फ़ाइलों के लिए: उपयोग करें
getExternalFilesDir()याgetDataDir()
Android 11 (API 30) – स्कोप्ड स्टोरेज लागू
- अनुमतियां:
READ_EXTERNAL_STORAGEकाम करता है, लेकिन केवल मीडियास्टोर द्वारा प्रबंधित मीडिया के लिएबाहरी संग्रहण लिखेंप्रभावी रूप से अप्रचलित सामान्य बाह्य भंडारण के लिएबाहरी भंडारण प्रबंधित करेंविशेष “सभी फ़ाइलों तक पहुँच” उपयोग मामलों के लिए पेश किया गया
- व्यवहार:
requestLegacyExternalStorage=सत्यअब काम नहीं करता; स्कोप्ड स्टोरेज है हमेशा बने रहें- तक पहुंच
/एसडी कार्ड/रूट अवरुद्ध है - ऐप्स केवल:
- अपनी निजी निर्देशिकाओं तक पहुँच
- साझा मीडिया तक पहुँचें मीडियास्टोर
- अनुशंसित दृष्टिकोण:
- सामान्य ऐप्स के लिए:
- मीडियास्टोर का उपयोग करें या एसएएफ (
कार्रवाई_खुला_दस्तावेज़,कार्रवाई_दस्तावेज़_बनाएँ) उपयोगकर्ता द्वारा चयनित फ़ाइलों के लिए
- मीडियास्टोर का उपयोग करें या एसएएफ (
- केवल विचार करें
बाहरी भंडारण प्रबंधित करेंयदि आपका ऐप वास्तव में एक फ़ाइल प्रबंधक, बैकअप टूल, सुरक्षा ऐप आदि है।.
- सामान्य ऐप्स के लिए:
Android 13 (API 33) – मीडिया अनुमतियाँ विभाजित
- अनुमतियां:
READ_MEDIA_IMAGES– छवियों तक पहुँचपढ़ें_मीडिया_वीडियो– वीडियो तक पहुंचREAD_MEDIA_AUDIO– ऑडियो एक्सेस करें
- व्यवहार:
- मीडिया अनुमतियाँ हैं ठीक कणों:
- उपयोगकर्ता केवल छवि तक पहुंच, केवल वीडियो तक पहुंच आदि प्रदान कर सकते हैं।.
- एंड्रॉइड 11 के स्कोप्ड स्टोरेज नियम यथावत बने रहेंगे
- मीडिया अनुमतियाँ हैं ठीक कणों:
- अनुशंसित दृष्टिकोण:
- आपको आवश्यक विशिष्ट मीडिया अनुमतियों का अनुरोध करें:
- उदाहरण के लिए, यदि आप केवल छवियों के साथ काम करते हैं, तो केवल अनुरोध करें
READ_MEDIA_IMAGES
- उदाहरण के लिए, यदि आप केवल छवियों के साथ काम करते हैं, तो केवल अनुरोध करें
- करना नहीं अनुरोध
READ_EXTERNAL_STORAGEएंड्रॉइड 13+ पर, क्योंकि इसे नई मीडिया अनुमतियों द्वारा बदल दिया गया है
- आपको आवश्यक विशिष्ट मीडिया अनुमतियों का अनुरोध करें:
त्वरित मैट्रिक्स (वैचारिक)
- एंड्रॉइड 9 और उससे नीचे
- बाह्य भंडारण तक पहुंच व्यापक है, जिसे READ/WRITE_EXTERNAL_STORAGE द्वारा नियंत्रित किया जाता है
- एंड्रॉइड 10
- स्कोप्ड स्टोरेज की शुरुआत की गई है, लेकिन इसमें बचने के रास्ते भी हैं (
अनुरोधविरासतबाहरीभंडारण)
- स्कोप्ड स्टोरेज की शुरुआत की गई है, लेकिन इसमें बचने के रास्ते भी हैं (
- एंड्रॉइड 11
- स्कोप्ड स्टोरेज लागू किया गया, लीगेसी स्विच हटा दिए गए
बाहरी भंडारण प्रबंधित करेंदिखाई देता है लेकिन अत्यधिक प्रतिबंधित है
- एंड्रॉइड 13
- मीडिया पहुंच को विभाजित किया गया
पढ़ें_मीडिया_*अनुमति - समान स्कोप्ड स्टोरेज नियम, लेकिन अधिक सूक्ष्म उपयोगकर्ता नियंत्रण
- मीडिया पहुंच को विभाजित किया गया
6. टेकअवे
- यह मत मानिए कि "यह एक एंड्रॉइड 13 डिवाइस पर काम करता है" इसका मतलब यह है कि यह हर जगह काम करता है; OEM और सिस्टम रिपोर्ट असंगत हो सकती हैं।.
- के लिए एंड्रॉइड 11+, इस संदर्भ में सोचें:
- ऐप निजी निर्देशिकाएँ + मीडियास्टोर + SAF, "कच्चा" नहीं
/एसडी कार्डपहुँच"”
- ऐप निजी निर्देशिकाएँ + मीडियास्टोर + SAF, "कच्चा" नहीं
- इलाज
बाहरी भंडारण प्रबंधित करेंके तौर पर अखिरी सहारा बहुत विशिष्ट ऐप प्रकारों के लिए, विशेष रूप से यदि आप Google Play पर प्रकाशित करने की योजना बना रहे हैं।. - हमेशा परीक्षण करें एकाधिक डिवाइस और Android संस्करण, खासकर जब बात अनुमतियों और भंडारण की आती है।.
यह लेख मेरे अपने डिबगिंग और वास्तविक एंड्रॉइड प्रोजेक्ट्स (एंड्रॉइड 13 पर एक सैमसंग डिवाइस सहित) में अनुकूलन से लिया गया है। GPT ने केवल शब्दों का अनुवाद और उन्हें निखारने में मदद की; सभी तकनीकी सामग्री और निर्णय मेरे अपने हैं।.


