Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Android

วิธีตรวจสอบสถานะ USB Mount (External Storage) ใน Android

บทนำ

ตัวอย่างนี้สาธิตวิธีตรวจสอบว่า 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();
    }
}

ผลลัพธ์

วิธีตรวจสอบสถานะ USB Mount (External Storage) ใน Android

ค่าสถานะ 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);
List volumes = 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 โดยตรง