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

Android 判斷 USB 存儲設備掛載路徑並區分 U 盤與 TF 卡

     編輯:程式設計綜合問答

核心思路

遍歷 /mnt 或 /storage 目錄,排除主 SD 卡,根據設備節點名稱關鍵字(usb、udisk、sda)判斷 U 盤;但**不同廠商路徑命名不統一**,無絕對可靠的純 Java 方法。

常用啟發式代碼

public static String findUsbStoragePath() {
    File[] mounts = new File("/mnt").listFiles(); // 或 /storage
    if (mounts == null) return null;
    String primarySd = Environment.getExternalStorageDirectory().getAbsolutePath();
    for (File mount : mounts) {
        String path = mount.getAbsolutePath();
        if (path.equalsIgnoreCase(primarySd)) continue; // 排除主 SD
        String name = mount.getName().toLowerCase();
        if (name.contains("usb") || name.contains("udisk") || name.contains("sda") || name.contains("usbhost")) {
            return path; // 極大概率是 U 盤
        }
    }
    return null;
}

更可靠方案:監聽廣播獲取真實路徑

// 在 BroadcastReceiver 中
@Override
public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();
    if (Intent.ACTION_MEDIA_MOUNTED.equals(action)) {
        Uri uri = intent.getData(); // file:///mnt/usbhost1
        String path = uri.getPath(); // /mnt/usbhost1
        // 此時 path 即為剛掛載的設備路徑,無需猜測
    }
}

Android 6.0+ (Marshmallow) 注意

  • 動態權限:需 READ_EXTERNAL_STORAGE 才能訪問掛載路徑。
  • 掛載點統一遷移至 /storage/XXXX-XXXX (UUID 格式),不再固定 /mnt/usbhost1。
  • 使用 StorageVolume API (API 24+) 獲取可見存儲卷列表及類型(isRemovable()、isPrimary())。

總結

**推薦監聽 ACTION_MEDIA_MOUNTED 廣播實時獲取路徑**,而非靜態掃描猜測。舊設備兼容可保留啟發式掃描作為備選。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved