MediaProvider মডিউল

MediaProvider মডিউল ইন্ডেক্স করা মেটাডেটা (এসডি কার্ড ও USB ডিভাইস থেকে অডিও, ভিডিও ও ছবি) অপ্টিমাইজ করে এবং MediaStore পাবলিক API-এর মাধ্যমে সেই ডেটা অ্যাপের জন্য উপলভ্য করে। ব্যবহারকারীর গোপনীয়তা বজায় রাখতে, MediaProvider মডিউল Android 10-এ চালু করা স্কোপড স্টোরেজ সুরক্ষা মডেল প্রয়োগ করে, যার মধ্যে সংবেদনশীল লোকেশন মেটাডেটা এডিট করা অন্তর্ভুক্ত। এই মডিউল আপডেট করা যায়, এর ফলে Android নিরাপত্তা সংক্রান্ত সমস্যার ব্যাপারে আরও দ্রুত প্রতিক্রিয়া জানাতে পারে (সংবেদনশীল ব্যবহারকারীর ডেটা সুরক্ষিত রাখে) এবং নতুন মিডিয়া ফর্ম্যাট আরও দ্রুত যোগ করতে পারে (ব্যবহারকারী ও ডেভেলপার উভয়ের ক্ষেত্রেই ধারাবাহিকতা প্রদান করে)।

Android 10-এ পরিবর্তন

