Android স্টোরেজ ব্যবহারের উদাহরণ ও পেশাদার পদ্ধতি

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

অনেক ক্ষেত্রে, আপনার অ্যাপ এমন ফাইল তৈরি করে যা অন্যান্য অ্যাপের অ্যাক্সেস করার প্রয়োজন হয় না বা অ্যাক্সেস করা উচিত নয়। এই ধরনের ফাইল ম্যানেজ করার জন্য সিস্টেম অ্যাপ-নির্দিষ্ট স্টোরেজ লোকেশন প্রদান করে।

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

মিডিয়া ফাইল ম্যানেজ করা

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

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

একাধিক ফোল্ডার থেকে ছবি বা ভিডিও ফাইল দেখান

query() API ব্যবহার করে মিডিয়া কালেকশন কোয়েরি করুন। মিডিয়া ফাইল ফিল্টার বা সাজাতে, projection, selection, selectionArgs এবং sortOrder প্যারামিটার অ্যাডজাস্ট করুন।

কোনও নির্দিষ্ট ফোল্ডার থেকে ছবি বা ভিডিও দেখান

এই পদ্ধতি ব্যবহার করুন:

  1. অ্যাপকে দেওয়া অনুমতির জন্য অনুরোধ করুন বিভাগে উল্লেখ করা পেশাদার পদ্ধতি অনুসরণ করে, READ_EXTERNAL_STORAGE অনুমতির জন্য অনুরোধ করুন।
  2. MediaColumns.DATA-এর মানের উপর ভিত্তি করে মিডিয়া ফাইল ফিরিয়ে আনে, যেটিতে ডিস্কে মিডিয়া আইটেমের অ্যাবসোলিউট ফাইলসিস্টেম পাথ থাকে।

মনে রাখবেন: আপনি আগে থেকে থাকা কোনও মিডিয়া ফাইল অ্যাক্সেস করলে, আপনার লজিকে DATA কলামের ভ্যালু ব্যবহার করতে পারবেন। কারণ এই ভ্যালুতে সঠিক ফাইল পাথ রয়েছে। তবে, ফাইলটি সবসময় উপলভ্য থাকবে বলে ধরে নেবেন না। ফাইল-ভিত্তিক I/O সংক্রান্ত কোনও সমস্যা হলে তা সমাধান করার জন্য প্রস্তুত থাকুন।

অন্যদিকে, মিডিয়া ফাইল তৈরি বা আপডেট করতে, DATA কলাম ব্যবহার করবেন না। পরিবর্তে, DISPLAY_NAME এবং RELATIVE_PATH কলাম ব্যবহার করুন।

ফটো থেকে লোকেশন সংক্রান্ত তথ্য অ্যাক্সেস করা

আপনার অ্যাপ যদি স্কোপড স্টোরেজ ব্যবহার করে, তাহলে মিডিয়া স্টোরেজ গাইডের ফটোগ্রাফে লোকেশন তথ্য বিভাগে উল্লেখ করা ধাপগুলি অনুসরণ করুন।

নতুন ডাউনলোডের জন্য স্টোরেজ লোকেশন নির্ধারণ করুন

আপনার অ্যাপ যদি স্কোপড স্টোরেজ ব্যবহার করে, তাহলে ডাউনলোড করা মিডিয়া ফাইল সেভ করার জন্য লোকেশন বেছে নেওয়ার সময় সতর্ক থাকুন।

অন্যান্য অ্যাপের যদি ফাইলে অ্যাক্সেসের প্রয়োজন হয়, তাহলে ডাউনলোড বা ডকুমেন্ট সংগ্রহের জন্য সুনির্দিষ্ট মিডিয়া সংগ্রহ ব্যবহার করার কথা বিবেচনা করুন।

Android 11 ও তার পরবর্তী ভার্সনে, আপনার এক্সটার্নাল অ্যাপ-নির্দিষ্ট ডিরেক্টরির মধ্যে থাকা ফাইলগুলি অন্যান্য অ্যাপ অ্যাক্সেস করতে পারে না, এমনকি আপনি এইসব ফাইল নিয়ে আসার জন্য DownloadManager ব্যবহার করলেও।

কোনও ডিভাইসে ব্যবহারকারীর মিডিয়া ফাইল এক্সপোর্ট করা

ব্যবহারকারীর মিডিয়া ফাইল স্টোর করার জন্য একটি সঠিক ডিফল্ট লোকেশন সংজ্ঞায়িত করুন:

একই অপারেশনে একাধিক মিডিয়া ফাইল পরিবর্তন করুন বা মুছে দিন

আপনার অ্যাপ যে Android ভার্সনে চলে তার উপর ভিত্তি করে লজিক অন্তর্ভুক্ত করুন।

Android 11-এ চলছে

এই পদ্ধতি ব্যবহার করুন:

  1. MediaStore.createWriteRequest() বা MediaStore.createTrashRequest() ব্যবহার করে আপনার অ্যাপের লেখা বা মুছে ফেলার অনুরোধের জন্য একটি পেন্ডিং ইনটেন্ট তৈরি করুন এবং তারপরে সেই ইনটেন্টটি চালু করে ফাইলের একটি সেট এডিট করার জন্য ব্যবহারকারীর কাছে অনুমতি চান।
  2. ব্যবহারকারীর উত্তর মূল্যায়ন করুন:

    • অনুমতি দেওয়া থাকলে, পরিবর্তন বা মুছে ফেলার অপারেশন চালিয়ে যান।
    • অনুমতি না দেওয়া হলে, আপনার অ্যাপের ফিচারটির কেন অনুমতি প্রয়োজন তা ব্যবহারকারীকে ব্যাখ্যা করুন।

Android 11 ও তার পরবর্তী ভার্সনে উপলভ্য এইসব পদ্ধতি ব্যবহার করে কীভাবে মিডিয়া ফাইলের গ্রুপ ম্যানেজ করবেন সেই সম্পর্কে আরও জানুন।

Android 10-এ চলছে

আপনার অ্যাপ Android 10 (API লেভেল 29) টার্গেট করলে, স্কোপড স্টোরেজ থেকে অপ্ট-আউট করুন এবং এই অপারেশন করার জন্য Android 9 ও তার আগের ভার্সনের পদ্ধতি ব্যবহার করা চালিয়ে যান।

Android 9 বা তার আগের যেকোনও ভার্সনে চলছে

এই পদ্ধতি ব্যবহার করুন:

  1. অ্যাপকে দেওয়া অনুমতির জন্য অনুরোধ করুন লিঙ্কে উল্লেখ করা পেশাদার পদ্ধতি অনুসরণ করে, WRITE_EXTERNAL_STORAGE অনুমতির জন্য অনুরোধ করুন।
  2. মিডিয়া ফাইল পরিবর্তন বা মুছে ফেলতে MediaStore API ব্যবহার করুন।

আগে থেকেই আছে এমন একটি ছবি ইমপোর্ট করুন

আপনি যখন আগে থেকেই আছে এমন একটি ছবি ইমপোর্ট করতে চান (যেমন, ব্যবহারকারীর প্রোফাইল ফটো হিসেবে ব্যবহার করার জন্য), আপনার অ্যাপ এই অপারেশনের জন্য নিজস্ব UI ব্যবহার করতে পারে অথবা সিস্টেম পিকার ব্যবহার করতে পারে।

আপনার নিজস্ব ইউজার ইন্টারফেস উপস্থাপন করুন

এই পদ্ধতি ব্যবহার করুন:

  1. অ্যাপকে দেওয়া অনুমতির জন্য অনুরোধ করুন লিঙ্কে উল্লেখ করা পেশাদার পদ্ধতি অনুসরণ করে, READ_EXTERNAL_STORAGE অনুমতির জন্য অনুরোধ করুন।
  2. মিডিয়া কালেকশন কোয়েরি করতে query() API ব্যবহার করুন।
  3. আপনার অ্যাপের কাস্টম UI-তে ফলাফল দেখান।

সিস্টেম পিকার ব্যবহার করা

ACTION_GET_CONTENT ইনটেন্ট ব্যবহার করুন, যা ব্যবহারকারীকে ইমপোর্ট করার জন্য একটি ছবি বেছে নিতে বলে।

ব্যবহারকারীকে বেছে নেওয়ার জন্য সিস্টেম পিকার যে ধরনের ছবি দেখায়, আপনি যদি তা ফিল্টার করতে চান, তাহলে setType() বা EXTRA_MIME_TYPES ব্যবহার করতে পারেন।

