মিডিয়াপ্রোভাইডার মডিউল

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

অ্যান্ড্রয়েড ১০-এর পরিবর্তনসমূহ

অ্যান্ড্রয়েড ১০ মিডিয়া ফাইল থেকে ডেটা শনাক্তকরণ এবং নিষ্কাশন সম্পর্কিত বেশ কিছু উন্নতি এনেছে, বিশেষত:

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

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

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

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

অ্যান্ড্রয়েড ১১-এর পরিবর্তনসমূহ

অ্যান্ড্রয়েড ১১-এ, মিডিয়াপ্রোভাইডার মডিউলটি অ্যান্ড্রয়েড ১০-এর পরিবর্তনগুলোর ওপর ভিত্তি করে নিম্নলিখিত উন্নতিগুলো নিয়ে এসেছে:

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

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

    • কালার স্পেস মেটাডেটার ইন্ডেক্সিং।

    • গ্যালারি-স্টাইল অ্যাপগুলিকে এই কলামের উপর ভিত্তি করে ফিল্টার করার সুবিধা দিতে নতুন is_trashed কলাম এবং QUERY_ARG_MATCH_TRASHED আর্গুমেন্ট যোগ করা হয়েছে।

    • নতুন এপিআইগুলো একটিমাত্র ইউজার ডায়ালগ প্রম্পটের মাধ্যমে একাধিক আইটেম একসাথে পরিবর্তন করার সুবিধা দেয়, যার মধ্যে রয়েছে createDeleteRequest() , createFavoriteRequest() , createTrashRequest() , এবং createWriteRequest()

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

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

  • PNG এবং WebP কন্টেইনার থেকে মেটাডেটা নিষ্কাশন করার জন্য ExifInterface এর উন্নতি সাধন করা হয়েছে।

  • স্ক্রিন ক্যাপচারে DateTimeOriginal মেটাডেটা লেখার জন্য SystemUI তে উন্নতি সাধন করা হয়েছে।

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

মডিউল সীমানা

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

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

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

নির্ভরশীলতা

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

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

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

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

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

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

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

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

    • video/* এবং audio/* ফাইলগুলির জন্য, MediaProvider ক্রমাগত MediaMetadataRetriever সাথে যোগাযোগ রক্ষা করে। কাস্টম ফরম্যাটের মেটাডেটা ফেরত পেতে Android 10 Media Extractors ব্যবহার করুন।

    • image/* ফাইলগুলির জন্য, MediaProvider মেটাডেটার জন্য Exif কে প্রমিতকরণ অব্যাহত রেখেছে। আপনি যেকোনো কাস্টম ইমেজ ফরম্যাটের জন্য Exif মেটাডেটা নিষ্কাশন ও ফেরত দিতে android.media.ExifInterface প্রসারিত করতে পারেন।

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

  • MTP স্ট্যাক প্রতিস্থাপন। অ্যান্ড্রয়েড ১১ MTP স্ট্যাককে সম্পূর্ণরূপে মডিউল সীমানার বাইরে স্থাপন করে এবং এটি যাতে পাবলিক API-গুলোর সাথে কাজ করে তা নিশ্চিত করে।

  • ডিফল্ট ফোল্ডার বর্জন তালিকা। MediaProvider নতুন মাউন্ট করা স্টোরেজ ভলিউমের জন্য Music/ , Podcasts/ , Ringtones/ , Alarms/ , Notifications/ , Pictures/ , Movies/ , Download/ , DCIM/ , Documents/ , Audiobooks/ , এবং Recordings/ ডিফল্ট ফোল্ডারগুলো তৈরি করে ( Recordings/ ডিরেক্টরিটি Android 11 এবং তার নিচের সংস্করণগুলোতে উপলব্ধ নয়) । Android 12 এবং তার উপরের সংস্করণগুলোতে, মূল সরঞ্জাম প্রস্তুতকারকরা (OEMs) এমন ফোল্ডারগুলোর জন্য একটি কেস-ইনসেনসিটিভ বর্জন তালিকা প্রদান করতে পারে, যেগুলো 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 Compatibility Test Suite (CTS)-এর CtsProviderTestCases প্যাকেজের টেস্টগুলো ব্যবহার করুন।

  • MediaProvider-এর অভ্যন্তরীণ কার্যকারিতা যাচাই করতে, MediaProviderTests এ থাকা টেস্টগুলো ব্যবহার করুন।

উভয় সেট পরীক্ষা একসাথে চালানোর জন্য, নিম্নলিখিত atest কমান্ডটি ব্যবহার করুন:

atest --test-mapping packages/providers/MediaProvider