MediaProvider मॉड्यूल

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

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

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

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

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

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

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

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

डिपेंडेंसी

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

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

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

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

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

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

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

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

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

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

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

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

टेस्ट करना

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

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

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

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

atest --test-mapping packages/providers/MediaProvider