Nic*_*las 0 usb android mount android-sdcard
我已经找到了如何使用以下任一答案获取所有存储:使用 proc/mounts和使用 mount 命令,但现在我想在返回的路径上命名。我对内部存储没有问题,但是这些方法无法区分 SD 卡和 U 盘。如果它看到连接了两个驱动器,我如何确定哪个是 SD 卡,哪个是 USB,或者它们是两个 SD 卡?还是两个U盘?
我找到了解决方案的一部分,但是我不会再进一步了,因为它变得越来越复杂,而且无论如何这都不是我的应用程序的主要功能。
public static class Storage extends File {
public static final int INTERNAL_STORAGE = 1;
public static final int SD_CARD = 2;
public static final int USB_DRIVE = 3;
public String name;
public int type;
public Storage(String path, String name, int type) {
super(path);
this.name = name;
this.type = type;
}
}
public static ArrayList<Storage> getStorages(Context context) {
ArrayList<Storage> storages = new ArrayList<>();
// Internal storage
storages.add(new Storage(Environment.getExternalStorageDirectory().getPath(),
"Internal Storage", Storage.INTERNAL_STORAGE));
// SD Cards
ArrayList<File> extStorages = new ArrayList<>();
extStorages.addAll(Arrays.asList(context.getExternalFilesDirs(null)));
extStorages.remove(0); // Remove internal storage
String secondaryStoragePath = System.getenv("SECONDARY_STORAGE");
for (int i = 0; i < extStorages.size(); i++) {
String path = extStorages.get(i).getPath().split("/Android")[0];
if (Environment.isExternalStorageRemovable(extStorages.get(i)) || secondaryStoragePath != null && secondaryStoragePath.contains(path)) {
String name = "SD Card" + (i == 0 ? "" : " " + String.valueOf(i+1));
storages.add(new Storage(path, name, Storage.SD_CARD));
}
}
// USB Drives
ArrayList<String> drives = new ArrayList<>();
String reg = "(?i).*vold.*(vfat|ntfs|exfat|fat32|ext3|ext4).*rw.*";
String s = "";
try {
final Process process = new ProcessBuilder().command("mount")
.redirectErrorStream(true).start();
process.waitFor();
final InputStream is = process.getInputStream();
final byte[] buffer = new byte[1024];
while (is.read(buffer) != -1) {
s += new String(buffer);
}
is.close();
} catch (final Exception e) {
e.printStackTrace();
}
final String[] lines = s.split("\n");
for (String line : lines) {
if (!line.toLowerCase(Locale.US).contains("asec") && line.matches(reg)) {
String[] parts = line.split(" ");
for (String path : parts) {
if (path.startsWith(File.separator) && !path.toLowerCase(Locale.US).contains("vold")) {
drives.add(path);
}
}
}
}
// Remove SD Cards from found drives (already found)
ArrayList<String> ids = new ArrayList<>();
for (Storage st : storages) {
String[] parts = st.getPath().split(File.separator);
ids.add(parts[parts.length-1]);
}
for (int i = drives.size() - 1; i >= 0; i--) {
String[] parts = drives.get(i).split(File.separator);
String id = parts[parts.length-1];
if (ids.contains(id)) drives.remove(i);
}
// Get USB Drive name
UsbManager usbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
Collection<UsbDevice> dList = usbManager.getDeviceList().values();
ArrayList<UsbDevice> deviceList = new ArrayList<>();
deviceList.addAll(dList);
for (int i = 0; i < deviceList.size(); i++) {
storages.add(new Storage(drives.get(i), deviceList.get(i).getProductName(), Storage.USB_DRIVE));
}
return storages;
}
Run Code Online (Sandbox Code Playgroud)
我没有用我以外的任何其他设备对此进行测试,它可能不适用于所有设备。此外,键盘或鼠标也可能被视为已连接的设备,这会搞砸整个事情。