একটি ছবি ক্যাপচার করুন

আপনার অ্যাপে ব্যবহার করার জন্য কোনও একটি ছবি ক্যাপচার করতে চাইলে (যেমন, ব্যবহারকারীর প্রোফাইল ফটো হিসেবে ব্যবহার করার জন্য), ACTION_IMAGE_CAPTURE ইনটেন্ট ব্যবহার করে ব্যবহারকারীকে ডিভাইসের ক্যামেরা ব্যবহার করে ফটো তুলতে বলুন। সিস্টেম ক্যাপচার করা ফটো MediaStore.Images টেবিলে সেভ করে।

অন্য অ্যাপের সাথে মিডিয়া ফাইল শেয়ার করুন

MediaStore-এ সরাসরি রেকর্ড যোগ করতে insert() পদ্ধতি ব্যবহার করুন। আরও তথ্যের জন্য, মিডিয়া স্টোরেজ গাইডের আইটেম যোগ করুন বিভাগটি দেখুন।

নির্দিষ্ট অ্যাপের সাথে মিডিয়া ফাইল শেয়ার করা

ফাইল শেয়ারিং সেট-আপ করা সংক্রান্ত গাইডে যেভাবে বর্ণনা করা হয়েছে, সেই অনুযায়ী Android FileProvider কম্পোনেন্ট ব্যবহার করুন।

সরাসরি ফাইল পাথ ব্যবহার করে এমন কোড বা লাইব্রেরি থেকে ফাইল অ্যাক্সেস করুন

আপনার অ্যাপ যে Android ভার্সনে চলে তার উপর ভিত্তি করে লজিক অন্তর্ভুক্ত করুন।

Android 11-এ চলছে

এই পদ্ধতি ব্যবহার করুন:

  1. অ্যাপকে দেওয়া অনুমতির জন্য অনুরোধ করুন বিভাগে উল্লেখ করা পেশাদার পদ্ধতি অনুসরণ করে, READ_EXTERNAL_STORAGE অনুমতির জন্য অনুরোধ করুন।
  2. সরাসরি ফাইল পাথ ব্যবহার করে ফাইল অ্যাক্সেস করুন।

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

Android 10-এ চলছে

আপনার অ্যাপ Android 10 (API লেভেল 29) টার্গেট করলে, স্কোপড স্টোরেজ থেকে অপ্ট-আউট করুন এবং এই অপারেশন করার জন্য Android 9 ও তার আগের ভার্সনের পদ্ধতি ব্যবহার করা চালিয়ে যান।

Android 9 বা তার আগের যেকোনও ভার্সনে চলছে

এই পদ্ধতি ব্যবহার করুন:

  1. অ্যাপকে দেওয়া অনুমতির জন্য অনুরোধ করুন লিঙ্কে উল্লেখ করা পেশাদার পদ্ধতি অনুসরণ করে, WRITE_EXTERNAL_STORAGE অনুমতির জন্য অনুরোধ করুন।
  2. সরাসরি ফাইল পাথ ব্যবহার করে ফাইল অ্যাক্সেস করুন।

নন-মিডিয়া ফাইল ম্যানেজ করা

এই বিভাগে নন-মিডিয়া ফাইল ম্যানেজ করার কিছু সাধারণ ব্যবহারিক প্রয়োগের বর্ণনা করা হয়েছে এবং আপনার অ্যাপ ব্যবহার করতে পারে এমন হাই-লেভেল অ্যাপ্রোচ ব্যাখ্যা করা হয়েছে। নিচের সারণীতে এইসব ব্যবহারের প্রতিটি কেসের সারসংক্ষেপ করা হয়েছে এবং প্রতিটি বিভাগের লিঙ্ক দেওয়া হয়েছে যেখানে আরও বিবরণ রয়েছে।

