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 को पसंद के मुताबिक बनाने पर, आपको पक्का करना होगा कि उसे लागू करने की प्रोसेस, आपको पसंद के मुताबिक बनाने से जुड़ी डिपेंडेंसी के हिसाब से हो.

  • कस्टम या नॉन-स्टैंडर्ड मीडिया फ़ाइल फ़ॉर्मैट (उदाहरण के लिए, किसी वेंडर के Camera ऐप्लिकेशन से जनरेट किया गया फ़ॉर्मैट) का इस्तेमाल करते समय, आपको हर कस्टम फ़ॉर्मैट को MimeUtils और मीडिया एक्सट्रैक्टर मॉड्यूल के साथ रजिस्टर करना होगा, ताकि 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 कंपैटबिलिटी टेस्ट सुइट (सीटीएस) के CtsProviderTestCases पैकेज में जाकर, जांच का इस्तेमाल करें.

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

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

atest --test-mapping packages/providers/MediaProvider