Android 10-এ মিডিয়া ফাইল থেকে ডেটা শনাক্ত ও এক্সট্র্যাক্ট করার ক্ষেত্রে বেশ কিছু উন্নতি করা হয়েছে, বিশেষ করে:

  • ফাইলের MIME ধরনের প্রথম অংশ ব্যবহার করে ফাইলের কন্টেন্টের ধরন নির্ধারণ করা। যেমন, OS জানে যে image/png এবং image/x-newly-invented-format দুটিই ছবি এবং তাই শেষ ব্যবহারকারীকে প্রাসঙ্গিক অনুমতি সম্পর্কে সঠিকভাবে বর্ণনা করতে পারে।

  • শুধুমাত্র ফাইল এক্সটেনশন ব্যবহার করে MIME-এর প্রকার নির্ধারণ করা (এবং নিরাপত্তা সংক্রান্ত সমস্যা এড়াতে কন্টেন্ট স্নিফিং ব্যবহার না করে)।

  • আপস্ট্রিম ডেবিয়ান লিনাক্স ও Android ম্যাপিং-এর কম্বিনেশন ব্যবহার করে কোনও অনির্দিষ্ট ফাইলের MIME টাইপ নির্ধারণ করা।

  • video/* ও audio/* ফাইল (MediaMetadataRetriever-এর মাধ্যমে ) এবং image/* ফাইল (ExifInterface-এর মাধ্যমে) থেকে প্রাসঙ্গিক ডেটা ফিরিয়ে আনা।

Android 11-এ পরিবর্তন

Android 11-এ, MediaProvider মডিউলটি Android 10-এ করা পরিবর্তনগুলির উপর ভিত্তি করে তৈরি করা হয়েছে এবং এতে নিম্নলিখিত উন্নতিগুলি করা হয়েছে:

  • ইন্ডেক্সিংয়ের ক্ষেত্রে উন্নতি। MediaProvider মডিউল এখন MediaStore পাবলিক API-এর সাথে উপলভ্য মেটাডেটা মিলিয়ে মেটাডেটা ইন্ডেক্স করে। পরিবর্তনের মধ্যে এগুলি অন্তর্ভুক্ত:

    • এই কলামের উপর ভিত্তি করে মিডিয়া দ্রুত ফিল্টার করতে, গ্যালারি-স্টাইল অ্যাপ চালু করার জন্য নতুন is_favorite কলাম ও QUERY_ARG_MATCH_FAVORITE আর্গুমেন্ট।

    • কালার স্পেস মেটাডেটা ইন্ডেক্স করা হচ্ছে।

    • এই কলামের উপর ভিত্তি করে ফিল্টার করার জন্য গ্যালারি-স্টাইল অ্যাপ চালু করতে নতুন is_trashed কলাম ও QUERY_ARG_MATCH_TRASHED আর্গুমেন্ট।

    • সিঙ্গেল ব্যবহারকারীর ডায়ালগ প্রম্পটের মাধ্যমে একাধিক আইটেম বাল্ক-মডিফাই করার সুবিধা দেয় এমন নতুন API, যার মধ্যে createDeleteRequest(), createFavoriteRequest(), createTrashRequest() এবং createWriteRequest() অন্তর্ভুক্ত।

    • দ্রুত এবং নির্ভরযোগ্যভাবে পরিবর্তন শনাক্ত করার জন্য নতুন GENERATION_ADDED এবং GENERATION_MODIFIED কলাম ব্যবহার করুন যা আগের সিঙ্ক্রোনাইজেশন পয়েন্ট থেকে ঘটেছে।

    • উপরে উল্লেখ করা হয়নি এমন অতিরিক্ত মেটাডেটা কলামের সাথে ব্যবহার করার জন্য নতুন GROUP BY পাবলিক API।

  • PNG ও WebP কন্টেনার থেকে মেটাডেটা এক্সট্র্যাক্ট করার জন্য ExifInterface-এ উন্নতি।

  • স্ক্রিন ক্যাপচারে DateTimeOriginal মেটাডেটা লেখার জন্য SystemUI-এ উন্নতি।

এছাড়াও, আপনি এখন নতুন মিডিয়া ফর্ম্যাট যোগ করে MediaProvider কাস্টমাইজ করতে পারবেন, কোন স্টোরেজ ডিভাইস ইন্ডেক্স করা উচিত তা চিহ্নিত করতে পারবেন এবং এমনকি MTP স্ট্যাকও পাল্টাতে পারবেন। আরও বিবরণের জন্য, কাস্টমাইজেশন দেখুন।

মডিউল বাউন্ডারি

Android 11, MTP-সম্পর্কিত লজিক ব্যতীত, packages/providers/MediaProvider-এর মধ্যে থাকা সমস্ত কোডকে একটি নতুন লোকেশনে মাইগ্রেট করে। এছাড়াও, frameworks/base/core/java/android/provider/MediaStore.java এখন packages/providers/MediaProvider-এ মডিউল বাউন্ডারির ভিতরে আছে।

প্যাকেজ ফর্ম্যাট

MediaProvider মডিউল APK-in-APEX ফর্ম্যাটে আছে।

ডিপেন্ডেন্সি

MediaProvider-এর ডিপেন্ডেন্সি কাস্টমাইজেশনের সাথে সম্পর্কিত (অর্থাৎ, আপনি MediaProvider কাস্টমাইজ করলে, আপনার ইমপ্লিমেন্টেশন যেন কাস্টমাইজেশনের সাথে যুক্ত ডিপেন্ডেন্সি পূরণ করে তা নিশ্চিত করতে হবে)।

  • কাস্টম বা নন-স্ট্যান্ডার্ড মিডিয়া ফাইল ফর্ম্যাট (যেমন, কোনও ভেন্ডর-নির্দিষ্ট ক্যামেরা অ্যাপের তৈরি করা ফর্ম্যাট) ব্যবহার করার সময়, MediaProvider-এর মাধ্যমে ইন্ডেক্সিং চালু করতে, আপনাকে প্রতিটি কাস্টম ফর্ম্যাট MimeUtils এবং মিডিয়া এক্সট্র্যাক্টর মডিউলের সাথে রেজিস্টার করতে হবে।

  • StorageManagerService ইমপ্লিমেন্টেশনে ব্যবহৃত কাস্টম স্টোরেজ ডিভাইস (যেমন, SD কার্ড স্লট ও USB পোর্ট) MediaProvider যাতে ইন্ডেক্স করে তা নিশ্চিত করতে, VolumeInfo.MOUNT_FLAG_INDEXABLE ফ্ল্যাগ সেট করুন।

  • কাস্টম (AOSP নয়) MTP প্রয়োগ ব্যবহার করার সময়, নিশ্চিত করুন যে প্রয়োগটি শুধুমাত্র পাবলিক ও সিস্টেম API-এর উপর নির্ভর করে যাতে প্রয়োগটি MediaStore-এর সাথে ইন্টার‍্যাক্ট করতে পারে।

কাস্টমাইজেশন

আপনি নতুন মিডিয়া ফর্ম্যাট যোগ করতে, কোন স্টোরেজ ডিভাইস ইন্ডেক্স করা হবে তা প্রভাবিত করতে, MTP স্ট্যাক পরিবর্তন করতে এবং ডিফল্ট ফোল্ডার তৈরি করা থেকে বাদ দিতে পারবেন।

  • কাস্টম মিডিয়া ফর্ম্যাট। প্রতিটি নতুন কাস্টম মিডিয়া ফর্ম্যাটের জন্য, আপনাকে অবশ্যই অনন্য ফাইল এক্সটেনশন থেকে MIME-এর প্রকার পর্যন্ত ম্যাপিং প্রদান করতে হবে। আমরা আপনাকে IANA রেজিস্ট্রেশন প্রসেস অনুসরণ করার জন্য বিশেষভাবে উৎসাহিত করি।

    • AOSP-তে আগে থেকেই সংজ্ঞায়িত করা এক্সটেনশন বা MIME টাইপ আপনি আবার সংজ্ঞায়িত করতে পারবেন না।

    • video/* এবং audio/* ফাইলের জন্য, MediaProvider MediaMetadataRetriever-এর সাথে পরামর্শ করা চালিয়ে যায়। কাস্টম ফর্ম্যাটের জন্য মেটাডেটা ফেরত পেতে Android 10 মিডিয়া এক্সট্র্যাক্টর ব্যবহার করুন।

    • image/* ফাইলের জন্য, MediaProvider Exif-এ মেটাডেটা স্ট্যান্ডার্ডাইজ করা চালিয়ে যায়। আপনি android.media.ExifInterface এক্সটেন্ড করতে পারেন যাতে যেকোনও কাস্টম ছবির ফর্ম্যাটের জন্য Exif মেটাডেটা এক্সট্র্যাক্ট করে রিটার্ন করা যায়।

  • স্টোরেজ ডিভাইস ইনডেক্সিং ফ্ল্যাগ। StorageManager.getStorageVolumes()-এর মাধ্যমে ফেরানো সব ভলিউম MediaProvider ইন্ডেক্স করে, যেখানে StorageVolume.getMediaStoreVolumeName() হল নন-নাল। কী ইন্ডেক্স করা হবে তা প্রভাবিত করতে, ফিরে আসা ভলিউমের তালিকা কাস্টমাইজ করতে পারবেন, তবে আমরা ক্ষণস্থায়ী ভলিউম (যেমন USB OTG ড্রাইভ) অন্তর্ভুক্ত করার বিরুদ্ধে পরামর্শ দিই।

  • MTP স্ট্যাক রিপ্লেসমেন্ট। Android 11, MTP স্ট্যাককে সম্পূর্ণভাবে মডিউল সীমানার বাইরে রাখে এবং এটি নিশ্চিত করে যে এটি পাবলিক API-এর বিরুদ্ধে কাজ করে।

  • ডিফল্ট ফোল্ডার বাদ দেওয়ার তালিকা। MediaProvider নতুন মাউন্ট করা স্টোরেজ ভলিউমের জন্য ডিফল্ট ফোল্ডার তৈরি করে Music/, Podcasts/, Ringtones/, Alarms/, Notifications/, Pictures/, Movies/, Download/, DCIM/, Documents/, Audiobooks/ এবং Recordings/ (Recordings/ ডিরেক্টরি Android 11 এবং তার আগের ভার্সনে উপলভ্য নয়) । Android 12 ও এর পরের যেকোনও ভার্সনে, অরিজিনাল ইকুইপমেন্ট ম্যানুফ্যাকচারার (OEM) ফোল্ডারের জন্য কেস-ইনসেনসিটিভ এক্সক্লুশন তালিকা প্রদান করতে পারে যা ডিফল্ট ক্রিয়েশনের সময় MediaProvider-এর এড়িয়ে যাওয়া উচিত। এইসব ফোল্ডার, যেমন Download/ ফোল্ডার, এখনও বাইরের লজিক দ্বারা তৈরি করা হতে পারে।

বাদ দেওয়ার তালিকা যোগ করতে, config_foldersToSkipInDefaultCreation রানটাইম রিসোর্স ওভারলে (RRO) ব্যবহার করুন। Notifications/ ও Ringtones/ ডিফল্ট ফোল্ডার কীভাবে বাদ দিতে হয় তার একটি উদাহরণ নিচে দেওয়া হল:

<string-array name="config_foldersToSkipInDefaultCreation" translatable="false">
    <item>"Notifications"</item>
    <item>"Ringtones"</item>
</string-array>

পরীক্ষা করা

আপনি নিম্নলিখিত পরীক্ষা ব্যবহার করে MediaProvider-এর কার্যকারিতা যাচাই করতে পারবেন:

  • MediaStore পাবলিক API-এর কার্যকারিতা যাচাই করতে, Android কম্প্যাটিবিলিটি টেস্ট স্যুট (CTS)-এর CtsProviderTestCases প্যাকেজে টেস্ট ব্যবহার করুন।

  • MediaProvider ইন্টার্নালের কার্যকারিতা যাচাই করতে, MediaProviderTests-এ টেস্ট ব্যবহার করুন।

দুটি সেট একসাথে রান করাতে, নিম্নলিখিত atest কমান্ড ব্যবহার করুন:

atest --test-mapping packages/providers/MediaProvider