यदि Android 10+ विरासत बाहरी संग्रहण एक्सेस अक्षम है, तो प्रोग्रामेटिक रूप से टेस्ट करें


12

क्या एक साधारण एपीआई कॉल है जो मुझे बताएगी कि क्या एंड्रॉइड 10 पर चलने वाला ऐप या बाद में स्कोप्ड स्टोरेज एक्सेस का उपयोग करना चाहिए, अर्थात, यदि सामान्य फ़ाइल एक्सेस, उर्फ ​​"लीगेसी एक्सटर्नल स्टोरेज" अक्षम है? ध्यान दें कि भले ही AndroidManifest.xml में एप्लिकेशन, अनुभाग घोषित:

  android:requestLegacyExternalStorage="true"

भविष्य में Google नीति में बदलाव के कारण फ़ाइल पहुंच से अभी भी इनकार किया जा सकता है, इसलिए इस मान का परीक्षण करना बेकार है। एकमात्र तरीका यह पाया गया है कि यदि बाहरी संग्रहण रूट निर्देशिका पठनीय है, तो परीक्षण करना है, लेकिन इसके लिए ऐप को पहले संग्रहण अनुमति के लिए पूछना होगा, जो कि विरासत संग्रहण अक्षम होने पर किसी और चीज़ के लिए बेकार है।

public static boolean mustUseScopedStorage() {
    // Impractical must first ask for useless Storage permission...
    File exSD = Environment.getExternalStorageDirectory();
    return !exSD.canRead(); // this test works only if Storage permission was granted.
}

मुझे लगता है कि मैंने एक बार इसका पता लगाने के लिए एक नया एपीआई देखा है, लेकिन अब उस लेख को नहीं खोज सकता ...


an app running on Android 10 or later must use Scoped Storage access? क्या आप बता सकते हैं कि आपका क्या मतलब है? आपके मन में कौन सी नीलामी है? मुझे पता है कि उदाहरण के संग्रहण वॉल्यूम और संग्रहण प्रबंधक है कि एन के लिए लाया गया पहले से ही Q के लिए अनुचित हैं के लिए
blackapps

मेरा मतलब है कि सिस्टम द्वारा ऐप को सौंपे गए सैंडबॉक्स से परे नियमित जावा फाइल एक्सेस, या उदाहरण के लिए C / C ++ JNI कोड fopen ("filename.ext", मोड); यदि फ़ाइल पथ सिस्टम द्वारा असाइन किए गए एप्लिकेशन निर्देशिका से परे है, तो काम नहीं करेगा (खंडन तक पहुंच)। ठीक है, यह एंड्रॉइड 10 पर काम करेगा, यदि आप एंड्रॉइड का उपयोग करते हैं: अनुरोध में घोषणा मेंLegacyExternalStorage = "सही" है, लेकिन यह एक अस्थायी समाधान है और अगले साल पूरी तरह से अक्षम हो सकता है। और पढ़ें जैसे androidcentral.com/what-scoped-storage-android-q
gregko

यहां तक ​​कि उस लेख में यह स्पष्ट नहीं है कि स्कोप्ड स्टोरेज क्या होगा।
ब्लैकप्प्स

@blackapps, शायद यह लेख इसे बेहतर समझाता है: developer.android.com/training/data-storage/files/…
gregko

ठीक है। केवल निजी निर्देशिका ऐप तक सीमित पहुंच।
4

जवाबों:


8

आप इन दो विधियों का उपयोग कर सकते हैं android.os.Environment:

  • isExternalStorageLegacy(File path)

    रिटर्न देता है कि क्या दिए गए पथ पर साझा / बाहरी संग्रहण मीडिया एक विरासत दृश्य है जिसमें ऐप के स्वामित्व वाली फ़ाइलें शामिल नहीं हैं।

  • isExternalStorageLegacy()

    यह बताता है कि क्या प्राथमिक साझा / बाहरी संग्रहण मीडिया एक विरासत दृश्य है जिसमें ऐप के स्वामित्व वाली फ़ाइलें शामिल नहीं हैं।

यह मूल्य requestLegacyExternalStorageऐप के प्रकट होने के समय में अनुरोधित मूल्य से भिन्न हो सकता है , क्योंकि कोई ऐप पहली बार स्थापित होने के आधार पर अपनी विरासत स्थिति प्राप्त कर सकता है।

नॉन-लीगेसी ऐप के माध्यम से अन्य ऐप से संबंधित मीडिया की खोज और पढ़ना जारी रख सकते हैं MediaStore

यदि आपको पता चलता है कि आपके पास विरासत संग्रहण तक पहुंच है, तो व्यक्तिगत रूप से मुझे लगता है कि डेटा को केवल स्टोर किए गए स्टोरेज पर भेजना बेहतर है और इसके बजाय इसका उपयोग करें क्योंकि लीगेसी संग्रहण चेतावनी के बिना काम करना बंद कर सकता है।


1
धन्यवाद, @Zaffy, यह बिल्कुल वही उत्तर है जिसकी मुझे तलाश थी। यह पूरी तरह से काम करता है, और "स्टोरेज एक्सेस" के लिए पूछने की आवश्यकता नहीं है।
ग्रोग्को
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.