মোবাইল ডিভাইসে বাহ্যিক স্টোরেজ হল একটি অপসারণযোগ্য ডেটা মাধ্যম যা উপযুক্ত অনুমতি সহ যেকোনো অ্যাপ অ্যাক্সেস করতে পারে। Android Open Source Project, 2026 অনুসারে, Android 10 থেকে শুরু করে Google Scoped Storage চালু করেছে — একটি মডেল যা ফাইল সিস্টেমে সরাসরি অ্যাক্সেস সীমাবদ্ধ করে এবং শেয়ার্ড মিডিয়া ফাইলের সাথে কাজ করার জন্য MediaStore API ব্যবহারের প্রয়োজন। এই পদ্ধতি ব্যবহারকারীর ডেটার নিরাপত্তা বাড়ায় এবং অ্যাপের মধ্যে তথ্য ফাঁস রোধ করে।
মূল পয়েন্ট
READ_EXTERNAL_STORAGE এবং WRITE_EXTERNAL_STORAGE Android 9 এবং নিম্নের জন্য বাধ্যতামূলকবাহ্যিক স্টোরেজ হল একটি মেমরি এলাকা যা অ্যাপের সুরক্ষিত স্যান্ডবক্সের অংশ নয় এবং অন্যান্য প্রোগ্রামের জন্য অ্যাক্সেসযোগ্য। Android এ, এই শব্দটি সাধারণত SD কার্ডকে বোঝায়, কিন্তু বাহ্যিক স্টোরেজের মধ্যে OTG অ্যাডাপ্টারের মাধ্যমে সংযুক্ত USB ড্রাইভ এবং ফাইল সিস্টেম স্তরে সংহত ক্লাউড ড্রাইভও অন্তর্ভুক্ত। অভ্যন্তরীণ স্টোরেজ থেকে প্রধান পার্থক্য হল বিচ্ছিন্নতার অভাব: উপযুক্ত অনুমতি সহ যেকোনো অ্যাপ বাহ্যিক স্টোরেজে ফাইল পড়তে এবং পরিবর্তন করতে পারে।
Android এ, বাহ্যিক স্টোরেজ দুটি প্রধান মোডে আসে: পোর্টেবল এবং অ্যাডপ্টেবল। যখন SD কার্ড পোর্টেবল স্টোরেজ হিসাবে ফরম্যাট করা হয়, তখন এটি অপসারণযোগ্য থাকে এবং FAT32 বা exFAT এ ফরম্যাট হয়। অ্যাডপ্টেবল স্টোরেজ মোডে, কার্ড ext4 এ ফরম্যাট হয় এবং AES-128 ব্যবহার করে এনক্রিপ্ট হয়, যার পরে সিস্টেম এটিকে অভ্যন্তরীণ মেমরির সম্প্রসারণ হিসাবে বিবেচনা করে। অ্যাডপ্টেবল মোড Android 6.0 Marshmallow থেকে উপলব্ধ, কিন্তু ডিভাইস প্রস্তুতকারীরা প্রায়শই তাদের ফার্মওয়্যারে এই বৈশিষ্ট্যটি নিষ্ক্রিয় করে। Google Play Console পরিসংখ্যান অনুসারে, শুধুমাত্র প্রায় 12% Android ডিভাইস অ্যাডপ্টেবল স্টোরেজ সমর্থন করে, তাই একমাত্র বিকল্প হিসাবে SD কার্ডের মাধ্যমে অভ্যন্তরীণ মেমরি সম্প্রসারণের উপর নির্ভর করা সুপারিশ করা হয় না।
iOS এ, ঐতিহ্যবাহী SD কার্ড পাওয়া যায় না। Apple একটি বন্ধ আর্কিটেকচার ব্যবহার করে যেখানে সমস্ত স্টোরেজ অভ্যন্তরীণ ফ্ল্যাশ মেমরি এবং iCloud এর উপর নির্মিত। বাহ্যিক ড্রাইভ Lightning বা USB-C পোর্টের মাধ্যমে সমর্থিত, কিন্তু সেগুলিতে অ্যাক্সেস সিস্টেম ফাইল ম্যানেজার Files এবং那些 অ্যাপের মধ্যে সীমাবদ্ধ যা Document Picker এর সাথে সংহত হয়। ব্যবহারকারী সিদ্ধান্ত নেয় বাহ্যিক উৎস থেকে কোন ফাইল খুলতে হবে — অ্যাপ স্পষ্ট সম্মতি ছাড়া সংযুক্ত ড্রাইভ স্ক্যান করতে পারে না।
বাহ্যিক মিডিয়া নির্বাচন গতি, ক্ষমতা এবং পোর্টেবিলিটির প্রয়োজনীয়তার উপর নির্ভর করে। বিভিন্ন ধরণের মিডিয়ার মোবাইল অ্যাপে বিভিন্ন গতি বৈশিষ্ট্য, ফাইল সিস্টেম এবং ব্যবহারের ক্ষেত্রে রয়েছে।
| মিডিয়ার ধরন | সর্বোচ্চ ক্ষমতা | পড়ার গতি | ফাইল সিস্টেম |
|---|---|---|---|
| SD UHS-I | 2 TB | 104 MB/s পর্যন্ত | exFAT / FAT32 |
| SD UHS-II | 2 TB | 312 MB/s পর্যন্ত | exFAT / FAT32 |
| USB 3.0 OTG | 2 TB | 400 MB/s পর্যন্ত | exFAT / NTFS / FAT32 |
| USB-C SSD | 4 TB | 1000 MB/s পর্যন্ত | exFAT / APFS / NTFS |
SD কার্ড লেখার গতি অনুসারে শ্রেণীবদ্ধ করা হয়: Class 10 (10 MB/s), U1 (10 MB/s), U3 (30 MB/s), V30 (30 MB/s) এবং V90 (90 MB/s)। 4K ভিডিও রেকর্ডিংয়ের জন্য কমপক্ষে U3 বা V30 কার্ড প্রয়োজন। বড় মিডিয়া ফাইল (ফটো প্রসেসিং, ভিডিও এডিটিং) নিয়ে কাজ করা মোবাইল অ্যাপের জন্য, U3 শ্রেণী এবং তার উপরের কার্ড ব্যবহার করার সুপারিশ করা হয়। কার্ডের গতি সরাসরি অ্যাপের কর্মক্ষমতা প্রভাবিত করে: Class 10 কার্ডে 4K ভিডিও রেকর্ড করলে অপর্যাপ্ত ব্যান্ডউইথের কারণে ফ্রেম ড্রপ হতে পারে। কোনো অ্যাপের জন্য SD কার্ড নির্বাচন করার সময়, শুধু গতি শ্রেণী নয় বরং অ্যাপ্লিকেশন পারফরম্যান্স ক্লাস রেটিং-এর দিকেও মনোযোগ দিন: A1 এবং A2 ডাটাবেস এবং অ্যাপ ক্যাশ অপারেশনের জন্য গুরুত্বপূর্ণ ন্যূনতম র্যান্ডম রিড এবং রাইট কর্মক্ষমতা নির্দেশ করে।
USB-OTG (On-The-Go) একটি অ্যাডাপ্টারের মাধ্যমে মোবাইল ডিভাইসে বাহ্যিক USB ড্রাইভ সংযোগ করার অনুমতি দেয়। Android সংস্করণ 3.1 থেকে OTG সমর্থন করে, কিন্তু ড্রাইভ মাউন্ট করার জন্য ফাইল সিস্টেম সমর্থন সহ একটি কার্নেল প্রয়োজন। FAT32 এবং exFAT ডিফল্টরূপে সমর্থিত, NTFS — শুধুমাত্র কাস্টম কার্নেলযুক্ত ডিভাইসে বা Paragon লাইব্রেরির মাধ্যমে। iOS এ, USB ড্রাইভ সমর্থন iOS 13 এ Files অ্যাপের সাথে উপস্থিত হয়েছে। ড্রাইভের সাথে কাজ করার জন্য, অ্যাপটিকে UIDocumentPickerViewController ব্যবহার করতে হবে, যা শুধুমাত্র ব্যবহারকারীর নির্বাচিত ফাইলগুলিতে অ্যাক্সেস প্রদান করে — iOS ড্রাইভের ফাইল সিস্টেমে সম্পূর্ণ অ্যাক্সেস প্রদান করে না।
ক্লাউড পরিষেবাগুলি — iCloud, Google Drive, Dropbox — সিস্টেম প্রদানকারীদের মাধ্যমে ডিভাইসের ফাইল সিস্টেমে সংহত হতে পারে। iOS এ, iCloud Drive অ্যাপের Sandbox কন্টেইনারের অংশ এবং ব্যবহারকারীর ডিভাইসগুলির মধ্যে ফাইলগুলি স্বয়ংক্রিয়ভাবে সিঙ্ক হয়। Android এ, Google Drive ফাইল পড়া এবং লেখার জন্য API প্রদান করে, কিন্তু ফাইল সিস্টেমে সরাসরি মাউন্টিং ঘটে না। বড় পরিমাণ ডেটা নিয়ে কাজ করা মোবাইল অ্যাপের জন্য, ক্লাউড স্টোরেজ SD কার্ডের বিকল্প হিসাবে কাজ করতে পারে, বিশেষত সম্প্রসারণ স্লট ছাড়া ডিভাইসে।
Android এ বাহ্যিক স্টোরেজ নিয়ে কাজ করা অপারেটিং সিস্টেম সংস্করণ এবং Scoped Storage মডেলের উপর নির্ভর করে। ফাইল অ্যাক্সেস প্রক্রিয়া Android 9 এবং নিম্ন, Android 10–12 এবং Android 13+ এর জন্য আলাদা।
Android 10 থেকে শুরু করে, শেয়ার্ড মিডিয়া ফাইল অ্যাক্সেস করার প্রাথমিক উপায় হল MediaStore API। এই API শেয়ার্ড স্টোরেজে ইমেজ, ভিডিও এবং অডিও ফাইল পড়া এবং লেখার জন্য একটি ইউনিফাইড ইন্টারফেস প্রদান করে। একটি অ্যাপের নিজস্ব ফাইল অ্যাক্সেস করতে READ_EXTERNAL_STORAGE অনুমতির প্রয়োজন নেই, কিন্তু অন্যান্য অ্যাপের ফাইল পড়ার জন্য এখনও স্পষ্ট ব্যবহারকারীর অনুমতি প্রয়োজন। MediaStore স্বয়ংক্রিয়ভাবে মিডিয়া ফাইলগুলি সূচিবদ্ধ করে এবং সেগুলি ক্যোয়ারী করার জন্য ContentResolver প্রদান করে।
val collection = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY)
} else {
MediaStore.Images.Media.EXTERNAL_CONTENT_URI
}
val projection = arrayOf(
MediaStore.Images.Media._ID,
MediaStore.Images.Media.DISPLAY_NAME
)
val cursor = contentResolver.query(collection, projection, null, null, null)
ক্যোয়ারী সম্পাদন করার পরে, আপনি ফাইলগুলির URI সম্বলিত একটি Cursor পান। ফাইল পড়ার জন্য, contentResolver.openInputStream(uri) এর মাধ্যমে InputStream খুলুন। লেখা একইভাবে contentResolver.openOutputStream(uri) এর মাধ্যমে করা হয়। MediaStore স্বয়ংক্রিয়ভাবে নামের দ্বন্দ্বগুলি পরিচালনা করে এবং contentResolver.insert(uri, values) এর মাধ্যমে নতুন ফাইল সন্নিবেশ করার ক্ষমতা প্রদান করে, যা তৈরি ফাইলের URI ফেরত দেয়।
Storage Access Framework (SAF) Android 10+ এ ইচ্ছামত ফাইল অ্যাক্সেস করার সুপারিশকৃত উপায়। SAF একটি সিস্টেম ফাইল নির্বাচক ডায়ালগ প্রদান করে যার মাধ্যমে ব্যবহারকারী অ্যাপকে একটি নির্দিষ্ট ফাইল বা ডিরেক্টরিতে অ্যাক্সেস প্রদান করে। অ্যাপটি একটি অ্যাক্সেস URI পায় যা ডিভাইস রিবুট না হওয়া পর্যন্ত বা সেটিংসে অনুমতি স্পষ্টভাবে প্রত্যাহার না করা পর্যন্ত বৈধ থাকে। SAF এর READ_EXTERNAL_STORAGE বা WRITE_EXTERNAL_STORAGE অনুমতির প্রয়োজন নেই, যা Google Play এ প্রকাশনা সহজ করে এবং অনুমতি অনুরোধের সংখ্যা হ্রাস করে।
val requestCode = 42
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)
intent.addFlags(
Intent.FLAG_GRANT_READ_URI_PERMISSION
or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
)
startActivityForResult(intent, requestCode)
iOS এ, বাহ্যিক ফাইল নিয়ে কাজ করা UIDocumentPickerViewController এর উপর ভিত্তি করে তৈরি, যা ব্যবহারকারী নির্দিষ্ট ফাইল বা ডিরেক্টরি নির্বাচন করতে খোলে। অ্যাপের বাহ্যিক ড্রাইভের ফাইল সিস্টেমে সরাসরি অ্যাক্সেস নেই — শুধুমাত্র সেই ফাইলগুলিতে যা ব্যবহারকারী স্পষ্টভাবে নির্বাচন করেছে। ফাইল নির্বাচনের পরে, অ্যাপ Sandbox কন্টেইনারে একটি অস্থায়ী URL পায় এবং FileManager এর মাধ্যমে ফাইল নিয়ে কাজ করতে পারে।
UIDocumentPickerViewController ব্যবহারকারীকে যেকোনো উপলব্ধ উৎস থেকে এক বা একাধিক ফাইল নির্বাচন করার অনুমতি দেয়: iCloud Drive, সংযুক্ত USB ড্রাইভ, বা থার্ড-পার্টি ক্লাউড পরিষেবা। নির্বাচনের পরে, কন্ট্রোলার URL-এর একটি অ্যারে ফেরত দেয় যা অ্যাপ সেশনের সময় পড়তে পারে। অ্যাপ বন্ধ হওয়ার পরে অ্যাক্সেস ধরে রাখতে, আপনাকে startAccessingSecurityScopedResource() কল করতে হবে এবং UserDefaults-এ একটি সিকিউরিটি-স্কোপড বুকমার্ক সংরক্ষণ করতে হবে।
let picker = UIDocumentPickerViewController(
forOpeningContentTypes: [.data, .image],
asCopy: true
)
picker.delegate = self
func documentPicker(
controller: UIDocumentPickerViewController,
didPickDocumentsAt urls: [URL]
) {
guard let url = urls.first else { return }
let data = try Data(contentsOf: url)
}
প্যারামিটার asCopy: true মানে iOS ফাইলটি অ্যাপের Sandbox কন্টেইনারে কপি করবে, এবং অ্যাপ মূল ফাইল থেকে স্বাধীন নিজস্ব কপি পাবে। যদি asCopy: false নির্দিষ্ট করা হয়, অ্যাপ মূল ফাইলের একটি রেফারেন্স পায়, কিন্তু এটি অ্যাক্সেস করতে url.startAccessingSecurityScopedResource() কল করতে হবে। এই কল ছাড়া, ফাইল পড়া একটি ব্যতিক্রম সৃষ্টি করবে। ফাইল নিয়ে কাজ শেষ করার পরে, রিসোর্স মুক্ত করতে এবং ডিস্ক্রিপ্টর লিক প্রতিরোধ করতে সর্বদা url.stopAccessingSecurityScopedResource() কল করুন।
বাহ্যিক স্টোরেজের নিরাপত্তা অভ্যন্তরীণ স্টোরেজের চেয়ে কম কারণ ফাইলগুলি অন্যান্য অ্যাপের জন্য অ্যাক্সেসযোগ্য। READ_EXTERNAL_STORAGE অনুমতি সহ যেকোনো অ্যাপ SD কার্ডের সমস্ত ফাইল পড়তে পারে, যার মধ্যে আপনার অ্যাপ সংবেদনশীল ডেটা অস্থায়ীভাবে সংরক্ষণের জন্য তৈরি করেছে। একটি দূষিত অ্যাপ SD কার্ড স্ক্যান করতে পারে এবং ব্যবহারকারীর ডেটা বের করতে পারে যদি তা এনক্রিপ্ট করা না থাকে। তাই, বাহ্যিক স্টোরেজে প্লেইন টেক্সটে প্রমাণীকরণ টোকেন, পাসওয়ার্ড বা ব্যবহারকারীর ব্যক্তিগত ডেটা সংরক্ষণ করার দৃঢ়ভাবে সুপারিশ করা হয় না।
Android 10+ এ, Scoped Storage শেয়ার্ড ফাইল সিস্টেমে অ্যাপের অ্যাক্সেস উল্লেখযোগ্যভাবে সীমাবদ্ধ করে। একটি অ্যাপ অনুমতি ছাড়া শুধুমাত্র নিজের তৈরি করা ফাইল পড়তে পারে, এবং অন্যান্য অ্যাপের ফাইল অ্যাক্সেস করতে SAF ডায়ালগের মাধ্যমে স্পষ্ট ব্যবহারকারীর সম্মতি প্রয়োজন। তবে, এই সীমাবদ্ধতা 29-এর নিচে টার্গেট SDK সংস্করণের অ্যাপের ক্ষেত্রে প্রযোজ্য নয় — তারা পুরানো মডেলের অধীনে কাজ করতে থাকে, যা ব্যবহারকারীদের জন্য ঝুঁকি তৈরি করে যারা তাদের অ্যাপ আপডেট করেনি। Google Play 2021 থেকে সমস্ত নতুন এবং আপডেট করা অ্যাপের জন্য targetSdkVersion 29+ প্রয়োজন।
ফরম্যাটিং এবং এনক্রিপশন নিরাপত্তার আরেকটি গুরুত্বপূর্ণ দিক। পোর্টেবল স্টোরেজ হিসাবে ফরম্যাট করা SD কার্ড ডিফল্টরূপে সিস্টেম দ্বারা এনক্রিপ্ট করা হয় না। অ্যাডপ্টেবল স্টোরেজ ব্যবহার করার সময়ও, এনক্রিপশন শুধুমাত্র তখনই সক্রিয় হয় যদি ডিভাইস প্রস্তুতকারক ফার্মওয়্যারে এই বৈশিষ্ট্যটি সক্ষম করে থাকে। বাহ্যিক স্টোরেজে সংরক্ষিত সংবেদনশীল ডেটা সুরক্ষিত করতে, AndroidX Security থেকে EncryptedFile লাইব্রেরি ব্যবহার করুন, যা সিস্টেম এনক্রিপশন নির্বিশেষে AES256-GCM ব্যবহার করে প্রতিটি ফাইল আলাদাভাবে এনক্রিপ্ট করে।
বাহ্যিক স্টোরেজের কার্যকর ব্যবহার ডেটা প্রাপ্যতা এবং নিরাপত্তার মধ্যে ভারসাম্য প্রয়োজন। ব্যবহারকারীর ফাইলের নির্ভরযোগ্য স্টোরেজ নিশ্চিত করতে এই নিয়মগুলি অনুসরণ করুন।
Environment.getExternalStorageState() ব্যবহার করুন। কার্ড সরানো, ক্ষতিগ্রস্ত বা লেখার জন্য অনুপলব্ধ হতে পারেএটা মনে রাখা গুরুত্বপূর্ণ যে বাহ্যিক স্টোরেজ ব্যর্থতার সময় ডেটা অখণ্ডতার গ্যারান্টি দেয় না। SD কার্ডের পুনর্লিখন চক্রের সীমিত সংখ্যা রয়েছে, বিশেষ করে Class 4 এবং Class 6-এর বাজেট মডেল। তীব্র লেখার সাথে (উদাহরণস্বরূপ, লগিং বা স্ট্রিমিং ডেটা ক্যাশিং), একটি কার্ড কয়েক মাসের মধ্যে ব্যর্থ হতে পারে। এই ধরনের পরিস্থিতির জন্য, অভ্যন্তরীণ মেমরি বা ক্লাউড স্টোরেজ ব্যবহার করুন এবং বাহ্যিক স্টোরেজে শুধুমাত্র সেই ফাইলগুলি সংরক্ষণ করুন যার ক্ষতি ব্যবহারকারী গ্রহণযোগ্য বিবেচনা করবে। StatFs-এর মাধ্যমে নিয়মিত SD কার্ডের অবস্থা পরীক্ষা করুন এবং ব্যবহারকারীকে গুরুত্বপূর্ণ ফাইল সিস্টেম ত্রুটি সম্পর্কে জানান।
সচরাচর জিজ্ঞাসিত প্রশ্ন
Android 13+ এ, READ_EXTERNAL_STORAGE অনুমতি আরও গ্রানুলার অনুমতি দ্বারা প্রতিস্থাপিত হয়েছে: READ_MEDIA_IMAGES, READ_MEDIA_VIDEO এবং READ_MEDIA_AUDIO। অন্যান্য ফাইলের ধরনের জন্য, SAF ব্যবহার করুন।
হ্যাঁ, adoptable storage বৈশিষ্ট্যটি Android 6.0+ এ উপলব্ধ। কার্ডটি AES-128 এনক্রিপশন সহ ext4 এ ফরম্যাট হয়। তবে, অনেক প্রস্তুতকারক এই বিকল্পটি নিষ্ক্রিয় করে, এবং প্রায় 88% ডিভাইস অ্যাডপ্টেবল স্টোরেজ সমর্থন করে না।
Environment.getExternalStorageState() পদ্ধতি ব্যবহার করুন, যা একটি অবস্থা স্ট্রিং ফেরত দেয়। মান MEDIA_MOUNTED মানে কার্ড পড়া এবং লেখার জন্য উপলব্ধ। অন্যান্য মান ত্রুটি বা কার্ডের অনুপস্থিতি নির্দেশ করে।
Scoped Storage অ্যাপকে তার নিজস্ব কন্টেইনার এবং শেয়ার্ড MediaStore মিডিয়া গ্যালারিতে সীমাবদ্ধ করে। পূর্ণ অ্যাক্সেস ডিভাইসের যেকোনো ফাইল পড়ার অনুমতি দেয়। Scoped Storage ব্যবহারকারীর ডেটার নিরাপত্তা বাড়ায় এবং নতুন অ্যাপের জন্য বাধ্যতামূলক।
ACTION_OPEN_DOCUMENT_TREE অ্যাকশন সহ একটি Intent চালু করুন, যা একটি সিস্টেম ডিরেক্টরি নির্বাচক ডায়ালগ খুলবে। নির্বাচনের পরে, আপনি রিবুট পর্যন্ত বৈধ একটি URI অনুমতি পান। পরবর্তী ব্যবহারের জন্য এই URI SharedPreferences-এ সংরক্ষণ করুন।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন