अच्छे सवालों के बहुत सारे, चलो खुदाई में। :)
आप इसका इस्तेमाल कैसे करते हैं?
यहाँ किटकैट में स्टोरेज एक्सेस फ्रेमवर्क के साथ बातचीत करने के लिए एक बढ़िया ट्यूटोरियल है:
https://developer.android.com/guide/topics/providers/document-provider.html#client
लॉलीपॉप में नए एपीआई के साथ बातचीत बहुत समान है। उपयोगकर्ता को निर्देशिका ट्री चुनने के लिए संकेत देने के लिए, आप इस तरह से एक इरादा लॉन्च कर सकते हैं:
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, 42);
फिर आपके onActivityResult () में, आप उपयोगकर्ता द्वारा चुने गए उरई को नए डॉक्यूमेंटफाइल हेल्पर क्लास में पास कर सकते हैं। यहां एक त्वरित उदाहरण है जो चुनी हुई निर्देशिका में फ़ाइलों को सूचीबद्ध करता है, और फिर एक नई फ़ाइल बनाता है:
public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
if (resultCode == RESULT_OK) {
Uri treeUri = resultData.getData();
DocumentFile pickedDir = DocumentFile.fromTreeUri(this, treeUri);
// List all existing files inside picked directory
for (DocumentFile file : pickedDir.listFiles()) {
Log.d(TAG, "Found file " + file.getName() + " with size " + file.length());
}
// Create a new file and write into it
DocumentFile newFile = pickedDir.createFile("text/plain", "My Novel");
OutputStream out = getContentResolver().openOutputStream(newFile.getUri());
out.write("A long time ago...".getBytes());
out.close();
}
}
उरी द्वारा लौटाया गया DocumentFile.getUri()
अलग प्लेटफॉर्म एपीआई के साथ उपयोग करने के लिए पर्याप्त लचीला है। उदाहरण के लिए, आप इसे का उपयोग कर साझा कर सकता Intent.setData()
साथ Intent.FLAG_GRANT_READ_URI_PERMISSION
।
आप का उपयोग करना चाहते हैं कि उरी मूल कोड से, आप कॉल कर सकते हैं ContentResolver.openFileDescriptor()
और उसके बाद का उपयोग ParcelFileDescriptor.getFd()
या detachFd()
एक पारंपरिक POSIX फ़ाइल वर्णनकर्ता पूर्णांक प्राप्त करने के लिए।
यदि आप फ़ाइलों / फ़ोल्डरों तक पहुंच सकते हैं, तो आप कैसे जांचेंगे?
डिफ़ॉल्ट रूप से, स्टोरेज एक्सेस फ्रेमवर्क के माध्यम से लौटा गया Uris रिबूट के पार बरकरार नहीं है । प्लेटफ़ॉर्म "अनुमति को जारी रखने की क्षमता" प्रदान करता है, लेकिन यदि आप चाहते हैं तो आपको अभी भी अनुमति "लेने" की आवश्यकता है। ऊपर हमारे उदाहरण में, आप कॉल करेंगे:
getContentResolver().takePersistableUriPermission(treeUri,
Intent.FLAG_GRANT_READ_URI_PERMISSION |
Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
आप हमेशा यह पता लगा सकते हैं कि ContentResolver.getPersistedUriPermissions()
एपीआई के माध्यम से आपके ऐप की पहुंच कितनी बनी हुई है। यदि आपको अब एक स्थायी उड़ी तक पहुंच की आवश्यकता नहीं है, तो आप इसे जारी कर सकते हैं ContentResolver.releasePersistableUriPermission()
।
क्या यह किटकैट पर उपलब्ध है?
नहीं, हम मंच के पुराने संस्करणों में नई कार्यक्षमता जोड़ सकते हैं।
क्या मैं देख सकता हूं कि किन ऐप्स की फ़ाइलों / फ़ोल्डरों तक पहुंच है?
वर्तमान में ऐसा कोई UI नहीं है जो इसे दिखाता है, लेकिन आप adb shell dumpsys activity providers
आउटपुट के "ग्रेटेड उरी अनुमतियों" अनुभाग में विवरण पा सकते हैं ।
यदि एक ही डिवाइस पर एक से अधिक उपयोगकर्ताओं के लिए ऐप इंस्टॉल किया जाता है तो क्या होगा?
उरी अनुमति अनुदान को अन्य सभी बहु-उपयोगकर्ता प्लेटफ़ॉर्म कार्यक्षमता की तरह, प्रति-उपयोगकर्ता के आधार पर अलग किया जाता है। यही है, दो अलग-अलग उपयोगकर्ताओं के तहत चलने वाले एक ही ऐप में कोई भी ओवररैपिंग या साझा उरी अनुमति अनुदान नहीं है।
क्या अनुमति रद्द की जा सकती है?
बैकिंग डॉक्यूमेंटप्रॉइडर किसी भी समय अनुमति को रद्द कर सकता है, जैसे कि क्लाउड-आधारित डॉक्यूमेंट डिलीट होने पर। इन निरस्त अनुमतियों की खोज करने का सबसे आम तरीका यह है कि जब वे ContentResolver.getPersistedUriPermissions()
ऊपर उल्लिखित से गायब हो जाते हैं ।
जब भी ऐप में अनुदान में शामिल ऐप के लिए डेटा साफ़ हो जाता है तो अनुमतियाँ भी रद्द कर दी जाती हैं।
एक चयनित फ़ोल्डर पर पुनरावृत्ति की अनुमति के काम के लिए पूछेंगे?
हाँ, ACTION_OPEN_DOCUMENT_TREE
आशय आपको मौजूदा और नई बनाई गई फ़ाइलों और निर्देशिकाओं दोनों के लिए पुनरावर्ती पहुँच प्रदान करता है।
क्या यह कई चयन की अनुमति देता है?
हां, किटकैट के बाद से कई चयन का समर्थन किया गया है, और आप EXTRA_ALLOW_MULTIPLE
अपना ACTION_OPEN_DOCUMENT
इरादा शुरू करते समय सेटिंग द्वारा अनुमति दे सकते हैं । आप उन फ़ाइलों के प्रकारों का उपयोग Intent.setType()
या EXTRA_MIME_TYPES
संकीर्ण कर सकते हैं जिन्हें उठाया जा सकता है:
http://developer.android.com/reference/android/content/Intent.html#ACTION_OPEN_DOCUMENT
क्या नया एपीआई आज़माने के लिए एमुलेटर पर कोई रास्ता है?
हां, प्राथमिक साझा संग्रहण डिवाइस को एम्यूलेटर पर भी बीनने वाले में दिखाई देना चाहिए। आपका ऐप्लिकेशन केवल साझा भंडारण तक पहुँचने के लिए संग्रहण एक्सेस फ़्रेमवर्क का उपयोग करता है, तो आपको अब आवश्यकता READ/WRITE_EXTERNAL_STORAGE
अनुमतियों सब पर है और उन्हें हटाने या उपयोग कर सकते हैं android:maxSdkVersion
करने के लिए केवल पुराने मंच संस्करणों पर उन्हें का अनुरोध सुविधा।
जब उपयोगकर्ता एसडी-कार्ड को दूसरे के साथ बदल देता है तो क्या होता है?
जब भौतिक मीडिया शामिल होता है, तो अंतर्निहित मीडिया का UUID (जैसे FAT सीरियल नंबर) हमेशा लौटी हुई उड़ी में जलाया जाता है। सिस्टम इसका उपयोग आपको उस मीडिया से कनेक्ट करने के लिए करता है जिसे उपयोगकर्ता ने मूल रूप से चुना है, भले ही उपयोगकर्ता कई स्लॉट्स के बीच मीडिया को स्वैप करता हो।
यदि उपयोगकर्ता दूसरे कार्ड में स्वैप करता है, तो आपको नए कार्ड तक पहुंच प्राप्त करने के लिए संकेत देना होगा। चूंकि सिस्टम प्रति-UUID आधार पर अनुदान को याद रखता है, इसलिए यदि उपयोगकर्ता बाद में इसे पुन: स्थापित कर लेता है, तो आपको मूल कार्ड तक पहले से दी गई पहुंच जारी रहेगी।
http://en.wikipedia.org/wiki/Volume_serial_number