首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android SD 卡掛載狀態判斷邏輯錯誤修正

     編輯:程式設計綜合問答

問題現象

已在 Manifest 宣告 WRITE_EXTERNAL_STORAGE 權限,但判斷 SD 卡狀態時總顯示 SDcard mounted RO (唯讀)。

錯誤代碼


String extState = Environment.getExternalStorageState();

if (!extState.equals(Environment.MEDIA_MOUNTED)) {
    Log.d("TAG", "SDcard not mounted");
} else if (!extState.equals(Environment.MEDIA_MOUNTED_READ_ONLY)) { // 錯誤:邏輯反了
    Log.d("TAG", "SDcard mounted RO"); // 非唯讀卻印 RO
} else {
    Log.d("TAG", "SDcard mounted RW");
}

錯誤分析

!extState.equals(MEDIA_MOUNTED_READ_ONLY) 表示「狀態**不等於**唯讀」,此時應顯示 RW (可讀寫),但代碼卻印「RO」。邏輯條件與輸出訊息不符。

正確判斷邏輯


String state = Environment.getExternalStorageState();

if (Environment.MEDIA_MOUNTED.equals(state)) {
    // 可讀寫
    Log.d("TAG", "SDcard mounted RW");
} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
    // 唯讀
    Log.d("TAG", "SDcard mounted RO");
} else if (Environment.MEDIA_UNMOUNTED.equals(state)) {
    // 未掛載
    Log.d("TAG", "SDcard not mounted");
} else {
    // 其他狀態: MEDIA_CHECKING, MEDIA_NOFS, MEDIA_MOUNTED_READ_ONLY, MEDIA_SHARED, MEDIA_BAD_REMOVAL, MEDIA_REMOVED
    Log.d("TAG", "SDcard state: " + state);
}

所有儲存狀態常數對照

常數含義可讀可寫
MEDIA_MOUNTED正常掛載✓✓
MEDIA_MOUNTED_READ_ONLY唯讀掛載✓✗
MEDIA_UNMOUNTED未掛載/移除✗✗
MEDIA_CHECKING檢查中✗✗
MEDIA_NOFS無檔案系統✗✗
MEDIA_SHARED作為 USB 大容量儲存共享✗✗
MEDIA_BAD_REMOVAL未正常移除✗✗
MEDIA_REMOVED物理移除✗✗

實用工具方法


public static boolean isExternalStorageWritable() {
    return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState());
}

public static boolean isExternalStorageReadable() {
    String state = Environment.getExternalStorageState();
    return Environment.MEDIA_MOUNTED.equals(state) || 
           Environment.MEDIA_MOUNTED_READ_ONLY.equals(state);
}

// 取得可用的外部儲存目錄 (App 專屬,無需權限 API 19+)
public static File getAppExternalDir(Context context, String type) {
    return context.getExternalFilesDir(type); // 自動處理權限、清理
}

現代最佳實踐 (API 19+)

  • 優先使用 Context.getExternalFilesDir() / getExternalCacheDir():App 專屬目錄,**無需權限**、卸載 App 自動刪除
  • 共享檔案用 MediaStore / Storage Access Framework (ACTION_OPEN_DOCUMENT)
  • 避免直接操作 Environment.getExternalStorageDirectory() (Android 10+ 受限)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved