MediaProvider मॉड्यूल, इंडेक्स किए गए मेटाडेटा (एसडी कार्ड और यूएसबी डिवाइसों से ऑडियो, वीडियो, और इमेज) को ऑप्टिमाइज़ करता है. साथ ही, MediaStore के सार्वजनिक एपीआई के ज़रिए, उस डेटा को ऐप्लिकेशन के लिए उपलब्ध कराता है. उपयोगकर्ता की निजता बनाए रखने के लिए, MediaProvider मॉड्यूल, Android 10 में पेश किए गए डिवाइस के स्कोप किए गए स्टोरेज के सुरक्षा मॉडल को लागू करता है. इसमें संवेदनशील जगह की जानकारी का मेटाडेटा छिपाने के लिए बदलाव करना शामिल है. इस मॉड्यूल को अपडेट किया जा सकता है. इससे Android को सुरक्षा से जुड़ी समस्याओं का तुरंत जवाब देने में मदद मिलती है. साथ ही, इससे संवेदनशील उपयोगकर्ता डेटा को सुरक्षित रखा जा सकता है. इसके अलावा, नए मीडिया फ़ॉर्मैट को तेज़ी से जोड़ा जा सकता है. इससे उपयोगकर्ताओं और डेवलपर, दोनों को एक जैसा अनुभव मिलता है.
Android 10 में हुए बदलाव
Android 10 में, मीडिया फ़ाइलों से डेटा की पहचान करने और उसे निकालने से जुड़े कई सुधार किए गए हैं. खास तौर पर:
फ़ाइल के MIME टाइप के पहले हिस्से का इस्तेमाल करके, फ़ाइल के कॉन्टेंट टाइप का पता लगाना. उदाहरण के लिए, ओएस को पता है कि
image/pngऔरimage/x-newly-invented-format, दोनों इमेज हैं. इसलिए, वह उपयोगकर्ता को ज़रूरी अनुमतियों के बारे में सटीक जानकारी दे सकता है.सिर्फ़ फ़ाइल एक्सटेंशन का इस्तेमाल करके MIME टाइप का पता लगाना. साथ ही, सुरक्षा से जुड़ी समस्याओं से बचने के लिए, कॉन्टेंट स्निफ़िंग का इस्तेमाल न करना.
अपस्ट्रीम Debian Linux और Android मैपिंग का इस्तेमाल करके, किसी फ़ाइल के एमआईएमई टाइप का पता लगाना.
video/*औरaudio/*फ़ाइलों (MediaMetadataRetrieverके ज़रिए) औरimage/*फ़ाइलों (ExifInterfaceके ज़रिए) से काम का डेटा वापस पाना.
Android 11 में किए गए बदलाव
Android 11 में, MediaProvider मॉड्यूल को Android 10 में किए गए बदलावों के आधार पर बनाया गया है. इसमें ये सुधार किए गए हैं:
इंडेक्सिंग की सुविधा में सुधार किए गए हैं. MediaProvider मॉड्यूल अब मेटाडेटा को इंडेक्स करता है. इसके लिए, वह MediaStore के सार्वजनिक एपीआई के हिसाब से उपलब्ध मेटाडेटा की तुलना करता है. बदलावों में ये शामिल हैं:
नया
is_favoriteकॉलम औरQUERY_ARG_MATCH_FAVORITEआर्ग्युमेंट. इससे गैलरी स्टाइल वाले ऐप्लिकेशन, इस कॉलम के आधार पर मीडिया को तुरंत फ़िल्टर कर सकेंगे.कलर स्पेस के मेटाडेटा को इंडेक्स करना.
नया
is_trashedकॉलम औरQUERY_ARG_MATCH_TRASHEDआर्ग्युमेंट, ताकि गैलरी स्टाइल वाले ऐप्लिकेशन इस कॉलम के आधार पर फ़िल्टर कर सकें.नए एपीआई, जिनकी मदद से एक ही उपयोगकर्ता के डायलॉग प्रॉम्प्ट का इस्तेमाल करके, कई आइटम में एक साथ बदलाव किया जा सकता है. इनमें
createDeleteRequest(),createFavoriteRequest(),createTrashRequest(), औरcreateWriteRequest()शामिल हैं.नए
GENERATION_ADDEDऔरGENERATION_MODIFIEDकॉलम. इनका इस्तेमाल, पिछले सिंक्रनाइज़ेशन पॉइंट के बाद हुए बदलावों का तुरंत और भरोसेमंद तरीके से पता लगाने के लिए किया जा सकता है.ऊपर नहीं बताए गए अतिरिक्त मेटाडेटा कॉलम के साथ इस्तेमाल करने के लिए, नया
GROUP BYसार्वजनिक एपीआई.
PNG और WebP कंटेनर से मेटाडेटा निकालने के लिए,
ExifInterfaceमें सुधार किया गया है.स्क्रीन कैप्चर में
DateTimeOriginalमेटाडेटा लिखने के लिए,SystemUIमें सुधार किए गए हैं.
इसके अलावा, अब नए मीडिया फ़ॉर्मैट जोड़कर MediaProvider को पसंद के मुताबिक बनाया जा सकता है. साथ ही, यह मार्क किया जा सकता है कि किन स्टोरेज डिवाइसों को इंडेक्स किया जाना चाहिए. इसके अलावा, MTP स्टैक को भी बदला जा सकता है. ज़्यादा जानकारी के लिए, पसंद के मुताबिक बनाना लेख पढ़ें.
मॉड्यूल की सीमा
Android 11, packages/providers/MediaProvider में मौजूद सभी कोड को नई जगह पर माइग्रेट करता है. हालांकि, एमटीपी से जुड़े लॉजिक को छोड़कर. इसके अलावा, frameworks/base/core/java/android/provider/MediaStore.java अब packages/providers/MediaProvider पर मॉड्यूल की सीमा के अंदर है.
पैकेज का फ़ॉर्मैट
MediaProvider मॉड्यूल, APK-in-APEX फ़ॉर्मैट में है.
डिपेंडेंसी
MediaProvider की डिपेंडेंसी, कस्टम बनाने से जुड़ी होती हैं. इसका मतलब है कि अगर आपको MediaProvider को कस्टम बनाना है, तो आपको यह पक्का करना होगा कि आपका लागू किया गया तरीका, कस्टम बनाने से जुड़ी डिपेंडेंसी के मुताबिक हो.
कस्टम या नॉनस्टैंडर्ड मीडिया फ़ाइल फ़ॉर्मैट (उदाहरण के लिए, वेंडर के हिसाब से बनाए गए कैमरा ऐप्लिकेशन से जनरेट किया गया फ़ॉर्मैट) का इस्तेमाल करते समय, आपको हर कस्टम फ़ॉर्मैट को
MimeUtilsऔर Media Extractor मॉड्यूल के साथ रजिस्टर करना होगा. इससे MediaProvider, फ़ाइलों को इंडेक्स कर पाएगा.यह पक्का करने के लिए कि MediaProvider,
StorageManagerServiceलागू करने के लिए इस्तेमाल किए गए स्टोरेज डिवाइसों के कस्टम सेट (जैसे कि एसडी कार्ड स्लॉट और यूएसबी पोर्ट) को इंडेक्स करता है,VolumeInfo.MOUNT_FLAG_INDEXABLEफ़्लैग सेट करें.कस्टम (नॉन-एओएसपी) एमटीपी लागू करने की सुविधा का इस्तेमाल करते समय, पक्का करें कि इसे लागू करने के लिए सिर्फ़ सार्वजनिक और सिस्टम एपीआई का इस्तेमाल किया गया हो. इससे, इसे MediaStore के साथ इंटरैक्ट करने की अनुमति मिलती है.
पसंद के मुताबिक बनाएं
नए मीडिया फ़ॉर्मैट जोड़े जा सकते हैं. साथ ही, यह तय किया जा सकता है कि किन स्टोरेज डिवाइसों को इंडेक्स किया जाए. इसके अलावा, MTP स्टैक को बदला जा सकता है और डिफ़ॉल्ट फ़ोल्डर को बनने से रोका जा सकता है.
कस्टम मीडिया फ़ॉर्मैट. हर नए कस्टम मीडिया फ़ॉर्मैट के लिए, आपको यूनीक फ़ाइल एक्सटेंशन से एमआईएमई टाइप तक की मैपिंग देनी होगी. हमारा सुझाव है कि आप IANA रजिस्ट्रेशन की प्रोसेस का पालन करें.
AOSP में पहले से तय किए गए एक्सटेंशन या MIME टाइप को फिर से तय नहीं किया जा सकता.
video/*औरaudio/*फ़ाइलों के लिए, MediaProviderMediaMetadataRetrieverसे सलाह लेता रहता है. कस्टम फ़ॉर्मैट के लिए मेटाडेटा वापस पाने के लिए, Android 10 के मीडिया एक्सट्रैक्टर का इस्तेमाल करें.image/*फ़ाइलों के लिए, MediaProvider मेटाडेटा के लिएExifका इस्तेमाल करता रहेगा.android.media.ExifInterfaceको एक्सटेंड करके, किसी भी कस्टम इमेज फ़ॉर्मैट के लिएExifमेटाडेटा निकाला और दिखाया जा सकता है.
स्टोरेज डिवाइसों को इंडेक्स करने का फ़्लैग. MediaProvider,
StorageManager.getStorageVolumes()से मिले सभी वॉल्यूम को इंडेक्स करता है. हालांकि, ऐसा तब ही होता है, जबStorageManager.getStorageVolumes()की वैल्यू शून्य न हो.StorageVolume.getMediaStoreVolumeName()इंडेक्स किए जाने वाले कॉन्टेंट पर असर डालने के लिए, लौटाए गए वॉल्यूम की सूची को पसंद के मुताबिक बनाया जा सकता है. हालांकि, हम सलाह देते हैं कि इसमें कुछ समय के लिए इस्तेमाल किए जाने वाले वॉल्यूम (जैसे कि यूएसबी ओटीजी ड्राइव) शामिल न करें.एमटीपी स्टैक को बदलना. Android 11, MTP स्टैक को पूरी तरह से मॉड्यूल बाउंड्री के बाहर रखता है. साथ ही, यह पक्का करता है कि यह सार्वजनिक एपीआई के साथ काम करे.
डिफ़ॉल्ट फ़ोल्डर को बाहर रखने की सूची. MediaProvider, नए स्टोरेज वॉल्यूम के लिए डिफ़ॉल्ट फ़ोल्डर बनाता है. जैसे,
Music/,Podcasts/,Ringtones/,Alarms/,Notifications/,Pictures/,Movies/,Download/,DCIM/,Documents/,Audiobooks/, औरRecordings/(Recordings/डायरेक्ट्री, Android 11 और इससे पहले के वर्शन पर उपलब्ध नहीं है) . Android 12 और उसके बाद के वर्शन में, ओरिजनल इक्विपमेंट मैन्युफ़ैक्चरर (ओईएम), ऐसे फ़ोल्डर के लिए केस-इनसेंसिटिव एक्सक्लूज़न लिस्ट उपलब्ध करा सकते हैं जिन्हें MediaProvider को डिफ़ॉल्ट फ़ोल्डर बनाते समय छोड़ देना चाहिए. ये फ़ोल्डर, जैसे किDownload/फ़ोल्डर, अब भी बाहरी लॉजिक से बनाए जा सकते हैं.
बाहर रखी गई सूची जोड़ने के लिए, config_foldersToSkipInDefaultCreation
रनटाइम रिसॉर्स ओवरले (आरआरओ) का इस्तेमाल करें. Notifications/ और Ringtones/ डिफ़ॉल्ट फ़ोल्डर को बाहर रखने के तरीके का उदाहरण यहां दिया गया है:
<string-array name="config_foldersToSkipInDefaultCreation" translatable="false">
<item>"Notifications"</item>
<item>"Ringtones"</item>
</string-array>
जांच करना
इन टेस्ट का इस्तेमाल करके, MediaProvider की सुविधाओं की पुष्टि की जा सकती है:
MediaStore के सार्वजनिक एपीआई की सुविधाओं की पुष्टि करने के लिए, Android Compatibility Test Suite (CTS) के
CtsProviderTestCasesपैकेज में मौजूद टेस्ट का इस्तेमाल करें.MediaProvider के इंटरनल फ़ंक्शन की पुष्टि करने के लिए,
MediaProviderTestsमें मौजूद टेस्ट का इस्तेमाल करें.
दोनों तरह की जांचों को एक साथ चलाने के लिए, इस atest कमांड का इस्तेमाल करें:
atest --test-mapping packages/providers/MediaProvider