MediaProvider मॉड्यूल

MediaProvider मॉड्यूल, इंडेक्स किए गए मेटाडेटा (एसडी कार्ड और यूएसबी डिवाइसों से मिले ऑडियो, वीडियो, और इमेज) को ऑप्टिमाइज़ करता है. साथ ही, MediaStore के सार्वजनिक एपीआई की मदद से, उस डेटा को ऐप्लिकेशन के लिए उपलब्ध कराता है. उपयोगकर्ता की निजता बनाए रखने के लिए, MediaProvider मॉड्यूल, Android 10 में पेश किए गए स्कोप वाले स्टोरेज के लिए सुरक्षा मॉडल को लागू करता है. इसमें जगह की संवेदनशील जानकारी के मेटाडेटा को छिपाना शामिल है. इस मॉड्यूल को अपडेट किया जा सकता है. इससे Android, सुरक्षा से जुड़ी समस्याओं को तेज़ी से हल कर पाता है. साथ ही, नए मीडिया फ़ॉर्मैट को तेज़ी से जोड़ पाता है. इससे उपयोगकर्ताओं और डेवलपर, दोनों को एक जैसी सुविधाएं मिलती हैं.

Android 10 में हुए बदलाव

Android 10 में, मीडिया फ़ाइलों से डेटा की पहचान करने और उसे निकालने से जुड़े कई सुधार किए गए हैं. इनमें ये शामिल हैं:

  • फ़ाइल के MIME टाइप के पहले हिस्से का इस्तेमाल करके, फ़ाइल के कॉन्टेंट टाइप का पता लगाना. उदाहरण के लिए, ओएस को पता है कि image/png और image/x-newly-invented-format, दोनों इमेज हैं. इसलिए, वह असली उपयोगकर्ता को काम की अनुमतियों के बारे में सटीक जानकारी दे सकता है.

  • सिर्फ़ फ़ाइल एक्सटेंशन का इस्तेमाल करके एमआईएम टाइप तय करना. साथ ही, सुरक्षा से जुड़ी समस्याओं से बचने के लिए, कॉन्टेंट को चुपके से देखने की सुविधा का इस्तेमाल न करना.

  • अपस्ट्रीम Debian Linux और Android मैपिंग के कॉम्बिनेशन का इस्तेमाल करके, किसी भी फ़ाइल का MIME टाइप तय करना.

  • 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 में मौजूद सभी कोड को नई जगह पर माइग्रेट करता है. हालांकि, MTP से जुड़े लॉजिक को अपवाद माना गया है. इसके अलावा, अब frameworks/base/core/java/android/provider/MediaStore.java, packages/providers/MediaProvider पर मॉड्यूल की सीमा के अंदर है.

पैकेज का फ़ॉर्मैट

MediaProvider मॉड्यूल, APK-in-APEX फ़ॉर्मैट में है.

डिपेंडेंसी

MediaProvider की डिपेंडेंसी, पसंद के मुताबिक बनाने से जुड़ी होती हैं. इसका मतलब है कि अगर MediaProvider को पसंद के मुताबिक बनाया जाता है, तो आपको यह पक्का करना होगा कि आपके लागू किए गए तरीके से, पसंद के मुताबिक बनाने से जुड़ी डिपेंडेंसी पूरी हो.

  • कस्टम या गैर-स्टैंडर्ड मीडिया फ़ाइल फ़ॉर्मैट (उदाहरण के लिए, किसी वेंडर के कैमरा ऐप्लिकेशन से जनरेट किया गया फ़ॉर्मैट) का इस्तेमाल करते समय, आपको हर कस्टम फ़ॉर्मैट को MimeUtils और Media Extractor मॉड्यूल के साथ रजिस्टर करना होगा. ऐसा करने पर, MediaProvider की मदद से इंडेक्स करने की सुविधा चालू हो जाएगी.

  • StorageManagerService लागू करने के लिए इस्तेमाल किए गए स्टोरेज डिवाइसों (जैसे, एसडी कार्ड स्लॉट और यूएसबी पोर्ट) के कस्टम सेट को MediaProvider के इंडेक्स में शामिल करने के लिए, VolumeInfo.MOUNT_FLAG_INDEXABLE फ़्लैग सेट करें.

  • कस्टम (AOSP के अलावा) MTP लागू करने के लिए, पक्का करें कि यह सिर्फ़ सार्वजनिक और सिस्टम एपीआई पर निर्भर हो, ताकि यह MediaStore के साथ इंटरैक्ट कर सके.

पसंद के मुताबिक बनाएं

अब आपके पास नए मीडिया फ़ॉर्मैट जोड़ने, यह तय करने, और MTP स्टैक को बदलने का विकल्प है कि किन स्टोरेज डिवाइसों को इंडेक्स किया जाए.

  • पसंद के मुताबिक मीडिया फ़ॉर्मैट. हर नए कस्टम मीडिया फ़ॉर्मैट के लिए, आपको यूनीक फ़ाइल एक्सटेंशन से MIME टाइप पर मैपिंग देनी होगी. हमारा सुझाव है कि आप आईएएनए के रजिस्टर करने की प्रोसेस का पालन करें.

    • AOSP में पहले से तय किए गए एक्सटेंशन या MIME टाइप को फिर से तय नहीं किया जा सकता.

    • video/* और audio/* फ़ाइलों के लिए, MediaProvider अब भी MediaMetadataRetriever से सलाह लेता रहेगा. कस्टम फ़ॉर्मैट के लिए मेटाडेटा दिखाने के लिए, Android 10 के मीडिया एक्सट्रैक्टर का इस्तेमाल करें.

    • image/* फ़ाइलों के लिए, MediaProvider मेटाडेटा के लिए Exif पर स्टैंडर्ड बना रहा है. किसी भी कस्टम इमेज फ़ॉर्मैट के लिए, android.media.ExifInterface को बड़ा करके Exif मेटाडेटा को निकाला और दिखाया जा सकता है.

  • स्टोरेज डिवाइसों को इंडेक्स करने का फ़्लैग. MediaProvider, StorageManager.getStorageVolumes() के ज़रिए दिखाए गए उन सभी वॉल्यूम को इंडेक्स करता है जहां StorageVolume.getMediaStoreVolumeName() शून्य नहीं है. इंडेक्स किए जाने वाले डेटा पर असर डालने के लिए, दिखाए गए वॉल्यूम की सूची में अपने हिसाब से बदलाव किए जा सकते हैं. हालांकि, हमारा सुझाव है कि आप ट्रांज़िशन वॉल्यूम (जैसे, यूएसबी ओटीजी ड्राइव) शामिल न करें.

  • MTP स्टैक को बदलना. Android 11, MTP स्टैक को पूरी तरह से मॉड्यूल की सीमा के बाहर रखता है. साथ ही, यह पक्का करता है कि यह सार्वजनिक एपीआई के साथ काम करे.

टेस्ट करना

MediaProvider की सुविधाओं की पुष्टि करने के लिए, इन टेस्ट का इस्तेमाल किया जा सकता है:

  • MediaStore के सार्वजनिक एपीआई की सुविधाओं की पुष्टि करने के लिए, Android Compatibility Test Suite (CTS) के CtsProviderTestCases पैकेज में मौजूद टेस्ट का इस्तेमाल करें.

  • MediaProvider के इंटरनल फ़ंक्शन की पुष्टि करने के लिए, MediaProviderTests में मौजूद टेस्ट का इस्तेमाल करें.

टेस्ट के दोनों सेट एक साथ चलाने के लिए, atest कमांड का इस्तेमाल करें:

atest --test-mapping packages/providers/MediaProvider