遍歷 /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 即為剛掛載的設備路徑,無需猜測
}
}
READ_EXTERNAL_STORAGE 才能訪問掛載路徑。/storage/XXXX-XXXX (UUID 格式),不再固定 /mnt/usbhost1。StorageVolume API (API 24+) 獲取可見存儲卷列表及類型(isRemovable()、isPrimary())。**推薦監聽 ACTION_MEDIA_MOUNTED 廣播實時獲取路徑**,而非靜態掃描猜測。舊設備兼容可保留啟發式掃描作為備選。