কারন এক্সটার্নাল স্টোরেজ সহজপ্রাপ্য নাও হতে পারে-যেমন যখন ইউজার একটা পিসিতে স্টোরেজ প্রসারিত করে অথবা এসডি কার্ড যা এক্সটার্নাল স্টোরেজ সরবরাহ করে তা রিমুভ/অপসারন করে-আপনার সবসময় যাচাই করা উচিত যে এটাতে প্রবেশ করার পূর্বে ভলিউমটি বিদ্যমান থাকে। আপনি getExternalStorageState()কল করে এক্সটার্নাল স্টোরেজ অবস্থা সম্পর্কে অনুসন্ধান করতে পারেন। যদি ফিরতি স্টেট MEDIA MOUNTED এর মতো হয় তাহলে আপনি আপনার ফাইল লিখতে বা পড়তে পারেন। উদাহরণস্বরূপ, নিম্নোক্ত মেথড স্টোরেজ এর বিদ্যমানতা নির্ধারনে গুরুত্বপূর্ণ:
/* Checks if external storage is available for read and write */
public boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
return true;
}
return false;
}
/* Checks if external storage is available to at least read */
public boolean isExternalStorageReadable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state) ||
Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
return true;
}
return false;
}
যদিও এক্সটার্নাল স্টোরেজ ইউজার এবং অন্য অ্যাপ কর্তৃক পরিবর্তনযোগ্য, সেখানে দুই ধরনের ফাইল আছে যা আপনি এখানে সেভ করতে পারেন:
পাবলিক ফাইল
ফাইল যা অন্য অ্যাপে এবং ইউজারের জন্য মুক্তভাবে সহজলভ্য হওয়া উচিত। যখন ইউজার আপনার অ্যাপ আনইনস্টল করবে, এই সকল ফাইল ইউজারের কাছে থাকা উচিত।
উদাহরণ হিসাবে, আপনার অ্যাপ কর্তৃক ক্যাপচার করা ফটো অথবা অন্যান্য ডাউনলোড করা ফাইল।
প্রাইভেট ফাইল
ফাইল যা আইনগতভাবে আপনার অ্যাপের সাথে থাকা উচিত এবং যখন ইউজার আপনার অ্যাপ আনইনস্টল করে তখন এটা ডিলিট হয়ে যাওয়া উচিত। যদিও এই সকল ফাইল কৌশলগতভাবে ইউজার বা অন্য অ্যাপ কর্র্তৃক প্রবেশগম্য কারন তারা এক্সটার্নাল স্টোরেজ এ আছে, এই ফাইল যৌক্তিকভাবে আপনার অ্যাপের বাইরে কোন ইউজারকে ভ্যালু প্রদান করে না। যখন ইউজার আপনরা অ্যাপ আনইনস্টল করে, সিস্টেমটি আপনার অ্যাপের এক্সটার্নাল প্রাইভেট ডিরেক্টরীর সকল ফাইল ডিলিট করে দেয়।
উদাহরণস্বরূপ, আপনার অ্যাপ কর্তৃক ডাউনলোড করা অতিরিক্ত রিসোর্স অথবা অস্থায়ী মিডিয়া ফাইল।
যদি আপনি পাবলিক ফাইল এক্সটার্নাল স্টোরেজে সেভ করতে চান, এক্সটার্নাল স্টোরেজে যথাপোযুক্ত ডিরেক্টরির প্রতিনিধিত্বকারী একটি File পেতে getExternalStoragePublicDirectory()মেথড ব্যবহার করুন। এই মেথড যে ধরনের ফাইল আপনি সেভ করতে চান তা সুনির্দিষ্ট করে একটা আলোচনা নিয়ে আসে যাতে তারা অন্যান্য পাবলিক ফাইলের সাথে যৌক্তিকভাবে সংগঠিত হতে পারে, যেমন, DIRECTORY MUSIC বা DIRECTORY PICTURES। উদাহরণস্বরূপ:
public File getAlbumStorageDir(String albumName) {
// Get the directory for the user's public pictures directory.
File file = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), albumName);
if (!file.mkdirs()) {
Log.e(LOG_TAG, "Directory not created");
}
return file;
}
আপনি যদি ফাইল সেভ করতে চান যা আপনার অ্যাপের কাছে প্রাইভেট,আপনি getExternalFilesDir()কল করে যথাযথ ডিরেক্টরী পেতে পারেন এবং ডিরেক্টরীর ধরন যা আপনি পছন্দ করেন তা নির্দেশ করে এটা একটা নেমে পাস করে দিন। এই এই উপায়ে তৈরী করে প্রতিটা ডিরেক্টরী প্যারেন্ট ডিরেক্টরীতে যুক্ত হয় যা আপনার অ্যাপের এক্সটার্নাল স্টোরেজের সকল ফাইলকে একত্রিত করে রাখে যা সিস্টেম ডিলিট করে দেয় যখন ইউজার আপনার অ্যাপ আনইনস্টল করে দেয়।
উদাহরণস্বরূপ, এখানে একটা মেথড দেয়া আছে যা আপনি একটি একক ফটো এলবামের জন্য একটি ডিরেক্টরী তৈরীতে ব্যবহার করতে পারেন:
public File getAlbumStorageDir(Context context, String albumName) {
// Get the directory for the app's private pictures directory.
File file = new File(context.getExternalFilesDir(
Environment.DIRECTORY_PICTURES), albumName);
if (!file.mkdirs()) {
Log.e(LOG_TAG, "Directory not created");
}
return file;
}
যদি পূর্ব নির্ধারিত সাব ডিরেক্টরীর কোন নামই আপনার ফাইলের সাথে না যায়, পরীবর্তে আপনি getExternalFilesDir()কল করতে পারেন এবং হঁষষ পাস করতে পারেন। এটা এক্সটার্নাল স্টোরেজে আপনার অ্যাপের প্রাইভেট ডিরেক্টরীর জন্য রুট ডিরেক্টরী ফেরত নিয়ে আসে।
যদি মনে রাখেন যে getExternalFilesDir()একটি ডিরেক্টরীর মধ্যে একটি ডিরেক্টরী তৈরী করে, যা ডিলিট হয় যখন ইউজার আপনার অ্যাপ আনইনস্টল করে। যদি ফাইলটি যা আপনি সেভ করছেন তা ইউজার কর্তৃক আপনার অ্যাপ আনইনস্টল করার পরও বিদ্যমান থাকতে হয়-যেমন আপনার অ্যাপ হচ্ছে একটা ক্যামেরা এবং ইউজার ফটোটা রাখতে চায়- পরিবর্তে আপনার getExternalStoragePublicDirectory() ব্যবহার করা উচিত।
যদি কোন কারনে আপনি ফাইলের জন্য getExternalStoragePublicDirectory() ব্যবহার করেন যা শেয়ারড বা ফাইলের জন্য getExternalFilesDir() যা আপনার অ্যাপের কাছে প্রাইভেট, এটা গুরুত্বপূর্ণ যে আপনি এপিআই কনসটেন্ট কর্র্তৃক প্রদত্ত DIRECTORY PICTURE এর মতো ডিরেক্টরী নেম ব্যবহার করছেন। এই ডিরেক্টরী নেম নিশ্চিত করে যে ফাইলটি সিস্টেম কর্তৃক যথাযথভাবে যত্ন পাবে, উদাহরণস্বরূপ, DIRECTORY RINGTONES সেভ হওয়া ফাইল সিস্টেম মিডিয়া স্ক্যানার কর্তৃক মিউজিকের পরিবর্তে রিংটোন হিসাবে শ্রেণীবদ্ধ হয়।