MediaProvider मॉड्यूल

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

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

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

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

  • सिर्फ़ फ़ाइल एक्सटेंशन का इस्तेमाल करके (और सुरक्षा से जुड़ी समस्याओं से बचने के लिए कॉन्टेंट स्निफ़िंग का इस्तेमाल किए बिना) MIME टाइप तय किया जा सकता है.

  • upstream 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 की मदद से इंडेक्स करने की सुविधा चालू हो जाएगी.

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

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

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

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

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

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

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

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

  • स्टोरेज डिवाइस को इंडेक्स करने से जुड़ा फ़्लैग. 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