บทนำ
ตัวอย่างนี้สาธิตวิธีตรวจสอบว่า External Storage (SD Card / USB OTG) ถูก Mount และพร้อมใช้งานอยู่หรือไม่ โดยใช้ Environment.getExternalStorageState()
ขั้นตอนที่ 1: สร้างโปรเจกต์
Android Studio → File → New Project → Empty Activity
ขั้นตอนที่ 2: Layout (activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:app="https://schemas.android.com/apk/res-auto"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
tools:context=".MainActivity">
<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textSize="30sp" />
</LinearLayout>
ขั้นตอนที่ 3: โค้ดหลัก (MainActivity.java)
package com.example.myapplication;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
TextView textView;
@RequiresApi(api = Build.VERSION_CODES.N)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.text);
String state = Environment.getExternalStorageState();
// ตรวจสอบสถานะ MEDIA_MOUNTED (พร้อมอ่าน/เขียน)
if (Environment.MEDIA_MOUNTED.equals(state)) {
textView.setText("Media Mounted - Ready to read/write");
} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
textView.setText("Media Mounted Read Only");
} else {
textView.setText("Media State: " + state);
}
}
@Override
protected void onStop() {
super.onStop();
}
@Override
protected void onResume() {
super.onResume();
}
}
ผลลัพธ์

ค่าสถานะ External Storage (Environment.MEDIA_*)
| Constant | ค่า | ความหมาย |
|---|---|---|
| MEDIA_MOUNTED | "mounted" | พร้อมอ่าน/เขียนปกติ |
| MEDIA_MOUNTED_READ_ONLY | "mounted_ro" | อ่านได้อย่างเดียว (Write Protected) |
| MEDIA_UNMOUNTED | "unmounted" | ไม่ได้ Mount / ไม่มีการ์ด |
| MEDIA_CHECKING | "checking" | กำลังตรวจสอบ Disk |
| MEDIA_NOFS | "nofs" | ไม่มี File System / Raw |
| MEDIA_REMOVED | "removed" | ถอดการ์ดออกแล้ว |
| MEDIA_BAD_REMOVAL | "bad_removal" | ถอดการ์ดขณะเขียนข้อมูล (เสี่ยงเสียหาย) |
| MEDIA_UNMOUNTABLE | "unmountable" | Mount ไม่ได้ (Filesystem Corrupt) |
| MEDIA_SHARED | "shared" | ถูก Mount เป็น USB Mass Storage (Legacy) |
⚠️ ข้อจำกัดสำคัญ (Scoped Storage - Android 10+)
- Android 10 (API 29):
getExternalStorageState()ยังทำงานได้ แต่เข้าถึงไฟล์จำกัด - Android 11 (API 30) ขึ้นไป: แอปเข้าถึงได้เฉพาะ App-Specific Directory (
Android/data/pkg/) และ Media (ผ่าน MediaStore) - MANAGE_EXTERNAL_STORAGE: Permission พิเศษสำหรับ File Manager/Backup App (ต้องขออนุมัติผู้ใช้)
- USB OTG: ต้องใช้
StorageVolumeและStorageManagerสำหรับการจัดการ Volume หลายตัว
โค้ดสมัยใหม่ (Android 10+) - StorageVolume
StorageManager sm = (StorageManager) getSystemService(STORAGE_SERVICE); Listvolumes = sm.getStorageVolumes(); for (StorageVolume volume : volumes) { String state = volume.getState(); // MEDIA_MOUNTED, etc. File dir = volume.getDirectory(); // Root path of volume boolean isPrimary = volume.isPrimary(); boolean isRemovable = volume.isRemovable(); long capacity = volume.getMaxFileSize(); // Approx Log.d("Storage", "Volume: " + dir + " State: " + state + " Removable: " + isRemovable); }
สรุป
ใช้ Environment.getExternalStorageState() สำหรับตรวจสอบสถานะพื้นฐาน แต่บน Android 10+ ควรย้ายมาใช้ StorageManager + StorageVolume และ respecte Scoped Storage โดยใช้ App-Specific Directory หรือ MediaStore แทนการเข้าถึง Root ของ External Storage โดยตรง