Съемный накопитель (внешний) путь sdcard по производителям
Я гуглил, но оооочень трудно определить, какие производители / модели используют какой путь для SDCard/ внешнего хранилища.
- Я НЕ говорю о внутреннем пути хранения, который можно найти с помощью:
Environment.getExternalStorageDirectory()
я знаю это getExternalStorageDirectory()
иногда указывает на внешнюю SDCard на некоторых устройствах.
Вот что я нашел некоторый общий путь для внешнего пути (не уверен, какой производитель использует какой путь):
/emmc
/mnt/sdcard/external_sd
/mnt/external_sd
/sdcard/sd
/mnt/sdcard/bpemmctest
/mnt/sdcard/_ExternalSD
/mnt/sdcard-ext
/mnt/Removable/MicroSD
/Removable/MicroSD
/mnt/external1
/mnt/extSdCard
/mnt/extsd
/mnt/usb_storage <-- usb flash mount
/mnt/extSdCard <-- usb flash mount
/mnt/UsbDriveA <-- usb flash mount
/mnt/UsbDriveB <-- usb flash mount
Это то, что я нашел в Google.
Мне нужно сканировать весь внутренний + внешний накопитель + USB-накопитель, чтобы найти определенный файл. Если я пропустил какой-либо путь, пожалуйста, добавьте в приведенный выше список. Если кто-то знает пути, используемые каждым из производителей, пожалуйста, поделитесь с нами.
5 ответов
Хорошие новости! В KitKat теперь есть открытый API для взаимодействия с этими вторичными общими устройствами хранения.
Новый Context.getExternalFilesDirs()
а также Context.getExternalCacheDirs()
методы могут возвращать несколько путей, включая как первичные, так и вторичные устройства. Затем вы можете перебрать их и проверить Environment.getStorageState()
а также File.getFreeSpace()
определить лучшее место для хранения ваших файлов. Эти методы также доступны на ContextCompat
в библиотеке поддержки-v4.
Также обратите внимание, что если вы заинтересованы только в использовании каталогов, возвращаемых Context
вам больше не нужно READ_
или же WRITE_EXTERNAL_STORAGE
разрешения. В дальнейшем у вас всегда будет доступ на чтение / запись к этим каталогам без дополнительных разрешений.
Приложения также могут продолжать работать на старых устройствах, отменив запрос на разрешение, например, так:
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="18" />
Я также начал со списка, подобного вашему, откуда-то (извините, не смог найти исходный источник) и продолжаю добавлять некоторые пути, собранные из отзывов пользователей. Есть дубликаты в приведенном выше списке.
/storage/sdcard1 //!< Motorola Xoom
/storage/extsdcard //!< Samsung SGS3
/storage/sdcard0/external_sdcard // user request
/mnt/extsdcard
/mnt/sdcard/external_sd //!< Samsung galaxy family
/mnt/external_sd
/mnt/media_rw/sdcard1 //!< 4.4.2 on CyanogenMod S3
/removable/microsd //!< Asus transformer prime
/mnt/emmc
/storage/external_SD //!< LG
/storage/ext_sd //!< HTC One Max
/storage/removable/sdcard1 //!< Sony Xperia Z1
/data/sdext
/data/sdext2
/data/sdext3
/data/sdext4
/sdcard1 //Sony Xperia Z
/sdcard2 //HTC One M8s
/storage/microsd //ASUS ZenFone 2
Для того, что вы хотите достичь (сканирование всех возможных путей для определенных файлов), я думаю, что это совершенно невозможно сделать (используя список известных путей). Некоторые пути на одном устройстве даже изменились между обновлениями Android.
Основываясь на предоставленных путях Oceanuz, я написал метод, который находит путь к внешнему хранилищу (игнорируя регистр) и возвращает его в виде строки.
Примечание: я использовал библиотеку StreamSupport в своем методе, поэтому, чтобы она работала, вам нужно скачать файл jar и добавить его в папку libs в вашем проекте, и все.
public static String getExternalSdPath(Context context) {
List<String> listOfFoldersToSearch = Arrays.asList("/storage/", "/mnt/", "/removable/", "/data/");
List<String> listOf2DepthFolders = Arrays.asList("sdcard0", "media_rw", "removable");
List<String> listOfExtFolders = Arrays.asList("sdcard1", "extsdcard", "external_sd", "microsd", "emmc", "ext_sd", "sdext",
"sdext1", "sdext2", "sdext3", "sdext4");
final String[] thePath = {""};
Optional<File> optional = StreamSupport.stream(listOfFoldersToSearch)
.filter(s -> {
File folder = new File(s);
return folder.exists() && folder.isDirectory();
}) //I got the ones that exist and are directories
.flatMap(s -> {
try {
List<File> files = Arrays.asList(new File(s).listFiles());
return StreamSupport.stream(files);
} catch (NullPointerException e) {
return StreamSupport.stream(Collections.emptyList());
}
}) //I got all sub-dirs of the main folders
.flatMap(file1 -> {
if (listOf2DepthFolders.contains(file1.getName().toLowerCase())) {
try {
List<File> files = Arrays.asList(file1.listFiles());
return StreamSupport.stream(files);
} catch (NullPointerException e) {
return StreamSupport.stream(Collections.singletonList(file1));
}
} else
return StreamSupport.stream(Collections.singletonList(file1));
}) //Here I got all the 2 depth and 3 depth folders
.filter(o -> listOfExtFolders.contains(o.getName().toLowerCase()))
.findFirst();
optional.ifPresent(file -> thePath[0] = file.getAbsolutePath());
Log.i("Path", thePath[0]);
return thePath[0];
}
Этот метод возвратит пустую строку, если не найден путь Sd Card.
Я пытался найти путь к моей внешней SD-карте в Sony Xperia XA. Затем я установил ES File Explorer, и он ясно показал путь к любой папке, внутренней или внешней, в ее окне характеристик. Я нашел путь к внешнему SD как /storage/C4EE-F3A3. Я пытался сохранить выходной файл из Python3 на внешнюю SD, но у него не было разрешения на сохранение где-либо, кроме папки Qpython на внутренней SD.
Ты пытался:
Environment.getExternalStoragePublicDirectory.getExternalStorageDirectory(String type);
Где тип - это каталог, определенный Android, который вам нужен, например Environment.DIRECTORY_DOWNLOADS, который даст вам каталог для загрузки.
Это не "getExternalStorageDirectory", это "getExternalStoragePublicDirectory". Обратите внимание, что для каждого устройства Android будет возвращено место, где происходит хранение (например: /mnt/external_sd), работавшее на моем преобразователе 101, нексусе 10 и галактике s2. Мне нужно было скачать файл на хранилище
Вот документация http://developer.android.com/reference/android/os/Environment.html