ব্যবহারের উদাহরণ সারাংশ
ডকুমেন্ট ফাইল খোলা Android-এর সব ভার্সনের জন্য একই পদ্ধতি ব্যবহার করুন।
সেকেন্ডারি স্টোরেজ ভলিউমে ফাইলে লেখা Android 11-এর জন্য একটি পদ্ধতি ব্যবহার করুন। Android-এর আগের ভার্সনের জন্য অন্য পদ্ধতি ব্যবহার করুন।
আগে থেকে থাকা ফাইল পুরনো স্টোরেজ লোকেশন থেকে মাইগ্রেট করুন সম্ভব হলে আপনার ফাইল স্কোপড স্টোরেজে মাইগ্রেট করুন। প্রয়োজন হলে Android 10-এর জন্য স্কোপড স্টোরেজ থেকে বেরিয়ে আসুন।
অন্য অ্যাপের সাথে কন্টেন্ট শেয়ার করা Android-এর সব ভার্সনের জন্য একই পদ্ধতি ব্যবহার করুন।
মিডিয়া ফাইল নয় এমন ফাইল ক্যাশে করা Android-এর সব ভার্সনের জন্য একই পদ্ধতি ব্যবহার করুন।
কোনও ডিভাইসে মিডিয়া নয় এমন ফাইল এক্সপোর্ট করা আপনার অ্যাপ যদি স্কোপড স্টোরেজ ব্যবহার করে, তাহলে একটি পদ্ধতি ব্যবহার করুন। আপনার অ্যাপ স্কোপড স্টোরেজ থেকে বেরিয়ে এলে, অন্য পদ্ধতি ব্যবহার করুন।

ডকুমেন্ট ফাইল খুলুন

সিস্টেম পিকার ব্যবহার করে খোলার জন্য ব্যবহারকারীকে কোনও ফাইল বেছে নিতে বলতে, ACTION_OPEN_DOCUMENT ইনটেন্ট ব্যবহার করুন। ব্যবহারকারীকে বেছে নেওয়ার জন্য সিস্টেম পিকার যেসব ফাইলের ধরন দেখাবে, আপনি যদি সেগুলি ফিল্টার করতে চান, তাহলে setType() বা EXTRA_MIME_TYPES ব্যবহার করতে পারেন।

যেমন, আপনি নিম্নলিখিত কোড ব্যবহার করে সব PDF, ODT এবং TXT ফাইল খুঁজে পেতে পারেন:

Kotlin

startActivityForResult(
        Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
            addCategory(Intent.CATEGORY_OPENABLE)
            type = "*/*"
            putExtra(Intent.EXTRA_MIME_TYPES, arrayOf(
                    "application/pdf", // .pdf
                    "application/vnd.oasis.opendocument.text", // .odt
                    "text/plain" // .txt
            ))
        },
        REQUEST_CODE
      )

জাভা

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.setType("*/*");
        intent.putExtra(Intent.EXTRA_MIME_TYPES, new String[] {
                "application/pdf", // .pdf
                "application/vnd.oasis.opendocument.text", // .odt
                "text/plain" // .txt
        });
        startActivityForResult(intent, REQUEST_CODE);

সেকেন্ডারি স্টোরেজ ভলিউমে ফাইল লেখা

সেকেন্ডারি স্টোরেজ ভলিউমে এসডি কার্ড অন্তর্ভুক্ত। আপনি StorageVolume ক্লাস ব্যবহার করে প্রদত্ত স্টোরেজ ভলিউম সম্পর্কে তথ্য অ্যাক্সেস করতে পারবেন।

আপনার অ্যাপ যে Android ভার্সনে চলে তার উপর ভিত্তি করে লজিক অন্তর্ভুক্ত করুন।

Android 11-এ চলছে

এই পদ্ধতি ব্যবহার করুন:

  1. স্কোপড স্টোরেজ মডেল ব্যবহার করুন।
  2. Android 10 (API লেভেল ২৯) বা তার আগের যেকোনও ভার্সন টার্গেট করে।
  3. WRITE_EXTERNAL_STORAGE অনুমতি ঘোষণা করুন।
  4. নিম্নলিখিত ধরনের অ্যাক্সেসের মধ্যে একটি বেছে নিন:
    • MediaStore API ব্যবহার করে ফাইল অ্যাক্সেস।
    • File বা fopen()-এর মতো API ব্যবহার করে সরাসরি ফাইল পাথ অ্যাক্সেস করা।

পুরনো ভার্সনে চলছে

Storage Access Framework ব্যবহার করুন, যা ব্যবহারকারীদের সেকেন্ডারি স্টোরেজ ভলিউমে লোকেশন বেছে নিতে দেয় যেখানে আপনার অ্যাপ ফাইল লিখতে পারে।

