স্টোরেজ উপলব্ধতা যাচাই: StatFs এবং Formatter ব্যবহার
এই টিউটোরিয়ালটি দেখাবে কীভাবে ডিভাইসের ইন্টারন্যাল এবং এক্সটার্নাল স্টোরেজের মোট এবং উপলব্ধ স্পেস বাইট এবং হিউম্যান-রিডেবল ফরম্যাটে পাওয়া যায়।
পদক্ষেপ ১: প্রজেক্ট তৈরি করুন
Android Studio-তে নতুন প্রজেক্ট তৈরি করুন।
পদক্ষেপ ২: লেআউট XML (activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
android:padding="8dp"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="24sp"
android:textStyle="bold"
android:textAlignment="center" />
</LinearLayout>
পদক্ষেপ ৩: MainActivity.java
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Environment;
import android.os.StatFs;
import android.text.format.Formatter;
import android.widget.TextView;
import java.io.File;
public class MainActivity extends AppCompatActivity {
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.textView);
// ১. এক্সটার্নাল স্টোরেজ (পাবলিক)
File externalStorage = Environment.getExternalStorageDirectory();
StatFs statExternal = new StatFs(externalStorage.getPath());
long extTotalBytes = statExternal.getBlockSizeLong() * statExternal.getBlockCountLong();
long extFreeBytes = statExternal.getBlockSizeLong() * statExternal.getAvailableBlocksLong();
// ২. ইন্টারন্যাল স্টোরেজ (অ্যাপ ডেটা পার্টিশন)
File internalStorage = Environment.getDataDirectory();
StatFs statInternal = new StatFs(internalStorage.getPath());
long intTotalBytes = statInternal.getBlockSizeLong() * statInternal.getBlockCountLong();
long intFreeBytes = statInternal.getBlockSizeLong() * statInternal.getAvailableBlocksLong();
// ৩. ফরম্যাটেড আউটপুট
String extTotal = Formatter.formatFileSize(this, extTotalBytes);
String extFree = Formatter.formatFileSize(this, extFreeBytes);
String intTotal = Formatter.formatFileSize(this, intTotalBytes);
String intFree = Formatter.formatFileSize(this, intFreeBytes);
String result = String.format(
"External Storage:\nTotal: %s\nFree: %s\n\nInternal Storage:\nTotal: %s\nFree: %s",
extTotal, extFree, intTotal, intFree
);
textView.setText(result);
}
}
গুরুত্বপূর্ণ পারমিশন ও সীমাবদ্ধতা
- Android 10 (API 29) না əvvəl: `READ_EXTERNAL_STORAGE` পারমিশন দরকার `getExternalStorageDirectory()`-র জন্য।
- Android 10 (API 29): `requestLegacyExternalStorage="true"` ম্যানিফেস্টে অ্যাপ্লিকেশন ট্যাগে (টেম্পোরারি)।
- Android 11 (API 30+): Scoped Storage বাধ্যতামূলক। শুধু `getExternalFilesDir(null)` (অ্যাপ-স্পেসিফিক) এবং MediaStore এক্সেসযোগ্য।
আধুনিক পদ্ধতি: StorageManager (API 24+)
StorageManager storageManager = (StorageManager) getSystemService(STORAGE_SERVICE); Listvolumes = storageManager.getStorageVolumes(); StringBuilder sb = new StringBuilder(); for (StorageVolume volume : volumes) { sb.append(volume.getDescription(this)).append("\n"); sb.append("Primary: ").append(volume.isPrimary()).append("\n"); sb.append("Removable: ").append(volume.isRemovable()).append("\n"); sb.append("UUID: ").append(volume.getUuid()).append("\n"); if (volume.isPrimary()) { try { long freeBytes = volume.createOpenDocumentTree().getFreeSpace(); sb.append("Free: ").append(Formatter.formatFileSize(this, freeBytes)).append("\n"); } catch (IOException e) { e.printStackTrace(); } } sb.append("\n"); } textView.setText(sb.toString());
Formatter.formatFileSize() আউটপুট উদাহরণ
- 1024 → "1 KB"
- 1048576 → "1 MB"
- 1073741824 → "1 GB"
- লোকেল-অוয়েয়ার (বাংলা লোকেলে "১ GB" দেখাবে)
ব্যবহারের পরিস্থিতি
- বড় ফাইল ডাউনলোড/রেকর্ড করার আগে স্পেস চেক
- ক্যাশ ক্লিয়ার সুপারিশ দেখানো
- স্টোরেজ Анаলিটিক্স ড্যাশবোর্ড