ওভারভিউ
এই টিউটোরিয়ালটি দেখায় কিভাবে StatFs এবং Environment ক্লাস ব্যবহার করে অ্যান্ড্রয়েড ডিভাইসের এক্সটার্নাল (SD কার্ড/ইন্টারন্যাল শেয়ার্ড) এবং ইন্টারন্যাল স্টোরেজের উপলব্ধ স্পেস বের করা যায়।
পূর্বশর্ত
- অ্যান্ড্রয়েড স্টুডিও (কোটলিন)
- READ_EXTERNAL_STORAGE পারমিশন (Android 10+ এ Scoped Storage এর কারণে সীমিত)
ধাপ ১: প্রজেক্ট তৈরি করুন
File → New Project → Empty Activity → Language: Kotlin।
ধাপ ২: লেআউট (res/layout/activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="50dp"
android:text="Tutorials Point"
android:textAlignment="center"
android:textColor="@android:color/holo_green_dark"
android:textSize="32sp"
android:textStyle="bold" />
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textAlignment="center"
android:textSize="24sp"
android:textStyle="bold" />
</RelativeLayout>
ধাপ ৩: MainActivity.kt
package com.example.storagespace
import android.os.Bundle
import android.os.Environment
import android.os.StatFs
import android.text.format.Formatter
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import java.io.File
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
title = "KotlinApp"
val textView: TextView = findViewById(R.id.textView)
// ১. এক্সটার্নাল স্টোরেজ (প্রাইমারি শেয়ার্ড স্টোরেজ)
val stat = StatFs(Environment.getExternalStorageDirectory().path)
val totalBytes = stat.blockSize.toLong() * stat.blockCount.toLong()
val availableBytes = stat.blockSize.toLong() * stat.availableBlocks.toLong()
// ২. ইন্টারন্যাল স্টোরেজ (অ্যাপ-স্পেসিফিক)
val dataPath = Environment.getDataDirectory().absolutePath
val stat2 = StatFs(dataPath)
val internalAvailable = stat2.availableBlocks.toLong() * stat2.blockSize.toLong()
// ৩. মানব-পাঠযোগ্য ফরম্যাটে দেখান
val externalAvailStr = Formatter.formatFileSize(this, availableBytes)
val internalAvailStr = Formatter.formatFileSize(this, internalAvailable)
val totalStr = Formatter.formatFileSize(this, totalBytes)
textView.text = "External Storage:\nAvailable: $externalAvailStr / Total: $totalStr\n\nInternal Storage:\nAvailable: $internalAvailStr"
}
}
ধাপ ৪: AndroidManifest.xml (পারমিশন - Android 9 এবং নিচের জন্য)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="com.example.storagespace">
<!-- Android 9 (API 28) এবং নিচের জন্য -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
চলান ও ফলাফল
আউটপুট উদাহরণ:
External Storage: Available: 12.5 GB / Total: 64 GB Internal Storage: Available: 8.2 GB
গুরুত্বপূর্ণ পরিবর্তন (Android 10+ / API 29+)
- Scoped Storage: অ্যাপ শুধু নিজের ফোল্ডার (
getExternalFilesDir()) অ্যাক্সেস করতে পারে। Environment.getExternalStorageDirectory()ডিপ্রিকেটেড (API 29+), কিন্তু এখনও কাজ করে (লিগ্যাসি)।- সর্বোত্তম পদ্ধতি:
context.getExternalFilesDirs(null)ব্যবহার করুন।
আধুনিক পদ্ধতি (StorageManager / StorageStatsManager)
// API 24+ ( Nougat) val storageManager = getSystemService(Context.STORAGE_SERVICE) as StorageManager val uuid = storageManager.getUuidForPath(filesDir) val stats = storageManager.getStorageBytes(uuid) // total, free, app-specific
Formatter.formatFileSize()
বাইটকে মানব-পাঠযোগ্য ফরম্যাটে (KB, MB, GB) রূপান্তর করে। লোকেল অনুযায়ী একক ব্যবহায়।
সতর্কতা
- Android 11+ এ
MANAGE_EXTERNAL_STORAGEপারমিশন ছাড়া পুরো এক্সটার্নাল স্টোরেজ স্ক্যান করা যায় না। - ইন্টারন্যাল স্টোরেজ = অ্যাপের প্রাইভেট ডেটা ডিরেক্টরি (
/data/data/pkg)। - এক্সটার্নাল স্টোরেজ = শেয়ার্ড স্টোরেজ (
/sdcard,/storage/emulated/0)।