পুরনো স্টোরেজ লোকেশন থেকে আগে থেকে থাকা ফাইল মাইগ্রেট করা

কোনও ডিরেক্টরিকে লেগেসি স্টোরেজ লোকেশন হিসেবে বিবেচনা করা হয় যদি সেটি অ্যাপ-নির্দিষ্ট ডিরেক্টরি বা সর্বজনীন শেয়ার করা ডিরেক্টরি না হয়। আপনার অ্যাপ যদি কোনও লিগ্যাসি স্টোরেজ লোকেশনে ফাইল তৈরি বা ব্যবহার করে, তাহলে আমরা সাজেস্ট করি যে আপনি অ্যাপের ফাইলগুলি এমন লোকেশনে মাইগ্রেট করুন যা স্কোপড স্টোরেজের মাধ্যমে অ্যাক্সেস করা যায় এবং স্কোপড স্টোরেজে ফাইলের সাথে কাজ করার জন্য প্রয়োজনীয় অ্যাপ পরিবর্তন করুন।

ডেটা মাইগ্রেশনের জন্য পুরনো স্টোরেজ লোকেশনে অ্যাক্সেস বজায় রাখা

স্কোপড স্টোরেজের মাধ্যমে অ্যাক্সেস করা যায় এমন লোকেশনে কোনও অ্যাপ ফাইল মাইগ্রেট করার জন্য আপনার অ্যাপকে লিগ্যাসি স্টোরেজ লোকেশনে অ্যাক্সেস বজায় রাখতে হবে। আপনার অ্যাপের টার্গেট API লেভেলের উপর নির্ভর করে আপনাকে পদ্ধতি ব্যবহার করতে হবে।

আপনার অ্যাপ Android 11 ভার্সনকে টার্গেট করলে
  1. preserveLegacyExternalStorage ফ্ল্যাগ true-এ সেট করুন যাতে লেগেসি স্টোরেজ সুরক্ষিত থাকে model এবং আপনার অ্যাপ ব্যবহারকারীর ডেটা মাইগ্রেট করতে পারে যখন তারা Android 11-কে টার্গেট করা আপনার অ্যাপের নতুন ভার্সনে আপগ্রেড করে।

  2. স্কোপড স্টোরেজ থেকে বেরিয়ে আসা চালিয়ে যান যাতে আপনার অ্যাপ Android 10 ডিভাইসে লিগ্যাসি স্টোরেজ লোকেশনে আপনার ফাইল অ্যাক্সেস করা চালিয়ে যেতে পারে।

আপনার অ্যাপ Android 10 ভার্সনকে টার্গেট করলে

বিভিন্ন Android ভার্সন জুড়ে আপনার অ্যাপের আচরণ বজায় রাখা আরও সহজ করতে স্কোপড স্টোরেজ থেকে অপ্ট-আউট করুন।

অ্যাপ ডেটা মাইগ্রেট করুন

আপনার অ্যাপ মাইগ্রেট করার জন্য রেডি হলে, নিম্নলিখিত পদ্ধতি ব্যবহার করুন:

  1. Android 10 বা তার আগের যেকোনও ভার্সনকে টার্গেট করে।
  2. স্কোপড স্টোরেজ থেকে বেরিয়ে আসুন যাতে আপনার অ্যাপের কাছে সেইসব ফাইলের অ্যাক্সেস থাকে যেগুলি আপনাকে মাইগ্রেট করতে হবে।
  3. /sdcard/-এর অধীনে বর্তমান লোকেশন থেকে ফাইলগুলিকে স্কোপড স্টোরেজের মাধ্যমে অ্যাক্সেসযোগ্য লোকেশনে সরানোর জন্য File API ব্যবহার করে এমন কোড ডিপ্লয় করুন:

    1. যেকোনও ব্যক্তিগত অ্যাপ ফাইলকে সেই ডিরেক্টরিতে সরান যা getExternalFilesDir() পদ্ধতির মাধ্যমে ফেরত দেওয়া হয়।
    2. শেয়ার করা যেকোনও নন-মিডিয়া ফাইল Downloads/ ডিরেক্টরির অ্যাপ-ডেডিকেটেড সাবডিরেক্টরিতে সরিয়ে দিন।
  4. /sdcard/ ডিরেক্টরি থেকে আপনার অ্যাপের লিগ্যাসি স্টোরেজ ডিরেক্টরি সরিয়ে দিন।

ব্যবহারকারীরা আপনার অ্যাপের নতুন ভার্সন ইনস্টল করার পরে, তাদের ডিভাইসে ডেটা মাইগ্রেশন প্রসেস সম্পূর্ণ করেন। আপনি অ্যানালিটিক্স ইভেন্ট তৈরি করে আপনার ব্যবহারকারী বেস জুড়ে মাইগ্রেশন প্রসেস মনিটর করতে পারবেন।

ব্যবহারকারীরা তাদের ডেটা মাইগ্রেট করার পরে, আপনার অ্যাপে আরেকটি আপডেট প্রকাশ করুন, যেখানে আপনি Android 11-কে টার্গেট করবেন।

অন্য অ্যাপের সাথে কন্টেন্ট শেয়ার করা

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

মিডিয়া ফাইল নয় এমন ফাইল ক্যাশে করুন

আপনি কোন পদ্ধতি ব্যবহার করবেন তা নির্ভর করে আপনি কোন ধরনের ফাইল ক্যাশে করতে চান তার উপর।

  • ছোট ফাইল বা সংবেদনশীল তথ্য আছে এমন ফাইল: Context#getCacheDir() ব্যবহার করুন।
  • বড় ফাইল বা সংবেদনশীল তথ্য নেই এমন ফাইল: Context#getExternalCacheDir() ব্যবহার করুন।

ডিভাইসে নন-মিডিয়া ফাইল এক্সপোর্ট করা

মিডিয়া নয় এমন ফাইল সেভ করার জন্য একটি সঠিক ডিফল্ট লোকেশন নির্ধারণ করুন। ব্যবহারকারীদের অ্যাপ-নির্দিষ্ট ডিরেক্টরি থেকে আরও সাধারণভাবে অ্যাক্সেসযোগ্য লোকেশনে ফাইল এক্সপোর্ট করার অনুমতি দিন। ডিভাইসে মিডিয়া ফাইল নয় এমন ফাইল এক্সপোর্ট করতে MediaStore-এর ডাউনলোড বা ডকুমেন্ট কালেকশন ব্যবহার করুন।

অ্যাপ-নির্দিষ্ট ফাইল ম্যানেজ করা

আপনার অ্যাপ যদি এমন ফাইল তৈরি করে যা অন্য অ্যাপের অ্যাক্সেস করার প্রয়োজন নেই বা অ্যাক্সেস করা উচিত নয়, তাহলে আপনি এইসব ফাইল অ্যাপ-নির্দিষ্ট স্টোরেজ লোকেশনে সেভ করতে পারবেন।

ইন্টার্নাল স্টোরেজ ডিরেক্টরি

সিস্টেম অন্যান্য অ্যাপকে এইসব লোকেশন অ্যাক্সেস করতে দেয় না এবং Android 10 (API লেভেল ২৯) ও তার পরবর্তী ভার্সনে এইসব লোকেশন এনক্রিপ্ট করা থাকে। এইসব লোকেশন সংবেদনশীল ডেটা স্টোর করার জন্য উপযুক্ত জায়গা, যা শুধুমাত্র আপনার অ্যাপ অ্যাক্সেস করতে পারবে।

এক্সটার্নাল স্টোরেজ ডিরেক্টরি

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

Android 4.4 (API লেভেল 19) বা তার পরবর্তী ভার্সনে, এক্সটার্নাল স্টোরেজের মধ্যে অ্যাপ-নির্দিষ্ট ডিরেক্টরি অ্যাক্সেস করার জন্য আপনার অ্যাপকে স্টোরেজ-সম্পর্কিত কোনও অনুমতির অনুরোধ করতে হবে না।

ব্যবহারকারী আপনার অ্যাপ আনইনস্টল করলে, অ্যাপ-নির্দিষ্ট স্টোরেজে সেভ করা ফাইল মুছে যায়, তাই আপনার অ্যাপ থেকে স্বাধীনভাবে ব্যবহারকারী যেসব ফাইল রাখতে চান সেগুলি সেভ করার জন্য এই স্টোরেজ ব্যবহার করা উচিত নয়।

সাময়িকভাবে স্কোপড স্টোরেজ থেকে অপ্ট-আউট করুন

