কম্পিউটার টিউটোরিয়াল

কোটলিন ব্যবহার করে অ্যান্ড্রয়েড ডিভাইসে উপলব্ধ স্টোরেজ স্পেস চেক করা

ওভারভিউ

এই টিউটোরিয়ালটি দেখায় কিভাবে 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)।
  1. Android-এ ConcurrentLinkedDeque-এ এলিমেন্ট উপস্থিত কিনা যাচাই করার পদ্ধতি

  2. Kotlin ব্যবহার করে Android-এ JSON অবজেক্ট পার্স করা

  3. Kotlin ব্যবহার করে Android অ্যাপ ব্যাকগ্রাউন্ডে চলছে কিনা চেক করা

  4. অ্যান্ড্রয়েডে কোটলিন ব্যবহার করে GridView স্ক্রোলিং নিষ্ক্রিয় করার উপায়