আপনার অ্যাপ স্কোপড স্টোরেজের সাথে সম্পূর্ণ মানানসই হওয়ার আগে, আপনি আপনার টেস্ট এবং প্রোডাকশন অ্যাপ, দুটিতেই সাময়িকভাবে অপ্ট-আউট করতে পারবেন।

আপনার টেস্ট থেকে অপ্ট-আউট করুন

Android 10 (API লেভেল 29) এবং তার পরবর্তী যেকোনও ভার্সনে, আপনার অ্যাপের টেস্ট ডিফল্ট হিসেবে স্টোরেজ স্যান্ডবক্সে রান করে। এই স্যান্ডবক্স আপনার অ্যাপকে অ্যাপ-নির্দিষ্ট ডিরেক্টরি এবং সর্বজনীনভাবে শেয়ার করা ডিরেক্টরির বাইরে ফাইল অ্যাক্সেস করতে বাধা দেয়।

কোনও টেস্ট যদি হোস্টের জন্য ফাইল আউটপুট করে—যেমন স্ক্রিনশট, ডিবাগিং ডেটা, কভারেজ ডেটা বা পারফর্ম্যান্স মেট্রিক—আপনি এইসব ফাইল গ্লোবাল ডিরেক্টরিতে লিখতে পারবেন। এটি করতে, প্রাসঙ্গিক হার্নেসে নিম্নলিখিত ফ্ল্যাগ যোগ করুন যা am instrument-কে ইনভোক করে:

-e no-isolated-storage 1

এই ফ্ল্যাগ ইনস্ট্রুমেন্টেড টেস্ট কেসের সমস্ত আচরণকে প্রভাবিত করে এবং এটি সমস্ত ইনভোক করা টেস্ট কোডকে প্রভাবিত করে। তাই, আপনি এই ফ্ল্যাগ ব্যবহার করলে, স্কোপড স্টোরেজের সাথে আপনার অ্যাপের সামঞ্জস্যতা যাচাই করতে পারবেন না। টেস্ট আউটপুটের জন্য, এর পরিবর্তে অ্যাপ-স্কোপড স্টোরেজে লিখলে ভালো হয় যা শেল পড়তে পারে। তারপর আপনি সেই অ্যাপ-স্কোপড ডিরেক্টরি পুল করতে পারবেন। কোন ডিরেক্টরি থেকে ডেটা নেওয়া হবে তা নির্ধারণ করতে, getExternalMediaDirs() কল করুন।

আপনার প্রোডাকশন অ্যাপ থেকে অপ্ট-আউট করুন

আপনার অ্যাপ Android 10 (API লেভেল ২৯) বা তার আগের ভার্সন টার্গেট করলে, আপনি প্রোডাকশন অ্যাপে সাময়িকভাবে স্কোপড স্টোরেজ থেকে অপ্ট-আউট করতে পারবেন। তবে, আপনি Android 10 টার্গেট করলে, আপনার অ্যাপের ম্যানিফেস্ট ফাইলে requestLegacyExternalStorage-এর ভ্যালু true হিসেবে সেট করতে হবে:

<manifest ... >
  <!-- This attribute is "false" by default on apps targeting
       Android 10. -->
  <application android:requestLegacyExternalStorage="true" ... >
    ...
  </application>
</manifest>

Android ১০ বা তার আগের ভার্সন টার্গেট করা কোনও অ্যাপ স্কোপড স্টোরেজ ব্যবহার করার সময় কেমন আচরণ করে তা পরীক্ষা করতে, আপনি requestLegacyExternalStorage-এর ভ্যালু false-এ সেট করে আচরণে সম্মতি দিতে পারেন। আপনি যদি Android ১১ ভার্সনে চলে এমন কোনও ডিভাইসে পরীক্ষা করেন, তাহলে আপনি অ্যাপ কম্প্যাটিবিলিটি ফ্ল্যাগ ব্যবহার করতে পারেন যাতে স্কোপড স্টোরেজ সহ বা ছাড়া আপনার অ্যাপের আচরণ পরীক্ষা করা যায়।

অতিরিক্ত রিসোর্স

Android স্টোরেজ সম্পর্কে আরও তথ্যের জন্য, নিম্নলিখিত মেটেরিয়াল দেখুন:

ব্লগ পোস্ট